
Я пытаюсь найти, где check_dns
определено в nagios
файле commands.cfg
, хотя файлов довольно много.
Я знаю, что можно было бы запустить что-то вроде find / -name "command.cfg" -exec grep check_dns {} \;
поиска совпадений, но если возможно, я бы хотел использовать locate
индексированную копию, так как это намного быстрее.
При беге locate commands.cfg
я получаю следующие результаты:
/etc/nagios3/commands.cfg
/etc/nagiosgrapher/nagios3/commands.cfg
/usr/share/doc/nagios3-common/examples/commands.cfg
/usr/share/doc/nagios3-common/examples/template-object/commands.cfg
/usr/share/nagiosgrapher/debian/cfg/nagios3/commands.cfg
/var/lib/ucf/cache/:etc:nagiosgrapher:nagios3:commands.cfg
Можно ли запустить locate и передать его во встроенную команду типа xargs
или что-то в этом роде, чтобы я мог получить grep
каждый из результатов? Я понимаю, что это можно сделать с помощью цикла for, но я больше хочу узнать немного bash-fu / shell-fu, чем как это сделать для этого конкретного случая.
решение1
Да, вы можете использовать xargs
это.
Например, простой:
$ locate commands.cfg | xargs grep check_dns
(При grep
обнаружении нескольких файлов выполняется поиск в каждом из них и включается печать имен файлов вместе с совпадениями.)
Или вы можете явно включить печать имени файла с помощью:
$ locate commands.cfg | xargs grep -H check_dns
(На всякий случай, если один из них grep
вызывается только с одним аргументом xargs
)
Для программ, которые принимают только один аргумент имени файла (в отличие от grep
), вы можете ограничить количество предоставленных аргументов следующим образом:
$ locate commands.cfg | xargs -n1 grep check_dns
При этом имена файлов, из которых взяты совпадающие строки, не выводятся.
Результат эквивалентен:
$ locate commands.cfg | xargs grep -h check_dns
С помощью современного locate/xargs вы также можете защититься от проблем с пробелами:
$ locate -0 commands.cfg | xargs -0 grep -H check_dns
(По умолчанию ввод разделяется пробелами xargs
, что, конечно, является проблемой, если имена файлов содержат пробелы...)