2017-08-01 9 views
2

私は、持続的な履歴からlsのような "面白い"コマンドをフィルタリングして、私の.bash_historyファイルを整えるスクリプトを書いた。このフィルタはSedを使用して実装できますか?

(私は変数がありますが、現在のセッションのメモリ内の履歴からそのようなコマンドを除外していることは知っています)。 )

履歴ファイルには改行が埋め込まれた複数行の履歴エントリが含まれる可能性があるため、エントリはタイムスタンプで区切られます。スクリプトは次のように入力ファイルを取ります。

#1501304269 
git stash 
#1501304270 
ls 
#1501304318 
ls | while IFS= read line; do 
echo 'line is: ' $line 
done 

と生産、シングルラインlsman、およびcatコマンドをフィルタリング:

#1501304269 
git stash 
#1501304318 
ls | while IFS= read line; do 
echo 'line is: ' $line 
done 

複数行のエントリがフィルタリングされていないことに注意してください - 私は理解します彼らが複数の行を保証するのに十分興味深いなら、彼らは覚えておく価値がある。

私はAwkの中でそれを実現したが、私は(などNhHx、)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 } 

が、これはセッドを使用して行うことができますか?

+0

あなたは 'HISTIGNORE'について知っていますか? https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash - .bashrcで 'HISTIGNORE = ls:man:cat'をエクスポートできます任意のコードを書くことなく、何か類似しています。 –

+1

@JohnZwinckはい、しかし、それらのコマンドは現在のセッションの履歴からも無視されます。私は頻繁に 'up'や' ctrl-p'を押して最近の 'ls'を思い出して微調整するので、この場合は' HISTIGNORE'を使いたくありません。 – ivan

+1

もしあなたが写実主義者であれば、 'sed'で実装できるかもしれません。あなたはawkで完璧なバージョンを持っていると私は幸運な星を数え、他の追求に移ります。あなたがPentium 3ハードウェアを使用していない限り、速度はそれほど大きな違いはありません;-)。ただIMHO。皆さんお元気で!。 – shellter

答えて

1

確かにsedで行うことができます。ここではGNUのSEDSに私たちが代わりにラインの作業ラインを一度に全部のファイルを扱うことができます-zオプションを使用した例です。

sed -rz "s/(#[0-9]{10}\n(cat|ls|man)\n)+(#[0-9]{10}\n|$)/\3/g;" yourfile 

すべてが正常に動作し、あなたがさえかもしれないあなたの履歴ファイルのバックアップを持っている場合GNU sed -iオプションを使用してインプレイスを変更します。

-rオプションは、拡張正規表現を可能にし、-zオプションは、このような説明書で説明されている:

各々がゼロバイト (ASCII「NUL」によって終了、ラインの組として入力トリート文字)を改行の代わりに使用します。このオプションは を 'sort -z'や 'find -print0'のようなコマンドで使用して、 の任意のファイル名を処理することができます。

基本的な考え方は次のとおりです。興味のないコマンドの前にタイムスタンプが続きます(またはファイルの最後の行です)。

  • タイムスタンプRE #[0-9]{10}
  • (#[0-9]{10}\n(cat|ls|man)\n)+マッチ一つまたはそれ以上の第二のタイムスタンプが\3に取り込まれ
  • (#[0-9]{10}|$)つまらないコマンド(これは括弧の第3の対であることにあなたのAWKスクリプトから取得され)交換部品と代替品での再使用のためファイルの最後に合う
+0

うわー、それは実際に私が試みたすべてよりもはるかに簡単です。私はmac上にいるのでgnu-sedをインストールしなければならず、BSD sedは '-z'をサポートしていません。 – ivan

関連する問題