ทำให้ xargs ผ่านเป็นพารามิเตอร์ตัวแรก


53

ฉันพยายามที่จะสร้างพฤติกรรมนี้:

grep 192.168.1 *.txt

โดยการส่งผ่านสตริงไปยัง grep ผ่าน Xargs แต่มันจะไปที่จุดสิ้นสุดแทนที่จะเป็นพารามิเตอร์ตัวแรก

echo 192.168.1 | xargs grep  *.txt

ฉันต้องบอก xargs (หรือบางอย่างที่คล้ายกัน) เพื่อใส่สตริงที่เข้ามาระหว่าง 'grep' และ '*' แทนที่จะเป็นที่สิ้นสุด

ฉันจะทำสิ่งนี้ได้อย่างไร


คำตอบ:


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

ตัวอย่าง

ไฟล์ตัวอย่าง:

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

ตัวอย่างการเรียกใช้:

$ echo 192.168.1. | xargs -I{} grep {} *.txt
1.txt:192.168.1.
2.txt:192.168.1.
3.txt:192.168.1.

ขอบคุณมันใช้งานได้ แต่ทำไม คุณกำลังแทนที่อะไรด้วย -I? ฉันไม่เข้าใจ
e18r

6
ดูเหมือนว่าวงเล็บปีกกาจะเป็นที่ยึด คุณสามารถแทนที่ {} ด้วยสิ่งที่คุณต้องการ: echo 192.168.1 | xargs -I pholder grep pholder * .txt
denormalizer

3

วิธีอื่น:

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

สิ่งนี้จะไม่ล้นความยาวบรรทัดคำสั่งของเชลล์ที่มีชื่อไฟล์มากเกินไป เพื่อหลีกเลี่ยงความสับสนxargs/ grepกับชื่อไฟล์ที่มีช่องว่าง-print0และ-0ตัวเลือกจะแยกแต่ละชื่อที่พบด้วย null แทนที่จะเป็น LF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.