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


40

当不小心将文件粘贴到外壳中时,它会在bash历史记录中放置大量丑陋的废话。是否有清除这些条目的干净方法?显然,我可以关闭外壳并.bash_history手动编辑文件,但是也许可以使用某种API来修改当前外壳的历史记录?

Answers:


36

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

如果要删除一定范围的行,这不是很实际,因为它只使用一个偏移量作为参数,但是您可以将其包装在带有循环的函数中。

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

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

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


1
由于OP要求删除最后 N 行,因此应通过执行以下操作来修改此脚本:tot_lines=$(history | wc -l)然后重复history -d $(( tot_lines - $1 ))
PlasmaBinturong '18年

2
除了$(history | wc -l),还有$HISTCMD可以使用的变量。
PlasmaBinturong

28

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

for i in {1..N}; do history -d START_NUM; done

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

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


3
我想知道为什么这还不是内置函数。“历史”是一个非常古老的工具。
Petr Gladkikh '16

可以很好地达到目的,但是这个命令可以在历史上看到:)
Rajeev Akotkar,

askubuntu.com/a/978276/22866提供了一种从历史记录中删除“从历史记录命令中删除”的好方法:-)
HanSooloo

0

user2982704的回答几乎对我有用,但效果不佳。我不得不做一个小的变化。

假设我的历史记录为1000,并且我想删除最近的50个条目

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.