如何删除壳最后10个命令的历史?(How to delete history of last 10

2019-08-16 19:59发布

命令如下

  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脚本和执行历史的缺失?

Answer 1:

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

~/.bash_history


Answer 2:

我的答案是基于以前的答案,但增加了倒车让历史项目从最新到最最近删除的序列。

让你的当前历史(调整要看到的行数):

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



Answer 3:

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


Answer 4:

从上面的回答相结合:

history -w vi ~/.bash_history history -r



Answer 5:

首先,类型: 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


Answer 6:

编辑:

改变了支撑迭代,良好的通话。 另外,调用带有一个反向迭代器这个功能。

你也许可以做这样的事情:

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

请注意,我还没有把任何错误检查的范围。 我会离开,作为一个练习留给读者。

也看到这个问题



Answer 7:

也许将是有用的人。
当您登录到任何控制台的任何用户/当前会话的终端历史只存在于一些“缓冲”,这刷新到〜/ .bash_history的您注销。
所以,为了保持秘密的事情你可以:
history -r && exit
你将与​​所有会话的(唯一的)历史记录中清除被注销;)



Answer 8:

使用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


Answer 9:

我曾经在这个线程共享的解决方案组合,以擦除命令历史轨迹。 首先,我验证此处保存的历史命令用:

echo $HISTFILE

我编辑的历史有:

vi <pathToFile>

在那之后,我刷新当前会话历史记录缓冲区:

history -r && exit

你进入到这个环节下一次,最后一个命令,你将在命令历史记录看到的是最后一个,你留在pathToFile。



Answer 10:

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



Answer 11:

我用这个脚本删除最后一个历史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



Answer 12:

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。



Answer 13:

一个简单的功能可以通过数杀死所有的(虽然它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`


Answer 14:

尝试以下方法:

for i in {511..520}; do history -d $i; echo "history -d $i"; done


Answer 15:

我用这个(我的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个条目。



Answer 16:

删除最后10项(根据您的例子):

history -d 511 520


文章来源: How to delete history of last 10 commands in shell?