これが標準出力かどうかはわかりませんが、私の考えではそうです。
私が望むのは、実行可能ファイルを実行するときに特定のログメッセージをフィルタリングすることです。
私はこれを試しました:
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
フィルタリングされます。