如何刪除 .bash_history 中的重複項並保留順序?
我真的很喜歡用
control+r
遞歸搜尋我的命令歷史。我發現了一些我喜歡與它一起使用的好選擇:# ignore duplicate commands, ignore commands starting with a space export HISTCONTROL=erasedups:ignorespace # keep the last 5000 entries export HISTSIZE=5000 # append to the history instead of overwriting (good for multiple connections) shopt -s histappend
對我來說唯一的問題是
erasedups
只刪除順序重複 - 所以使用這串命令:ls cd ~ ls
該
ls
命令實際上將被記錄兩次。我考慮過定期使用 cron 執行:cat .bash_history | sort | uniq > temp.txt mv temp.txt .bash_history
這將實現刪除重複項,但不幸的是訂單不會被保留。如果我不
sort
先文件,我不相信uniq
可以正常工作。如何刪除 .bash_history 中的重複項並保留順序?
額外學分:
.bash_history
通過腳本覆蓋文件是否有任何問題?例如,如果您刪除一個 apache 日誌文件,我認為您需要發送一個 nohup / reset 信號kill
以使其刷新它與該文件的連接。如果.bash_history
文件是這種情況,也許我可以ps
在執行過濾腳本之前以某種方式檢查並確保沒有連接的會話?
對歷史進行排序
該命令
sort|uniq
的工作方式與nl|sort -k 2|uniq -f 1|sort -n|cut -f 2
基本上,在每行前面加上它的編號。在
sort|uniq
-ing 之後,所有行都根據它們的原始順序重新排序(使用行號欄位),並且從行中刪除行號欄位。該解決方案的缺陷是未定義哪一類等線的代表將使其出現在輸出中,因此其在最終輸出中的位置未定義。但是,如果要選擇最新的代表,您可以
sort
通過第二個鍵輸入:nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2
管理 .bash_history
對於重新讀取和回寫歷史,您可以分別使用
history -a
和history -w
。
因此,在被重複項惹惱之後,我一直在尋找相同的東西,並發現如果我編輯 my
~/.bash_profile
或 my~/.bashrc
:export HISTCONTROL=ignoreboth:erasedups
它完全符合您的要求,它只保留最新的任何命令。
ignoreboth
實際上就像做一樣ignorespace:ignoredups
,並且erasedups
完成了工作。至少在我的帶有 bash 的 Mac 終端上,這項工作非常完美。在 askubuntu.com 上找到它。