How to delete history of last 10 commands in shell?

前端 未结 19 1816
孤城傲影
孤城傲影 2021-01-29 18:47

Commands follows

  511  clear
  512  history
  513  history -d 505
  514  history
  515  history -d 507 510 513
  516  history
  517  history -d 509
  518  hist         


        
相关标签:
19条回答
  • 2021-01-29 19:28

    edit:

    Changed the braced iterators, good call. Also, call this function with a reverse iterator.

    You can probably do something like this:

    #!/bin/bash
    HISTFILE=~/.bash_history   # if you are running it in a 
                               # non interactive shell history would not work else
    set -o history
    for i in `seq $1 $2`;
    do
        history -d $i
    done
    history -w
    

    Where you will evoke like this:

    ./nameOfYourScript 563 514
    

    Notice I haven't put any error checking in for the bounds. I'll leave that as an exercise to the reader.

    see also this question

    0 讨论(0)
  • 2021-01-29 19:29

    Combining answers from above:

    history -w vi ~/.bash_history history -r

    0 讨论(0)
  • 2021-01-29 19:29

    I use this script to delete last 10 commands in history:

    pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done
    

    It uses $HISTCMD environment var to get the history index and uses that to delete last 10 entries in history.

    0 讨论(0)
  • 2021-01-29 19:30

    First, type: history and write down the sequence of line numbers you want to remove.

    To clear lines from let's say line 1800 to 1815 write the following in terminal:

    $ for line in $(seq 1800 1815) ; do history -d 1800; done
    

    If you want to delete the history for the deletion command, add +1 for 1815 = 1816 and history for that sequence + the deletion command will be deleted.

    For example :

    $ for line in $(seq 1800 1816) ; do history -d 1800; done
    
    0 讨论(0)
  • 2021-01-29 19:31

    My answer is based on previous answers, but with the addition of reversing the sequence so that history items are deleted from most recent to least recent.

    Get your current history (adjust the number of lines you want to see):

    history | tail -n 10
    

    This gives me something like

    1003  25-04-2016 17:54:52 echo "Command 1"
    1004  25-04-2016 17:54:54 echo "Command 2"
    1005  25-04-2016 17:54:57 echo "Command 3"
    1006  25-04-2016 17:54:59 echo "Command 4"
    1007  25-04-2016 17:55:01 echo "Command 5"
    1008  25-04-2016 17:55:03 echo "Command 6"
    1009  25-04-2016 17:55:07 echo "Command 7"
    1010  25-04-2016 17:55:09 echo "Command 8"
    1011  25-04-2016 17:55:11 echo "Command 9"
    1012  25-04-2016 17:55:14 echo "Command 10"
    

    Select the start and end positions for the items you want to delete. I'm going to delete entries 1006 to 1008.

    for h in $(seq 1006 1008); do history -d 1006; done
    

    This will generate history -d commands for 1006, then 1007 becomes 1006 and 1006 is deleted, then 1008 (became 1007) is now 1006 and gets deleted.

    If I also wanted to delete the history delete command then it's a bit more complicated because you need to know the current max history entry.

    You can get this with (there may be a better way):

    history 1 | awk '{print $1}'
    

    Putting it together you can use this to delete a range, and also delete the history delete command:

    for h in $(seq 1006 1008); do history -d 1006; done; history -d $(history 1 | awk '{print $1}')
    

    Wrap this all up in a function to add to your ~/.bashrc:

    histdel(){
      for h in $(seq $1 $2); do
        history -d $1
      done
      history -d $(history 1 | awk '{print $1}')
      }
    

    Example deleting command 4, 5 and 6 (1049-1051) and hiding the evidence:

    [18:21:02 jonathag@gb-slo-svb-0221 ~]$ history 11
     1046  25-04-2016 18:20:47 echo "Command 1"
     1047  25-04-2016 18:20:48 echo "Command 2"
     1048  25-04-2016 18:20:50 echo "Command 3"
     1049  25-04-2016 18:20:51 echo "Command 4"
     1050  25-04-2016 18:20:53 echo "Command 5"
     1051  25-04-2016 18:20:54 echo "Command 6"
     1052  25-04-2016 18:20:56 echo "Command 7"
     1053  25-04-2016 18:20:57 echo "Command 8"
     1054  25-04-2016 18:21:00 echo "Command 9"
     1055  25-04-2016 18:21:02 echo "Command 10"
     1056  25-04-2016 18:21:07 history 11
    [18:21:07 jonathag@gb-slo-svb-0221 ~]$ histdel 1049 1051
    [18:21:23 jonathag@gb-slo-svb-0221 ~]$ history 8
     1046  25-04-2016 18:20:47 echo "Command 1"
     1047  25-04-2016 18:20:48 echo "Command 2"
     1048  25-04-2016 18:20:50 echo "Command 3"
     1049  25-04-2016 18:20:56 echo "Command 7"
     1050  25-04-2016 18:20:57 echo "Command 8"
     1051  25-04-2016 18:21:00 echo "Command 9"
     1052  25-04-2016 18:21:02 echo "Command 10"
     1053  25-04-2016 18:21:07 history 11
    

    The question was actually to delete the last 10 commands from history, so if you want to save a little effort you could use another function to call the histdel function which does the calculations for you.

    histdeln(){
    
      # Get the current history number
      n=$(history 1 | awk '{print $1}')
    
      # Call histdel with the appropriate range
      histdel $(( $n - $1 )) $(( $n - 1 ))
      }
    

    This function takes 1 argument, the number of previous history items to delete. So to delete the last 10 commands from history just use histdeln 10.

    0 讨论(0)
  • 2021-01-29 19:31

    Short but sweet: for i in {1..10}; do history -d $(($HISTCMD-11)); done

    0 讨论(0)
提交回复
热议问题