Como posso agir sobre os resultados do comando “locate”?

4

Estou tentando descobrir onde check_dns está definido no arquivo nagios ' commands.cfg , embora haja alguns arquivos.

Sei que posso executar algo como find / -name "command.cfg" -exec grep check_dns {} \; para pesquisar correspondências, mas, se possível, gostaria de usar locate , pois é 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 o locate e canalizá-lo para um comando in-line como xargs ou algo assim para que eu possa grep de cada um dos resultados? Eu percebo que isso pode ser feito com um loop for, mas eu estou olhando para pegar alguns bash-fu / shell-fu aqui mais do que como fazê-lo para este caso específico.

    
por cwd 26.03.2012 / 20:34

1 resposta

8

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 deles e ativa a impressão de nomes de arquivo ao longo das correspondências.)

Ou você pode ativar explicitamente a impressão de nome de arquivo por meio de:

$ locate commands.cfg | xargs grep -H check_dns

(Apenas no caso de um grep ser chamado apenas com 1 argumento por xargs )

Para programas que aceitam apenas um argumento de nome de arquivo (diferente de grep ), você pode restringir o número de argumentos fornecidos como este:

$ locate commands.cfg | xargs -n1 grep check_dns

Isso não imprime os nomes dos arquivos de onde as linhas são correspondentes.

O resultado é equivalente a:

$ locate commands.cfg | xargs grep -h check_dns

Com um moderno locate / xargs, você também pode proteger contra problemas de espaço 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 os nomes dos arquivos contêm espaço em branco ...)

    
por 26.03.2012 / 20:40