Faire passer xargs en premier paramètre

53

J'essaie de produire ce comportement:

grep 192.168.1 *.txt

En passant une chaîne dans grep via Xargs mais cela passe à la fin plutôt que comme premier paramètre.

echo 192.168.1 | xargs grep  *.txt

J'ai besoin de dire à xargs (ou quelque chose de similaire) de mettre la chaîne entrante entre 'grep' et '*' au lieu de la fin.

Comment puis-je faire cela?

Andy Boot
la source

Réponses:

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

Exemple

Exemples de fichiers:

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

Exemple d'exécution:

$ echo 192.168.1. | xargs -I{} grep {} *.txt
1.txt:192.168.1.
2.txt:192.168.1.
3.txt:192.168.1.
slm
la source
Merci, ça marche. Mais pourquoi? Que remplacez-vous avec -I? Je ne comprends pas.
e18r
7
Il semble que les accolades sont un titulaire. Vous pouvez remplacer {} par ce que vous voulez: echo 192.168.1. | xargs -I pholder grep pholder * txt
denormalizer
3

Une autre approche:

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

Cela ne surchargera pas la longueur de la ligne de commande du shell avec trop de noms de fichiers. Pour éviter la confusion entre xargs/ grepavec des noms de fichiers qui ont des espaces, -print0et les -0options délimiteront chaque nom trouvé avec un nul plutôt qu'une LF.

Bill Hoag
la source