Bash

如何刪除 .bash_history 中的重複項並保留順序?

  • February 18, 2022

我真的很喜歡用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 -ahistory -w

因此,在被重複項惹惱之後,我一直在尋找相同的東西,並發現如果我編輯 my~/.bash_profile或 my ~/.bashrc

export HISTCONTROL=ignoreboth:erasedups

它完全符合您的要求,它只保留最新的任何命令。ignoreboth實際上就像做一樣ignorespace:ignoredups,並且erasedups完成了工作。

至少在我的帶有 bash 的 Mac 終端上,這項工作非常完美。在 askubuntu.com 上找到它。

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