如何从ZSH的历史记录中删除条目


79

假设我使用zsh运行了一个命令

echo "mysecret" > file

我可以使用以下命令轻松打印历史记录,包括条目号fc -l

1  echo "mysecret" >| file

但是,如何轻松从历史记录中删除条目?

我在man zshbuiltins中找不到相应的段落。


2
与SuperUser相比,这在StackOverflow上做什么?
查尔斯·达菲

Answers:


96

* BSD /达尔文(macOS):

LC_ALL=C sed -i '' '/porn/d' $HISTFILE

Linux(GNU sed):

LC_ALL=C sed -i '/porn/d' $HISTFILE

这将从$ HISTFILE中删除所有匹配“ porn”的行。

使用setopt HIST_IGNORE_SPACE,您可以在上面的命令前面加上一个空格字符,以防止将其写入$ HISTFILE。

正如Tim在下面的评论中指出的那样,前缀LC_ALL = C可以防止“非法字节序列”失败。


1
注意:在osx / BSD上,您需要在-i后面加上空引号以明确指定没有备份文件,因此:sed -i '' '/S3_SECRET/d' $HISTFILE。这在Linux上不起作用。stackoverflow.com/questions/5694228/...
蒂姆·迪金斯

3
如果你得到“非法的字节序列”,然后设置LC_ALL = C,即:LC_ALL=C sed -i '' '/S3_SECRET/d' $HISTFILE stackoverflow.com/questions/11287564/...
蒂姆·迪金斯

55

我不知道是否有某种优雅的方法可以执行此操作,但是在类似情况下,我已经注销(允许zsh清空其缓冲区并将我的历史记录写入文件),然后登录并最终手动编辑 ~/.zsh_history,删除“危险”行。


为我工作。我确实必须重新启动终端,以使它适应更改。
weltschmerz '16

为了获得加分,请避免通过设置环境变量来加载历史文件HISTFILE=/dev/null,或者仅使用另一个外壳程序。如果zsh是登录shell,请登录和exec sh,然后进行编辑~/.zhistory
gnucchi

确实有效!从中删除命令 ~/.zsh_history,然后重新启动zsh。
l mingzhi


1

此功能将从Zsh历史记录中删除您想要的任何一行,而不会出现任何问题:

# Accepts one history line number as argument.
# Alternatively, you can do `dc -1` to remove the last line.
dc () {
  # Prevent the specified history line from being saved.
  local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"

  # Write out the history to file, excluding lines that match `$HISTORY_IGNORE`.
  fc -W

  # Dispose of the current history and read the new history from file.
  fc -p $HISTFILE $HISTSIZE $SAVEHIST

  # TA-DA!
  print "Deleted '$HISTORY_IGNORE' from history."
}

如果要另外防止所有dc命令写入历史记录,请在~/.zshrc文件中添加以下内容:

zshaddhistory() {
 [[ $1 != 'dc '* ]]
}

更新资料

我现在已经发布了一个更全面的解决方案作为插件:https : //github.com/marlonrichert/zsh-hist


-2

bash中

1 in bash终端类型

hsitory #这将列出历史记录.bash_history文件中所有带有行号的命令

例如:

  ...
  987  cd
  988  ssh x@127.0.0.1
  990  exit
  991  cd

2-选择要删除的CMD行号

history -d 988

注意:例如,如果要删除最后3个CMD,只需从底部ex:988中选择第三行号,然后history -d 988依次重复CMD 3次。

资源


2
history -d在ZSH中不起作用,因为它只是其别名,fc -l 1并且以fc: event not found: -d错误结尾。
Wirone

是的,我用bash写作!以防万一有人需要它而不是zsh
KhogaEslam
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.