Два порівняння команд пошуку


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

Як бачите, у першому є конкретний файл, з якого походить цей рядок, і поки я дійсно не в змозі з’ясувати, чому це відбувається.

Відповіді:


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це, він обмацує grep для друку повного шляху, надавши 2 аргументи.


1
+1, але ви забули згадати "очевидне": "Причина доданого файлу полягає в /dev/nullтому, щоб бути впевненим у тому, що все, що є grep-ed, не буде знайдено у (порожньому) /dev/nullфайлі, тому лише правильні місця перекреслюються"
Олів'є Дулак

Але також шляхом пошуку /dev/nullви не витрачаєте часу на пошук непустого файла-манекена. І нарешті, наміри пошуку /dev/nullочевидні тим, хто знайомий з цією ідіомою.
alexis

5

man grep:

-H, --з ім'ям файлу

Роздрукуйте ім’я файлу для кожного матчу. Це за замовчуванням, коли для пошуку потрібно більше одного файлу.

Різниця є результатом виклику grep з одним або двома аргументами файлів у двох випадках. Замість додавання /dev/nullви можете зателефонувати grepза допомогою аргументу -H. Можливо, /dev/nullповедінка більш широко підтримується.


3
grep -Hне є портативним - /dev/nullфокус працює без GNU grep.
Кріс Даун

4

Перший приклад еквівалентний виконанню grep над двома файлами для кожного файлу, знайденого в результаті findвиразу. Наприклад, якщо findзнайде три файли a.txt, b.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, гарантується, що ім'я першого файла буде надруковано, якщо воно збігається.

В той час, як другий приклад еквівалентний

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

У такому випадку ім'я файлу не буде надруковано для збігів, оскільки існує лише один аргумент.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.