我寫了一個腳本來修飾我的.bash_history文件,從持久化歷史過濾「無趣」命令,如ls
。我知道有HISTIGNORE
變量,但這也會排除當前會話的內存歷史記錄中的這些命令,我發現將它們放在一個會話的範圍內是有用的,但不會在會話中持久化。 )這個過濾器可以使用Sed實現嗎?
歷史文件可以包含帶有嵌入換行符的多行歷史記錄條目,因此這些條目由時間戳分隔。該腳本需要像輸入文件:
#1501304269
git stash
#1501304270
ls
#1501304318
ls | while IFS= read line; do
echo 'line is: ' $line
done
並篩選出單行ls
,man
和cat
命令,產生:
#1501304269
git stash
#1501304318
ls | while IFS= read line; do
echo 'line is: ' $line
done
注意,多行條目是未經過濾的 - 我的身影如果它們足夠有趣以保證多行,那麼它們值得記住。
我實現了它在awk中,但我一直在閱讀有關桑達的多能力(N
,h
,H
,x
等),我想試試這個目的。如果沒有別的,我會好奇地比較兩個速度。
這裏的awk腳本:
/^#[[:digit:]]{10}$/ {
timestamp = $0
histentry = ""
next
}
$1 ~ /^(ls?|man|cat)$/ {
if (! timestamp) {
print
} else {
histentry = $0
}
next
}
timestamp {
print timestamp
timestamp = ""
}
histentry {
print histentry
histentry = ""
}
{ print }
可以這樣使用桑達做?
您是否瞭解'HISTIGNORE'? https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash - 你可以在你的.bashrc中導出HISTIGNORE = ls:man:cat',它會執行無需編寫任何代碼就可以實現類似的功 –
@JohnZwinck是的,但是那些命令在我當前的會話中也會被忽略。我經常點擊'up'或'ctrl-p'來回憶最近的'ls'並調整它,所以我不想在這種情況下使用'HISTIGNORE'。 – ivan
如果你是一個受虐狂,你可能可以用'sed'來實現。鑑於你在awk中有一個完美的版本,我會計算我的幸運星,並轉向其他追求;-)。除非您使用Pentium 3硬件,否則速度不會有任何顯着差異;-)。只是恕我直言。祝你們好運!。 – shellter