2つの検索コマンドの比較


12

最近find、このワンライナーを受け取りましたが、以下の2つの違いがどこから来るのかを説明することはできません。

例1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

例2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

ご覧のとおり、最初のものには、この文字列が由来する特定のファイルがあり、これまでのところ、なぜこれが起こっているのかを知ることができません。

回答:


17

2つの場所を検索するようにgrepに指示しています。複数の場所が検索された場合、grepは完全な場所のみを表示します。

例えば

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

ファイルを1つだけ検索すると、grepがファイル名を省略していることに注意してください。

grep -i "foo" /tmp/herp
foo

しかし、複数の検索場所を指定すると、grepは各一致が見つかった場所を示します

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

さらに、/dev/null2つの引数を指定することにより、grepをだましてフルパスを出力します。


1
1しかし、あなたは「明白」を言及するのを忘れてしまった:「追加したファイルがある理由が/dev/nullわからどんなことグレップ-EDは(空)に記載されていませんであることになることです/dev/nullので、唯一の正しい位置がoutputedされ、ファイル」
オリビエデュラック14

また、検索/dev/nullすることで、空でないダミーファイルを検索する時間を無駄にしません。そして最後に、検索の意図は/dev/nullこのイディオムに精通している人には明らかです。
アレクシス14

5

man grep

-H、-with-filename

各一致のファイル名を印刷します。これは、検索するファイルが複数ある場合のデフォルトです。

この違いは、2つのケースでgrepが1つまたは2つのファイル引数で呼び出されたために発生します。追加/dev/nullする代わりにgrep、引数で呼び出すことができます-H。おそらく、この/dev/null動作はより広くサポートされています。


3
grep -H移植性がありません-この/dev/nullトリックはGNU grepがなくても動作します。
クリスダウン14

4

最初の例は、find式の結果として見つかったファイルごとに2つのファイルに対してgrepを実行することと同等です。例えば、場合find発見三つのファイルa.txtb.txtおよびc.txtその後は、grepとして実行されます

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

これにgrepは、出力が一致するファイル名が表示されます。/ dev / nullに一致するものはないため、一致する場合、最初のファイルのファイル名が出力されることが保証されます。

一方、2番目の例は次と同等です

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

その場合、引数が1つしかないため、一致するファイル名は出力されません。

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