Hacer pasar xargs como primer parámetro

53

Estoy tratando de producir este comportamiento:

grep 192.168.1 *.txt

Al pasar una cadena a grep a través de Xargs pero va al final en lugar de como el primer parámetro.

echo 192.168.1 | xargs grep  *.txt

Necesito decirle a xargs (o algo similar) que coloque la cadena entrante entre 'grep' y '*' en lugar de al final.

¿Cómo hago esto?

andy boot
fuente

Respuestas:

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

Ejemplo

Archivos de muestra:

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

Ejemplo de ejecución:

$ echo 192.168.1. | xargs -I{} grep {} *.txt
1.txt:192.168.1.
2.txt:192.168.1.
3.txt:192.168.1.
slm
fuente
Gracias funciona. ¿Pero por qué? ¿Qué estás reemplazando con -I? No lo entiendo
e18r
77
Parece que las llaves son un marcador de posición. Puede reemplazar {} con lo que quiera: echo 192.168.1. El | xargs -I pholder grep pholder * .txt
desnormalizador
3

Otro enfoque:

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

Esto no desbordará la longitud de la línea de comando del shell con demasiados nombres de archivo. Para evitar confundir xargs/ grepcon nombres de archivos que tienen espacios, -print0y las -0opciones delinearán cada nombre encontrado con un valor nulo en lugar de un LF.

Bill Hoag
fuente