Faça xargs passar como primeiro parâmetro

53

Estou tentando produzir esse comportamento:

grep 192.168.1 *.txt

Ao passar uma string para o grep via Xargs, ela continua no final e não como o primeiro parâmetro.

echo 192.168.1 | xargs grep  *.txt

Eu preciso dizer ao xargs (ou algo semelhante) para colocar a string de entrada entre 'grep' e '*' em vez de no final.

Como eu faço isso?

andy boot
fonte

Respostas:

83
$ echo 192.168.1. | xargs -I{} grep {} *.txt

Exemplo

Arquivos de exemplo:

$ cat {1..3}.txt
192.168.1
192.168.1
192.168.1

Exemplo de execução:

$ echo 192.168.1. | xargs -I{} grep {} *.txt
1.txt:192.168.1.
2.txt:192.168.1.
3.txt:192.168.1.
slm
fonte
Obrigado, funciona. Mas por que? O que você está substituindo por -I? Eu não entendo.
e18r
6
Parece que os colchetes são um espaço reservado. Você pode substituir {} por qualquer coisa que desejar: echo 192.168.1. | xargs -I pholder grep pholder * .txt
denormalizer
3

Outra abordagem:

find . -name \*.txt -print0 | xargs -0 grep 192.168.1

Isso não excederá o comprimento da linha de comando do shell com muitos nomes de arquivos. Para evitar confundir xargs/ grepcom nomes de arquivos que têm espaços, -print0e -0opções irá delinear cada nome encontrado com um nulo em vez de um LF.

Bill Hoag
fonte