如何删除shell中最后10个命令的历史记录?

时间:2013-02-07 12:02:08

标签: linux bash shell terminal

命令如下

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

我可以通过history -d 511删除单个,但是如何使用shell中的单个命令删除最后10个命令以及10个命令之间的历史记录?

我们可以编写一个bash脚本并执行删除历史记录吗?

19 个答案:

答案 0 :(得分:99)

您是否尝试过直接编辑历史文件:

~/.bash_history

答案 1 :(得分:53)

我的回答是基于之前的答案,但添加了逆序,以便从最近到最近删除历史记录项。

获取您当前的历史记录(调整您想要查看的行数):

history | tail -n 10

这给了我类似的东西

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"

选择要删除的项目的开始和结束位置。我要删除条目1006到1008。

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

这将为1008生成history -d命令,然后生成1007,然后生成1006。

如果我还想删除历史删除命令,那么它有点复杂,因为你需要知道当前的最大历史记录条目。

你可以得到这个(可能有更好的方法):

history 1 | awk '{print $1}'

将它们放在一起可以使用它来删除范围,还可以删除历史删除命令:

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

将此全部包含在函数中以添加到~/.bashrc

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

删除命令4,5和6(1049-1051)并隐藏证据的示例:

[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

问题实际上是从历史记录中删除最后10个命令,因此如果您想节省一点功夫,可以使用另一个函数调用histdel函数来为您进行计算。

histdeln(){

  # Get the current history number
  n=$(history 1 | awk '{print $1}')

  # Call histdel with the appropriate range
  histdel $(( $n - $1 )) $(( $n - 1 ))
  }

此函数采用1个参数,即要删除的先前历史记录项的数量。因此,要从历史记录中删除最后10个命令,只需使用histdeln 10

答案 2 :(得分:28)

for x in `seq $1 $2`
do
  history -d $1
done

答案 3 :(得分:13)

结合上面的答案:

history -w vi ~/.bash_history history -r

答案 4 :(得分:10)

首先,输入:history并记下要删除的行号序列。

要清除来自第1800行到第1815行的行,请在终端中写下以下内容:

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

如果要删除删除命令的历史记录,请为1815 = 1816添加+1,并删除该序列的历史记录+删除命令。

例如:

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

答案 5 :(得分:9)

编辑:

改变了支撑的迭代器,好的通话。另外,使用反向迭代器调用此函数。

你可以这样做:

#!/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

你会想到这样的地方:

./nameOfYourScript 563 514

注意我没有对边界进行任何错误检查。我将把它作为练习留给读者。

另见this question

答案 6 :(得分:9)

也许对某人有用。
当您登录任何控制台/终端的任何用户时,当前会话的历史记录仅存在于您注销时刷新到〜/ .bash_history的某个“缓冲区”。
所以,为了保密,你可以: history -r && exit
并且您将注销所有会话(且仅限)历史记录;)

答案 7 :(得分:3)

我使用了此线程中共享的解决方案的组合来擦除命令历史记录中的跟踪。 首先,我使用以下命令验证了保存命令历史记录的位置:

echo $HISTFILE

我通过以下方式编辑了历史记录:

vi <pathToFile>

然后,我使用以下命令刷新当前会话历史记录缓冲区:

history -r && exit

下次进入此会话时,在命令历史记录中看到的最后一条命令是在 pathToFile 上留下的最后一条命令。

答案 8 :(得分:3)

借助Bash 5,您现在可以进行一系列击球了……

history -d 511-520

或倒数10:

history -d -10--1

摘录自Bash 5 Man Page

  

“历史”

     

选项(如果提供)具有以下含义:

     

'-d偏移'       删除位置OFFSET处的历史记录条目。如果OFFSET为       肯定,应指定为       显示历史记录。如果OFFSET为负,则为       解释为相对于上一个历史记录大于一个       位置,因此负索引从       历史记录,而索引“ -1”表示当前的“历史记录”       -d'命令。

     

'-d START-END'       删除位置START和END之间的历史记录条目,       包括的。 START和END的正负值为       如上所述。

这是我对Bash 4的解决方案:

delHistory () {
    count=$(( ${2:-$1} - $1 ))
    while [[ $count -ge 0 ]] ; do
        history -d "$start"
        ((count--))
    done
}

delHistory 511 520

答案 9 :(得分:2)

历史-c将清除所有历史。

答案 10 :(得分:1)

我使用此脚本删除历史记录中的最后10条命令:

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

它使用$HISTCMD环境变量来获取历史记录索引,并使用它来删除history中的最后10个条目。

答案 11 :(得分:1)

history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;history -d 511;

强悍但实用

答案 12 :(得分:1)

不是直接要求的答案,而是问题的根本原因:

您还可以通过在命令前面加上空格字符来阻止命令甚至进入历史记录:

# This command will be in the history
echo Hello world

# This will not
 echo Hello world

答案 13 :(得分:0)

一个简单的函数可以通过数字杀死所有(虽然错误时barfs)

kill_hist() {
    for i in $(echo $@ | sed -e 's/ /\n/g;' | sort -rn | sed -e 's/\n/ /;')
    do
            history -d $i;
    done
}
kill_hist `seq 511 520`
# or kill a few ranges
kill_hist `seq 1001 1010` `seq 1200 1201`

答案 14 :(得分:0)

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

如果要删除10行,只需将N的值更改为10。

答案 15 :(得分:0)

尝试以下操作:

val number = 1.2345
val decimalPlaces = 3

val format = s"%.${decimalPlaces}f"
println(format.format(number)) # 1.235

答案 16 :(得分:0)

我用这个(我有bash 4):

histrm() {
    local num=${1:- 1}
    builtin history -d $(builtin history | sed -rn '$s/^[^[:digit:]]+([[:digit:]]+)[^[:digit:]].*$/\1/p')
    (( num-- )) && $FUNCNAME $num
    builtin history -w
}

builtin history部分和最后一个-w部分是因为我已经安装了著名的tricks to share history across terminals的变体,并且如果没有这些部分,此功能将中断。他们确保调用真正的内置bash history(而不是我自己的包装器),并确保在删除条目后立即将历史记录写入HISTFILE。

但是,这将与“常规”历史记录配置一样工作。

您应该使用要删除的最后一个条目的号码来调用它,例如:

histrm 10

将删除最后10个条目。

答案 17 :(得分:0)

简短但甜美:for i in {1..10}; do history -d $(($HISTCMD-11)); done

答案 18 :(得分:-1)

删除最后10个条目(基于您的示例):

history -d 511 520