如何删除历史记录中与给定字符串匹配的命令?

如何删除历史记录中与给定字符串匹配的命令?

我需要删除历史记录中与字符串匹配的所有命令。我试过了:

$ history | grep searchstring | cut -d" " -f2 | history -d
-bash: history: -d: option requires an argument

$ history | grep searchstring | cut -d" " -f2 | xargs history -d
xargs: history: No such file or directory

$ temparg() { while read i; do "$@" "$i"; done }
$ history | grep searchstring | cut -d" " -f2 | temparg history -d
(no error, but nothing is deleted)

这样做的正确方法是什么?

答案1

history命令仅对您的历史文件进行操作$HISTFILE(通常为~/.history~/.bash_history)。如果您只是从该文件中删除这些行,就会容易得多,这可以通过多种方式完成。grep是一种方法,但您必须小心不要在读取文件时覆盖该文件:

$ grep -v searchstring "$HISTFILE" > /tmp/history
$ mv /tmp/history "$HISTFILE"

另一种方法是sed

$ sed -i '/searchstring/d' "$HISTFILE"

答案2

如果您不关心从当前会话中删除命令,Michael Mrozek 的答案将会起作用。如果这样做,您应该在执行他的帖子中的操作之前写入历史文件history -a

另外,从历史文件中删除所需的条目后,您可以通过发出history -c,然后发出 来重新加载它history -r

答案3

对于那些寻找单行的人:

while history -d $(history | grep 'SEARCH_STRING_GOES_HERE'| head -n 1 | awk {'print $1'}) ; do :; history -w; done

所以,如果你想,例如。删除其中包含密码的多行,只需将“SEARCH_STRING_GOES_HERE”替换为密码即可。这将在您的整个历史记录中搜索该搜索字符串并将其删除。

需要注意的 2 件事

  • grep 使用正则表达式,除非您提供 -F 作为参数
  • 一旦不再有匹配项,该命令将显示 1 个错误。忽略它。

答案4

cat "$HISTFILE" | grep -v "commandToDelete" >> "$HISTFILE" && exit

这对我有用。历史 -c && 历史 -a 没有为我正确重新加载历史文件。因此,我只是在重写历史文件后立即退出会话,这样内存中的文件就不会覆盖它。

相关内容