
Estoy tratando de encontrar dónde check_dns
está definido en el archivo nagios
' commands.cfg
, aunque hay bastantes archivos.
Sé que podría ejecutar algo como find / -name "command.cfg" -exec grep check_dns {} \;
buscar coincidencias, pero si es posible me gustaría usarlo locate
ya que es una copia indexada y mucho más rápida.
Cuando ejecuto locate commands.cfg
obtengo los siguientes 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
¿Es posible ejecutar localizar y canalizarlo a un comando en línea como xargs
o algo así para poder obtener grep
cada uno de los resultados? Me doy cuenta de que esto se puede hacer con un bucle for, pero estoy buscando aprender algo de bash-fu/shell-fu aquí más que cómo hacerlo para este caso específico.
Respuesta1
Sí, puedes usarlo xargs
para esto.
Por ejemplo un simple:
$ locate commands.cfg | xargs grep check_dns
(Cuando grep
ve varios archivos, busca en cada uno y habilita la impresión del nombre del archivo junto con las coincidencias).
O puede habilitar explícitamente la impresión de nombres de archivos a través de:
$ locate commands.cfg | xargs grep -H check_dns
(En caso de que uno grep
sea llamado solo con 1 argumento por xargs
)
Para programas que solo aceptan un argumento de nombre de archivo (a diferencia de grep
), puede restringir la cantidad de argumentos proporcionados de esta manera:
$ locate commands.cfg | xargs -n1 grep check_dns
Eso no imprime los nombres de los archivos de donde provienen las líneas coincidentes.
El resultado es equivalente a:
$ locate commands.cfg | xargs grep -h check_dns
Con un sistema de localización/xargs moderno también puedes protegerte contra problemas de espacios en blanco:
$ locate -0 commands.cfg | xargs -0 grep -H check_dns
(De forma predeterminada, los espacios en blanco separan la entrada de xargs
, lo cual, por supuesto, es un problema cuando los nombres de los archivos contienen espacios en blanco...)