没有时间戳且结果唯一的历史列表

没有时间戳且结果唯一的历史列表

使用 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]* *@@'; }

相关内容