从 bash 历史记录中删除最后 N 行

Thi*_*ter 57 bash command-history

当不小心将文件粘贴到 shell 中时,它会在 bash 历史记录中放入大量丑陋的无意义条目。有没有一种干净的方法来删除这些条目?显然我可以关闭 shell 并.bash_history手动编辑文件,但也许有某种 API 可用于修改当前 shell 的历史记录?

小智 47

命令提示符中的这一行将有所帮助。

for i in {1..N}; do history -d START_NUM; done
Run Code Online (Sandbox Code Playgroud)

其中 START_NUM 是历史条目的起始位置。N 是您可能要删除的条目数。

前任: for i in {1..50}; do history -d 1030; done

  • 我想知道为什么这不是内置函数。“历史”是一个非常古老的工具。 (3认同)
  • @RajeevAkotkar 如果删除命令是第 n 行,那么在 for 循环中使用 N+1 也将有助于删除执行删除的命令。 (2认同)

Mat*_*Mat 43

从 开始bash-5.0-alpha,该history命令现在采用删除 ( -d) 选项的范围。请参阅rastafile 的回答

对于旧版本,解决方法如下。


您可以使用history -d offsetbuiltin 从当前 shell 的历史记录中删除特定行,或history -c清除整个历史记录。

如果您想删除一系列行,这并不实用,因为它只需要一个偏移量作为参数,但是您可以将它包装在一个带有循环的函数中。

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}
Run Code Online (Sandbox Code Playgroud)

用 调用它rmhist first_line_to_delete last_line_to_delete。(根据输出的行号history。)

history -w用于强制写入历史文件。)

  • 代替`$(history | wc -l)`,可以使用变量`$HISTCMD`。 (2认同)

小智 16

history内置命令的bash也需要一个范围,现在在2020年:

-d 偏移量

删除位置偏移处的历史条目。如果 offset 为负数,则将其解释为相对于比最后一个历史记录位置大 1 的位置,因此负索引从历史记录的末尾开始倒计时,而 -1 的索引指的是当前的 history -d 命令。

-d 开始结束

删除位置开始和结束之间的历史条目,包括。开始和结束的正值和负值按上述解释。

只有命令本身不告诉与--help

 Options:
   -c        clear the history list by deleting all of the entries
   -d offset delete the history entry at position OFFSET. Negative
             offsets count back from the end of the history list

   -a        append history lines from this session to the history file
   ...
Run Code Online (Sandbox Code Playgroud)

例如history -d 2031-2034,一次删除四行。您可以使用$HISTCMD从最新的 N 行向后删除。


您还可以使用 导出history -w tmpfile,然后编辑该文件,使用 清除,history -c然后使用 回读history -r tmpfile。不写入.bash_history

  • 当我尝试这个时,我得到“历史位置超出范围”。 (3认同)

小智 6

如果N从历史记录中删除行,则行N+1会移动位置N等。

出于这个原因,我宁愿识别oldestnewest之间我想删除所有的历史记录行。(注:oldest< newest)。

例如,如果我想删除从oldest = 123up 到的历史行newest = 135,我会写:

$ for i in {135..123}; do history -d $i ; done
Run Code Online (Sandbox Code Playgroud)

我发现它更容易阅读;此外:该for命令还可以减少一个范围......

  • 相反,您也可以只执行 `for i in {123..135}; 做历史-d 123;完成` (2认同)