两种查找命令比较


12

最近,我收到了这一find单行代码,但是我无法解释以下两者的区别来自哪里:

例子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

如您所见,在第一个文件中,有一个从该字符串派生的特定文件,到目前为止,我还真的无法找出原因。

Answers:


17

您正在告诉grep搜索2个位置。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/null通过提供2个参数,添加is it会欺骗grep打印出完整路径。


1
+1,但您忘了提及“显而易见的”:“添加文件的原因/dev/null是要确保在(空)/dev/null文件中找不到grep-ed的任何内容,因此仅输出正确的位置”
Olivier Dulac 2014年

而且,通过搜索,/dev/null您不会浪费时间浏览非空的虚拟文件。最后,搜索的意图/dev/null对于熟悉该惯用语的人来说是显而易见的。
亚历克西斯

5

man grep

-H,--with-filename

打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。

差异是由于在两种情况下用一个或两个文件参数调用grep引起的。不用添加,/dev/null您可以grep使用参数调用-H。也许该/dev/null行为得到了更广泛的支持。


3
grep -H不可移植-该/dev/null技巧在没有GNU grep的情况下有效。
克里斯·唐纳

4

第一个示例等效于对通过find表达式找到的每个文件在两个文件上运行grep 。例如,如果find认定三个文件a.txtb.txtc.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匹配,因此可以保证第一个文件的文件名匹配时将被打印。

而第二个示例等效于

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

在这种情况下,由于只有一个参数,因此不会为匹配显示文件名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.