web-dev-qa-db-ja.com

stdoutへの出力と同時にファイルへのgrep

テキストをstdoutに出力するスクリプトがあります。このすべての出力を端末で確認したいと同時に、いくつかの行をフィルタリングしてファイルに保存したいと考えています。例:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

ターミナルで最初のコマンドの出力を表示し、2番目のコマンドの出力をファイルに保存したい。同時に。 teeを使用してみましたが、結果がないか、またはreversed result

19
lorenzo-s

ターミナルで最初のコマンドの出力を表示し、2番目のコマンドの出力をファイルに保存したい。

あなたが見ているものがstdoutからであるかstderrからのものであるかを気にしない限り、teeを使用できます:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

Linuxで動作します。 「/ dev/stderr」が他の* nixにも同様に適用できるかどうかはわかりません。

29
goldilocks
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

または、プロセス置換(ksh93、zshまたはbash)を使用:

... | tee >(grep -e A -e C > out.file)

Zshの場合:

... >&1 > >(grep -e A -e C > out.file)
9

sedの別の方法を次に示します。

myscript | sed '/PATTERN/w out.file'

デフォルトでは、sedはすべての行を出力するため、この場合stdoutstdinと同じになります(つまり、myscript on screen)。
さらに、PATTERNに一致するすべての行はwritten to out.file

4
don_crissti