Grep

grepping我的歷史文件時如何獲取唯一命令的最後一行?

  • April 7, 2014

我依賴我的歷史文件來獲取以前的命令,尤其是那些參數很多的長命令。一旦找到命令及其行號(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 ',所以我可以添加任何解決方案。

不太理想,但仍然令人感興趣的是執行臨時程序的能力,該程序實際上會使歷史文件條目唯一(再次處理行號問題),因此只有任何給定命令的最新歷史命令是保留)。大概是通過刪除其他行。但是以這種方式刪除歷史文件中的行會擾亂系統使用文件的方式嗎?

你可以說:

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

獲取history.

但是,您也可以設置HISTCONTROL以避免重複history

HISTCONTROL=ignoredups:erasedups

引用手冊

HISTCONTROL

以冒號分隔的值列表,用於控制命令如何保存在歷史列表中。如果值列表包含“ ignorespace”,則以空格字元開頭的行不會保存在歷史列表中。’ ignoredups’ 值會導致不保存與先前歷史條目匹配的行。’ ‘的值是’ ’ 和 ’ ‘ignoreboth的簡寫。’ ’ 值會導致與目前行匹配的所有先前行在保存該行之前從歷史列表中刪除。任何不在上述列表中的值都將被忽略。如果未設置或不包含有效值,則 shell 解析器讀取的所有行都保存在歷史列表中,受值的限制ignorespace``ignoredups``erasedups``HISTCONTROL``HISTIGNORE. 多行複合命令的第二行和後續行不經過測試,無論 的值如何,都會添加到歷史記錄中HISTCONTROL

引用自:https://unix.stackexchange.com/questions/123537