web-dev-qa-db-ja.com

1つのコマンドの出力を他の2つのコマンドにパイプできますか?

1つのコマンドの出力を他の2つのコマンドの入力に同時にパイプする方法を教えてください。

28
Richard Hoskins

teeコマンドがあなたの望むことをするようです。

キーは使用することです

>( )

プロセス置換 の場合。 teeでは、次のパターンを使用します。

tee >(proc1) >(proc2) >(proc3) | proc4

したがって、lsの出力を2つの異なるgrepプログラムへの入力として使用する場合は、各grepの出力を別のファイルに保存し、すべての結果をパイプしてless、試してみてください:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

ls -Aの結果は、両方のgrepsに「パイプ」されます。ファイルhidden-filesには最初のgrepの出力の内容が含まれ、normal-filesには2番目のgrepの結果が含まれます。 すべてのファイルがポケットベルlessに表示されます。[〜#〜] edit [〜#〜]lessに表示されるのはgrepsの結果ではなく、ls -Aのまったく同じ出力。出力をls -Aからlessに変更する場合(たとえば、通常のファイルが非表示のファイルの前に表示されるように順序を入れ替える)、次のことを試してください。

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

>/dev/nullがない場合、grepsの出力は、置換する代わりにls -Aの出力に追加されます。

ソース

59
Ben

「ティー」を使用します。

例:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

これにより、grepコマンドの出力がターミナルと wc の両方に送信されます(これらの出力はgrepresultファイルにリダイレクトされます)。

"Tee"はWikipediaの記事tee(コマンド)で説明されています。中心は次のとおりです。「teeコマンドは標準入力を読み取り、その内容を標準出力に書き込み、同時に指定したファイルまたは変数にコピーします。」.

6
Peter Mortensen