使用 bash,我使用时间戳保存我的历史记录。
如何打印省略时间戳的历史记录?
alias h=history
alias g=grep -i
为了找到我用于 heroku 的行,我输入:
> h | g heroku
当然,我想让结果独一无二,不带时间戳。
这个问题有些相关:如何避免 .bash_history 中的重复条目
不过,有时我想查看历史记录中的重复项以了解运行命令的上下文。
答案1
简单地,history | sed 's/.[ ]*.[0-9]*.[ ]*//' | uniq | grep -i "heroku"
这sed
将删除每行开头的任何 [空格][数字][空格]
为了优化
history | grep -i "heroku" | sed 's/.[ ]*.[0-9]*.[ ]*//' | uniq
答案2
@devav2 的回答补充
清除/取消历史时间戳环境变量
HISTTIMEFORMAT="";
导出以下命令,
export HISTCONTROL=ignoredups
-->这将忽略按顺序执行的重复项
答案3
可以根据每个命令抑制(或修改)时间戳:
如果设置了 HISTTIMEFORMAT 变量并且不为空,则其值将用作 strftime(3) 的格式字符串,以打印与每个显示的历史记录条目相关的时间戳。否则,不会打印时间戳。
剩下的只是行号,虽然行号无法被隐藏,但是填充到固定宽度(对于行号 < 100,000):
printf("%5d%c %s%s\n", line_number, modified ? '*' : ' ', timestamp, line);
因此,要从每行删除前缀,我们需要剪掉前 7 个字符(5 个数字、1 个标记字符和 1 个空格),例如:
$ HISTTIMEFORMAT= history 10 | cut -c8-
这可以轻松添加到别名中:
$ alias h='HISTTIMEFORMAT= history | cut -c8-'
然后调用例如:
$ h | grep whatever
$ h | head -n 10
答案4
您还可以暂时禁用时间戳
HISTTIMEFORMAT="" history
要列出实际的命令,请执行
HISTTIMEFORMAT="" history | sed 's@ *[0-9]* *@@'
你可以将其设为一个函数
history-raw() { HISTTIMEFORMAT="" history | sed 's@ *[0-9]* *@@'; }