Как мне действовать по результатам команды «locate»?

Как мне действовать по результатам команды «locate»?

Я пытаюсь найти, где 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, что, конечно, является проблемой, если имена файлов содержат пробелы...)

Связанный контент