私は、持続的な履歴からls
のような "面白い"コマンドをフィルタリングして、私の.bash_historyファイルを整えるスクリプトを書いた。このフィルタは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
、)SEDの複数行機能について読んでいると私は、この目的のためにそれを試してみたいと思います。他のものがなければ、私はスピードのために2つを比較することに不思議に思うだろう。
はここで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ハードウェアを使用していない限り、速度はそれほど大きな違いはありません;-)。ただIMHO。皆さんお元気で!。 – shellter