How to delete history of last 10 commands in shell?
Have you tried editing the history file directly:
~/.bash_history
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
.
With Bash 5 you can now do a range...Hooray!:
history -d 511-520
or counting backwards 10:
history -d -10--1
Excerpt from Bash 5 Man Page:
'history'
Options, if supplied, have the following meanings:
'-d OFFSET' Delete the history entry at position OFFSET. If OFFSET is positive, it should be specified as it appears when the history is displayed. If OFFSET is negative, it is interpreted as relative to one greater than the last history position, so negative indices count back from the end of the history, and an index of '-1' refers to the current 'history -d' command.
'-d START-END' Delete the history entries between positions START and END, inclusive. Positive and negative values for START and END are interpreted as described above.
Here is my solution for Bash 4. It iteratively deletes a single entry or a range of history starting with lowest index.
delHistory () {
count=$(( ${2:-$1} - $1 ))
while [[ $count -ge 0 ]]; do
history -d "$1"
((count--))
done
}
delHistory 511 520
for x in `seq $1 $2`
do
history -d $1
done
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