web-dev-qa-db-ja.com

検索出力から「アクセスが拒否されました」をフィルタリングするにはどうすればよいですか?

最近sedを使い始めました。私がそれを使用する1つの便利な方法は、ログファイルの重要でない行を無視することです。

tail -f example.com-access.log | sed '/127.0.0.1/d;/ELB-/d;/408 0 "-" "-"/d;'

しかし、findで同様に使用しようとすると、期待した結果が得られません。次のように "Permission denied"を含む行を無視しようとしています:

find . -name "openssl" | sed '/Permission denied/d;'

ただし、stdoutにはまだ「Permission denied」メッセージがたくさん表示されます。

[〜#〜]編集[〜#〜]

以下の正解で述べたように、「Permission denied」メッセージはstderrではなくstdoutに表示されます。

9
Ben Harold

問題はstderrに出力されるエラー出力であるため、sedコマンドは入力をキャッチできません。単純な解決策は、stderrをstdoutにリダイレクトすることです。

find . -name "openssl" 2>&1 | sed '/Permission denied/d;'
18
cuonglm

sedを使用してfindの出力からpermission deniedメッセージを削除しようとしている理由がわかりません- sedの使い方を学ぼうとしているのでない限り。

代わりにこれを実行します:

見つける。 -name "openssl" 2>/dev/null

ここでは、stderr(ファイル記述子2)を/dev/nullにリダイレクトしています(man nullを参照)。言い換えると、2>/dev/nullstderrに書き込まれたすべてを単に破棄します。

15
Srinidhi