grepを使用して出力を別のファイルにフィルタリングしながら、出力を1つのファイルにリダイレクトする

grepを使用して出力を別のファイルにフィルタリングしながら、出力を1つのファイルにリダイレクトする

毎秒1行のデータを出力するプロセスを実行しています。すべての出力を「output.txt」として出力したいのですが、@のある行も別のファイル「emails.txt」に出力したいと思います。以下のように試しましたが、grep部分は機能しません。

myProgrram | pee 'tee output.raw 2>&1' 'grep @ > email.txt'

これを改善する方法についてのアイデアはありますか?ありがとうございます。

ベストアンサー1

解決策は次のとおりです。

myprogram 2>&1 | tee output.txt | grep --line-buffered @ > emails.txt

説明する:

  • stdin「標準入力」(ファイル記述子番号0)です。
  • stdout「標準出力」(ファイル記述子番号1)です。
  • stderr「標準エラー」(ファイル記述子番号2)です。
  • 2>&1stderrに送信されたコンテンツをリダイレクトしますstdout
  • |stdout左パイプがstdin右パイプに接続されます。
  • tee output.txt同時に2つのことを行います。
    • stdinに書くoutput.txt
    • stdinに渡されましたstdout
  • |stdoutにパイプを接続しますstdin
  • grep --line-buffered @@fromを含む行を選択してstdinに送信しますstdout
  • > emails.txtstdinに何でも書いてくださいemails.txt

この--line-bufferedフラグはgrep出力にラインバッファリングを使用するため、パフォーマンスが低下する可能性がありますが、みんな出力はファイルとして印刷されます。

おすすめ記事