プログラム出力で複数のパターンを評価し、パターン別ファイルを作成する

プログラム出力で複数のパターンを評価し、パターン別ファイルを作成する

いくつかの値/数値を出力するスクリプトがあります。これを2つのファイルに分割したいと思います。私は次のようなものを見ています:

./runme.sh | grep 'ook' >> ook.out | grep 'eek' >> eek.out

この場合、2番目のパイプラインは最初のgrepの出力ではなくrunme.shの出力を取得する必要があります。それは可能ですか?

答え1

これがこのユーティリティの完全なユースケースですpee

./runme.sh | pee "grep ook >> ook.out" "grep eek >> eek.out"

Debianおよび派生製品はpeepackage.jsonにありますmoreutils

答え2

その後、両方のモードでegrepを実行する必要があります。

`/.runme.sh | egrep "確認|eek"

しかし、各パターン評価出力をgrepがサポートしていない独自のファイルにリダイレクトする必要があるようです。誰でも可能であれば修正してください。

編集:minaevはmoreutilsからの尿の実際の例を提供しましたが、プラットフォームに尿がない場合でもこのようにteeを使用できます。プロセスの置き換えで遊んでください。

./runme.sh |tee >(grep ook > ook.txt) >(grep eek > eek.txt)

例:

[centos@centos scripts]$ ./runme.sh
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ ./runme.sh | tee >(grep eek >eek.txt) >(grep ook >ook.txt)
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ cat eek.txt 
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
[centos@centos scripts]$ cat ook.txt 
keekookjsfskooeek
ook
[centos@centos scripts]$ 

答え3

簡単なawk選択肢:

./runme.sh | awk '/ook/{print>>"ook.out"}/eek/{print>>"eek.out"}'

いくつか追加すると、コードを簡単に拡張できますawk。必要な正規表現出力ファイルのペアだけr配列に入れるだけです。

./runme.sh | awk 'BEGIN{r["ook"]="ook.out";r["eek"]="eek.out"}{for(i in r)if($0~i)print>>r[i]}'

このsed wコマンドはと同じですが、>残念ながらファイルに追加することはできません。

./runme.sh | sed -n $'/ook/wook.out\n/eek/week.out'

答え4

注文するティーパイプラインストリームのコピーを一時ファイルに保存できます。その後、raw stdoutファイルと一時ファイルを別々にgrepできます。

./runme.sh |tee temp |grep ook >>ook.out;grep eek temp >>eek.out

関連情報