假设我使用zsh运行命令
echo "mysecret" > file
我可以使用命令fc -l
轻松打印包含条目编号的历史记录:
1 echo "mysecret" >| file
但是如何轻松删除历史记录中的条目?
我在 man zshbuiltins 中找不到相应的段落。
答案 0 :(得分:83)
LC_ALL=C sed -i '' '/porn/d' $HISTFILE
LC_ALL=C sed -i '/porn/d' $HISTFILE
这将从$ HISTFILE中删除所有与“porn”匹配的行。
使用setopt HIST_IGNORE_SPACE
,您可以在上面的命令前加一个空格字符,以防止它被写入$ HISTFILE。
作为Tim pointed out in his comment below,前缀LC_ALL = C可防止“非法字节序列”失败。
答案 1 :(得分:41)
我不知道是否有一些优雅的方法可以做到这一点,但在类似的情况下我已经注销(允许zsh清空其缓冲区并将我的历史记录写入文件),然后登录,最后手动编辑 ~/.zsh_history
,删除“危险”行。
答案 2 :(得分:24)
如果在zsh中使用HIST_IGNORE_SPACE选项,则可以使用空格“”前置命令,并且不会在历史记录文件中记住这些命令。如果你有秘密命令,你可以通常使用这些命令:
http://unsyncopated.com/blog/index.php/2007/08/18/omitting-certain-commands-from-zshs-history/
答案 3 :(得分: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
答案 4 :(得分:-2)
在 bash 中:
1-在bash终端类型中
hive> select len("some string");
OK
11
Time taken: 1.758 seconds, Fetched: 1 row(s)
#这将列出历史记录.bash_history文件中具有行号的所有命令
例如:
hsitory
2-选择要删除的CMD行号
...
987 cd
988 ssh x@127.0.0.1
990 exit
991 cd
注意:例如,如果要删除最后3个CMD,只需从底部ex 988中选择第三行号,然后依次重复CMD history -d 988
3次。