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


18

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

$ myscript
Line A
Line B
Line C

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

$ cat out.file
Line A
Line C

ターミナルで最初のコマンドの出力を確認し、2番目のコマンドの出力をファイルに保存します。同時に。私が使ってみteeて、より良い、ない結果、または逆の結果

回答:


27

ターミナルで最初のコマンドの出力を確認し、2番目のコマンドの出力をファイルに保存します。

あなたが見ているものがstdoutstderrかを気にしない限り、あなたはまだ使うことができますtee

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

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


9
/dev/stderr一般的です。/dev/tty(現在の端末を意味する)もここで動作し、標準です。
ジル「SO-悪であるのをやめる」

@Gilles:素晴らしい。スクリプトを端末に出力し、それを別のコマンドにパイプするtee /dev/tty必要があるという私の要件に素晴らしく役立ちました!ありがとう!:-)stdoutstdin
jamadagni 14年

8
{ ... | 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)

grepの終了コードを保持するため、最初の1つを使用する必要がありました。何らかの理由であなたがアクセスすることができない場合にも、/ devのファイルシステム、/dev/fd/3に置き換えることができます>(cat 1>&3)
golvok

4

ここに別の方法がありsedます:

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

デフォルトでは、sedすべての行を出力します。この場合、stdoutstdinと同じになります(つまりmyscript、画面上の出力全体が表示されます)。
また、全てのラインマッチングをPATTERNするwにrittenout.file


-1

teeコマンドの使用方法を指定しなかったが、これは機能するはずです。

myscript | grep -P 'A|C' | tee out.file

少なくとも数分前に私のサーバーで動作しました...


4
しかし、私が間違っていなければ、この方法で画面上のものもgrepできます。すべての出力を画面に表示し、ファイルに入力される内容のみをフィルタリングしたい。
ロレンツォ-s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.