grep 历史文件时如何获取唯一命令的最后行号?

grep 历史文件时如何获取唯一命令的最后行号?

我依赖以前的命令的历史文件,尤其是那些很长且参数很多的命令。一旦我找到命令及其行号(nn),我就会用来!nn运行它。我更喜欢查看搜索的完整输出,而不是进行内联反向搜索。

为此,我通过它进行搜索history | grep some_text

然而,由于重复的条目(仅行号不同),我倾向于获得大量输出。随着我的历史增长,这种情况会随着时间的推移而变得更糟。

如何获得可以与!调用命令运算符一起使用的唯一命令的列表?

我尝试过历史 |优衣库 | grep some_text 但这不起作用,因为行号。

我可以这样做history | cut -b8- | uniq,并且只显示命令。
但是,当我添加时,sort我得到$ history | sort sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem. sort: The strings compared were5359 \253' 而且5360 x'.
行号也消失了,这是我真正想要的!line-number命令

理想情况下,我希望每次我做我的事情时都会发生这种情况history | grep- 我做了很多事情,我有一个别名,hg='history | grep '这样我就可以添加任何解决方案。

不太理想,但仍然令人感兴趣的是运行临时程序的能力,该程序实际上会使历史文件条目唯一(再次处理行号问题),以便只有任何给定命令的最新历史命令是保留)。大概是通过删除其他行。但是,以这种方式删除历史文件中的行会扰乱系统使用该文件的方式吗?

答案1

你可以说:

history | awk '{$1=""; sub("^ ", "", $0)}1' | sort -u

获取 中唯一条目的列表history

但是,您也可以设置HISTCONTROL以避免重复history

HISTCONTROL=ignoredups:erasedups

引用自手动的:

HISTCONTROL

以冒号分隔的值列表,控制命令如何保存在历史列表中。如果值列表包含“ ignorespace”,则以空格字符开头的行不会保存在历史列表中。值“ ignoredups”会导致不保存与先前历史条目匹配的行。值“ ignoreboth”是“ ignorespace”和“ ignoredups”的简写。值“ erasedups”会导致在保存该行之前从历史记录列表中删除与当前行匹配的所有先前行。任何不在上面列表中的值都将被忽略。如果HISTCONTROL未设置,或者不包含有效值,则 shell 解析器读取的所有行都将保存在历史列表中,具体取决于 的值HISTIGNORE。多行复合命令的第二行和后续行不进行测试,并且无论 的值如何,都会添加到历史记录中HISTCONTROL

答案2

您可以解析.bash_history文件,而不是使用history命令。这是一个例子awk

awk '!x[$0]++' .bash_history | nl

但就像 @devnull 的答案一样,您应该使用HISTCONTROL以避免重复的命令以及以下命令开头的命令spaces

HISTCONTROL=ignoreboth

答案3

在我的系统上,uniq可以选择跳过字段。

history | uniq -f 1

为我提供了带有行号的独特历史列表

我的版本:

uniq (GNU coreutils) 8.15

但是,这只会忽略并发重复项,因此我实际上会对历史输出进行排序,然后uniq

history | sort -k 2 | uniq -f 1 | sort -n

最后一个排序是可选的,它将按命令编号重新排序已排序的唯一条目

相关内容