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

Jus*_*ohn 121 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
Run Code Online (Sandbox Code Playgroud)

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

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

Whe*_*ill 106

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

~/.bash_history
Run Code Online (Sandbox Code Playgroud)

  • 重新启动(关闭和重新打开)终端后生效 (7认同)
  • 如果你用vim执行此操作,你可能会在`〜/ .viminfo`中找到你的删除历史记录,所以一定要删除它! (7认同)
  • 有时它保存在内存中,下次登录后不会保留任何手动编辑. (4认同)
  • @FizerKhan我的意思是`.bash_history`中的更改可以被内存中保存的内容覆盖.我发现这个解决方案很有帮助:http://superuser.com/a/384383/253543 (4认同)
  • @WherethereisaWill OP需要一个脚本,而不是手动插件和突突. (2认同)
  • @FizerKhan 这无助于它保存在内存中的事实。历史文件有时会保存在内存中,因此即使您编辑该文件也不会生效.. (2认同)

JGC*_*JGC 65

我的答案是基于之前的答案,但增加了反转序列,以便从最近到最近删除历史项目.

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

history | tail -n 10
Run Code Online (Sandbox Code Playgroud)

这给了我类似的东西

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"
Run Code Online (Sandbox Code Playgroud)

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

for h in $(seq 1006 1008 | tac); do history -d $h; done
Run Code Online (Sandbox Code Playgroud)

这将生成history -d1008然后1007然后1006的命令.

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

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

history 1 | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

删除命令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
Run Code Online (Sandbox Code Playgroud)

问题实际上是从历史记录中删除最后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 ))
  }
Run Code Online (Sandbox Code Playgroud)

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


Bar*_*mar 28

for x in `seq $1 $2`
do
  history -d $1
done
Run Code Online (Sandbox Code Playgroud)

  • @Matthew那不是必要的.我不是每次都在循环中删除`$ x`,我正在删除`$ 1`.因此它首先删除511,512变为511.然后它再次删除511,依此类推. (5认同)
  • 请务必使用较大的数字作为第一个参数,否则您将删除所有其他命令.例如,当删除命令511时,一切都向下移动,因此512成为新的511,513是新的512.因此`history -d 511`按预期工作,然后`history -d 512`删除曾经是513和512的内容.作为命令511保留在历史中.希望这是有道理的. (2认同)

小智 15

结合上面的答案:

history -w vi ~/.bash_history history -r


Gha*_*ein 12

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

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

$ for line in $(seq 1800 1815) ; do history -d 1800; done
Run Code Online (Sandbox Code Playgroud)

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

例如 :

$ for line in $(seq 1800 1816) ; do history -d 1800; done
Run Code Online (Sandbox Code Playgroud)


Tyl*_*eau 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
Run Code Online (Sandbox Code Playgroud)

你会想到这样的地方:

./nameOfYourScript 563 514
Run Code Online (Sandbox Code Playgroud)

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

另见这个问题

  • 在删除510之后,511变为510,512变为511,依此类推.所以这将删除所有其他行. (6认同)

小智 9

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


Dav*_*tch 8

使用Bash 5,您现在可以进行一系列操作了……万岁!

history -d 511-520
Run Code Online (Sandbox Code Playgroud)

或倒数10:

history -d -10--1
Run Code Online (Sandbox Code Playgroud)

Bash 5手册页摘录:

'历史'

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

'-d OFFSET'删除位置OFFSET处的历史记录。如果OFFSET为正,则应指定它在显示历史记录时所显示的样子。如果OFFSET为负,则它被解释为相对于上一个历史位置大一个,因此负索引从历史末尾开始倒数,索引“ -1”表示当前的“ history -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
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但现在我得到“bash:历史:-10:历史位置超出范围”..我什至用“history -d -2”得到这个错误..我想知道为什么。这对我有用..它删除了最后一个条目 `hdl() { History -d $(($HISTCMD - $1))-$(($HISTCMD - 2)) ;}` https://unix.stackexchange.com /a/573258/346155 (3认同)

小智 7

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

您还可以通过在命令前添加空格字符来防止命令进入历史记录:

# This command will be in the history
echo Hello world

# This will not
 echo Hello world
Run Code Online (Sandbox Code Playgroud)


小智 6

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

echo $HISTFILE
Run Code Online (Sandbox Code Playgroud)

我编辑了历史:

vi <pathToFile>
Run Code Online (Sandbox Code Playgroud)

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

history -r && exit
Run Code Online (Sandbox Code Playgroud)

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