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)
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 -d
1008然后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)
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)
改变了支撑的迭代器,好的通话.另外,使用反向迭代器调用此函数.
你可以这样做:
#!/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)
注意我没有为边界进行任何错误检查.我将把它作为练习留给读者.
另见这个问题
小智 9
也许对某人有用.
当您登录任何控制台/终端的任何用户时,当前会话的历史记录仅存在于注销时刷新到〜/ .bash_history的某个"缓冲区"中.
因此,为了保密,您可以:
history -r && exit
您将注销所有会话(且仅限)历史记录;)
使用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)
小智 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 上留下的最后一个命令。