いくつかの値/数値を出力するスクリプトがあります。これを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および派生製品はpee
package.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