Lasse Xargs als ersten Parameter übergeben

53

Ich versuche, dieses Verhalten zu erzeugen:

grep 192.168.1 *.txt

Durch die Übergabe eines Strings an grep über Xargs wird dieser aber am Ende statt als erster Parameter übergeben.

echo 192.168.1 | xargs grep  *.txt

Ich muss xargs (oder etwas Ähnliches) anweisen, den eingehenden String zwischen 'grep' und '*' zu setzen, anstatt am Ende.

Wie mache ich das?

Andy Boot
quelle

Antworten:

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

Beispiel

Beispieldateien:

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

Beispiellauf:

$ echo 192.168.1. | xargs -I{} grep {} *.txt
1.txt:192.168.1.
2.txt:192.168.1.
3.txt:192.168.1.
slm
quelle
Danke, es funktioniert. Aber wieso? Was ersetzen Sie durch -I? Ich verstehe es nicht.
e18r
6
Es scheint, dass die geschweiften Klammern ein Platzhalter sind. Sie können {} durch alles ersetzen, was Sie möchten: Echo 192.168.1. | xargs -I pholder grep pholder * .txt
denormalizer
3

Ein anderer Ansatz:

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

Dadurch wird die Befehlszeilenlänge der Shell bei zu vielen Dateinamen nicht überschritten. Um zu vermeiden , verwirrend xargs/ grepmit Dateinamen , die Leerzeichen enthalten, -print0und -0Optionen werden jeden gefundenen Namen mit einem Null anstelle eines LF umreißen.

Bill Hoag
quelle