พิจารณาไฟล์อินพุตต่อไปนี้:
1
2
3
4
วิ่ง
{ grep -q 2; cat; } < infile
ไม่พิมพ์อะไรเลย ฉันคาดว่าจะพิมพ์
3
4
ฉันสามารถรับผลลัพธ์ที่คาดหวังได้หากเปลี่ยนเป็น
{ sed -n 2q; cat; } < infile
เหตุใดคำสั่งแรกไม่พิมพ์ผลลัพธ์ที่ต้องการ
มันเป็นไฟล์อินพุตที่หาได้และเป็นไปตามมาตรฐานภายใต้OPTIONS :
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
และเพิ่มเติมลงไปภายใต้การใช้งานแอปพลิเคชัน (เน้นการเน้นของฉัน):
-q
ตัวเลือกให้หมายถึงการได้อย่างง่ายดายกำหนดหรือไม่รูปแบบ (หรือสตริง) ที่มีอยู่ในกลุ่มของไฟล์ เมื่อทำการค้นหาหลาย ๆ ไฟล์มันให้การปรับปรุงประสิทธิภาพ ( เพราะมันสามารถออกได้ทันทีที่พบคู่แรก ) [... ]
ตอนนี้ตามมาตรฐานเดียวกัน (ในบทนำภายใต้ไฟล์ INPUT )
เมื่อสาธารณูปโภคมาตรฐานอ่านแฟ้มใส่ seekable และสิ้นสุดลงโดยไม่ต้องมีข้อผิดพลาดก่อนที่จะถึงจุดสิ้นสุดของแฟ้ม, ยูทิลิตี้ต้องมั่นใจว่าไฟล์ชดเชยในรายละเอียดไฟล์ที่เปิดอยู่ในตำแหน่งที่ถูกต้องเพียงอดีตไบต์ที่ผ่านมาประมวลผลโดยยูทิลิตี้ [ .. ]
tail -n +2 file
(sed -n 1q; cat) < file
...
คำสั่งที่สองเทียบเท่ากับคำสั่งแรกก็ต่อเมื่อสามารถค้นหาไฟล์ได้
เหตุใดจึงgrep -q
ใช้ไฟล์ทั้งหมด?
นี่คือgnu grep
ถ้ามันเป็นเรื่องสำคัญ (แม้ว่าKusalanandaเพิ่งยืนยันว่าเกิดขึ้นเดียวกันใน OpenBSD)
grep
เป็นทางแยกของสิ่งที่เรียกว่าFreeGrepหากใครสงสัย