パイプを使用したgrepがここで機能しないのはなぜですか?


18

次のコマンドがあります:

find / -name libGL.so.1

「Permission denied」で多くの行を返します。そのような行を除外したいので、次を追加しました:

find / -name libGL.so.1 | grep -v 'denied'

しかし、出力は同じです-私grep -v 'denied'は行をフィルタリングしませんPermission denied。私は多くのバリエーションを試し、grepチュートリアルを調べましたが、問題を理解することはできません。助言がありますか?

回答:


43

それはとは何の関係もないのですgrep-パイプがあるため、それはだ|、標準出力ストリームをリダイレクトするstdoutのに対し、Permission deniedメッセージは標準エラーストリームですstderr。あなたが使用してストリームを組み合わせることによって、欲しい結果達成できる2>&1(そのファイルディスクリプタであるストリームリダイレクト2そのファイルディスクリプタであるストリームにする1ように)それstderrだけでなく、としてstdoutのgrepコマンドの入力にパイプます

find / -name libGL.so.1 2>&1 | grep -v 'denied'

しかし、それを単にstderrリダイレクトすることによって完全に破棄するのがより一般的です/dev/null

find / -name libGL.so.1 2>/dev/null

2>&1の代わりに|&を使用する|

Bashのmanページを見ると、この宣伝文句に気付くでしょう。

場合|&に使用され、コマンドの標準誤差は、配管を介してコマンド2の標準入力に接続されています。それは略記です2>&1 |

したがって、STDERRとSTDOUTを結合する場合も、この構成を使用できます。

find / -name libGL.so.1 |& grep -v 'denied'

3
それらを組み合わせることに関する追加注意事項:ファイルが存在する時に、いくつかの奇妙な理由で場合は/foo/bar/denied/libGL.so.1、組み合わせるstdoutstderr 、その後フィルタリングは結果を非表示にします
Izkata

5

コマンドは次のとおりです。

find / -name libGL.so.1 2>/dev/null

Findは、標準エラー(fd2)の許可について不平を言っています。これらの行を削除するには、標準出力をビットバケット(/ dev / null)にリダイレクト(>)します。


4

「permission denied」行はstderr(標準エラー)ストリームに送られますが、grepを介してstdout(標準出力)をパイピングしています。

でstderrを完全にリダイレクトできます

find / -name libGL.so.1 2> /dev/null

2

sudoでコマンドを呼び出してみましたか?

sudo find / -name libGL.so.1

それでもメッセージが表示される場合は、前述のstderr(fd = 2)からnirvana(/ dev / null)へのリダイレクトを使用します

sudo find / -name libGL.so.1 2> /dev/null

ここで他のアイデア、幸運を!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.