命令如下
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
,但怎么最后10个命令删除,并在外壳使用单个命令在10个命令历史之间?
我们可以写一个bash脚本和执行历史的缺失?
我的答案是基于以前的答案,但增加了倒车让历史项目从最新到最最近删除的序列。
让你的当前历史(调整要看到的行数):
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
这将产生history -d
为1008,然后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
。
for x in `seq $1 $2`
do
history -d $1
done
从上面的回答相结合:
history -w vi ~/.bash_history history -r
首先,类型: history
和写下你想删除的行号的顺序。
要清除行从假设线1800至1815年写终端如下:
$ for line in $(seq 1800 1815) ; do history -d 1800; done
如果你想删除的删除命令历史记录,添加+1为1815 = 1816和历史为序+删除命令将被删除。
例如 :
$ for line in $(seq 1800 1816) ; do history -d 1800; done
编辑:
改变了支撑迭代,良好的通话。 另外,调用带有一个反向迭代器这个功能。
你也许可以做这样的事情:
#!/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
请注意,我还没有把任何错误检查的范围。 我会离开,作为一个练习留给读者。
也看到这个问题
也许将是有用的人。
当您登录到任何控制台的任何用户/当前会话的终端历史只存在于一些“缓冲”,这刷新到〜/ .bash_history的您注销。
所以,为了保持秘密的事情你可以:
history -r && exit
你将与所有会话的(唯一的)历史记录中清除被注销;)
使用bash 5,你现在可以做了一系列...万岁!:
history -d 511-520
或向后10计数:
history -d -10--1
摘自猛砸5手册页 :
'历史'
选项,如果提供,具有以下涵义:
“-d OFFSET”删除在位置偏移的历史记录条目。 如果offset为正,则应该显示在历史当它出现指定。 如果偏移量为负,则解释为相对于一个大于最后的历史地位,所以负索引数从历史的终结背部,和索引“-1”,是指当前的历史-d“命令。
“-d START-END”中删除历史记录条目之间的位置开始和结束,包容性。 为START和END正值和负值如上所述解释。
这里是我的击4解决方案:
delHistory () {
count=$(( ${2:-$1} - $1 ))
while [[ $count -ge 0 ]] ; do
history -d "$start"
((count--))
done
}
delHistory 511 520
我曾经在这个线程共享的解决方案组合,以擦除命令历史轨迹。 首先,我验证此处保存的历史命令用:
echo $HISTFILE
我编辑的历史有:
vi <pathToFile>
在那之后,我刷新当前会话历史记录缓冲区:
history -r && exit
你进入到这个环节下一次,最后一个命令,你将在命令历史记录看到的是最后一个,你留在pathToFile。
我用这个脚本删除最后一个历史10个命令:
pos=$HISTCMD; start=$(( $pos-11 )); end=$(( $pos-1 )); for i in $(eval echo "{${start}..${end}}"); do history -d $start; done
它使用$HISTCMD
环境VAR获得历史索引,并使用该删除最后10个条目中history
。
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。
一个简单的功能可以通过数杀死所有的(虽然它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`
尝试以下方法:
for i in {511..520}; do history -d $i; echo "history -d $i"; done
我用这个(我的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
是因为我有在地方的著名的变化技巧,跨终端共享的历史和这个功能没有这些部件将打破。 他们确保真正的bash调用history
内置(而不是周围我自己的包装),并写历史HISTFILE的条目被拆除之后。
然而,这会工作,因为它是“正常”的历史配置。
你应该要删除,例如去年的条目数调用它:
histrm 10
将删除的最后10个条目。