
Estou tentando descobrir onde check_dns
está definido no arquivo nagios
' commands.cfg
, embora existam alguns arquivos.
Sei que poderia rodar algo parecido find / -name "command.cfg" -exec grep check_dns {} \;
com procurar correspondências, mas se possível gostaria de usar locate
já que é uma cópia indexada e muito mais rápida.
Quando executo locate commands.cfg
obtenho os seguintes resultados:
/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
É possível executar localizar e canalizá-lo para um comando embutido como xargs
ou algo assim para que eu possa obter grep
cada um dos resultados? Sei que isso pode ser feito com um loop for, mas estou procurando aprender mais sobre bash-fu / shell-fu aqui do que como fazê-lo para este caso específico.
Responder1
Sim, você pode usar xargs
para isso.
Por exemplo um simples:
$ locate commands.cfg | xargs grep check_dns
(Quando grep
vê vários arquivos, ele pesquisa em cada um e permite a impressão do nome do arquivo junto com as correspondências.)
Ou você pode ativar explicitamente a impressão do nome do arquivo por meio de:
$ locate commands.cfg | xargs grep -H check_dns
(Caso um grep
seja chamado apenas com 1 argumento por xargs
)
Para programas que aceitam apenas um argumento de nome de arquivo (ao contrário de grep
), você pode restringir o número de argumentos fornecidos assim:
$ locate commands.cfg | xargs -n1 grep check_dns
Isso não imprime os nomes dos arquivos de onde vêm as linhas correspondentes.
O resultado é equivalente a:
$ locate commands.cfg | xargs grep -h check_dns
Com um localizar/xargs moderno, você também pode se proteger contra problemas de espaços em branco:
$ locate -0 commands.cfg | xargs -0 grep -H check_dns
(Por padrão, o espaço em branco separa a entrada de xargs
- o que é obviamente um problema quando seus nomes de arquivos contêm espaços em branco ...)