命令如下
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脚本并执行删除历史记录吗?
答案 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
注意我没有对边界进行任何错误检查。我将把它作为练习留给读者。
答案 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