リアルタイムログ(stdout)をどのようにgrepしますか?

リアルタイムログ(stdout)をどのようにgrepしますか?

これが標準出力かどうかはわかりませんが、私の考えではそうです。

私が望むのは、実行可能ファイルを実行するときに特定のログメッセージをフィルタリングすることです。

私はこれを試しました:

Executable 2>&1 /dev/null | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"

正常なものもあります:

Executable | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"

しかし、端末はまだ何千ものfixme:quartz異なるメッセージでいっぱいです。

ベストアンサー1

まず、目的のメッセージがstdoutに送信されるかstderrに送信されているかを確認する必要があります。最初の例では、stderrをstdoutにリダイレクトしました。これが「2>&1」部分です。コマンドラインには「/dev/null」もありますが、これはまったく意味がありません。コマンドラインに「/dev/null」が表示されるのはなぜですか?

第二に、どのメッセージを見たいかを決める必要があります。 「-v」フラグは次grepのとおりです。上下反転一致 - パターン文字列と一致しない行のみが印刷されます。指定したパターンは非常に正確です。たとえば、'fixme:quartz'長さが短いほど、より多くのgrep -v行を一致させることができないパターンをより特定のパターンで試すことができます。

私があなたなら、次のようにします。

Executable > log 2> err

これは、stdoutとstderrを2つの異なるファイルに分割します。 "fixme:quartz"という文字列を見つけるには、次のようにします。

grep 'fixme:quartz' log
grep 'fixme:quartz' err

どのファイルを表示したいかを決定し、正規表現(たとえばvim)をサポートするテキストエディタを使用して必要なものを見つけます。

これがうまくいかない場合、またはExecutable長い間実行する必要があり、特定のメッセージだけを表示したい場合は、上記の手順を実行してvimメッセージがstdoutまたはstderrにあることを確認する正規表現を使用してください。これにより、次のことができます。

Executable > log 2> err
tail -f log | grep 'fixme:quartz'  # or whatever regular expression

Executableメッセージを実行して生成すると、tail -fメッセージは「ログ」ファイルから定期的に読み取られ、独自の標準出力として印刷され、そこでgrepフィルタリングされます。

おすすめ記事