สองหาคำสั่งเปรียบเทียบ


12

เมื่อเร็ว ๆ นี้ฉันได้รับfindหนึ่งซับ แต่ฉันไม่สามารถอธิบายได้ว่าความแตกต่างของสองด้านล่างมาจากไหน:

ตัวอย่างที่ 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

ตัวอย่างที่ 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

อย่างที่คุณเห็นในไฟล์แรกมีไฟล์เฉพาะที่สตริงนี้มาจากและจนถึงตอนนี้ฉันไม่สามารถรู้ได้ว่าทำไมมันถึงเกิดขึ้น

คำตอบ:


17

คุณกำลังบอก grep เพื่อค้นหา 2 ตำแหน่ง grep แสดงที่ตั้งแบบเต็มเมื่อค้นหาหลายสถานที่เท่านั้น

ตัวอย่างเช่น

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

สังเกตว่าถ้าฉันค้นหาไฟล์เพียง 1 ไฟล์ grep จะข้ามชื่อไฟล์

grep -i "foo" /tmp/herp
foo

แต่ถ้าฉันระบุตำแหน่งการค้นหาหลายแห่ง grep จะบอกตำแหน่งที่พบในการแข่งขันแต่ละครั้ง

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

การเพิ่ม/dev/nullคือมันหลอกให้ grep ทำการพิมพ์เส้นทางแบบเต็มโดยกำหนด 2 อาร์กิวเมนต์


1
+1 แต่คุณลืมพูดถึง "ชัดเจน": "เหตุผลที่เพิ่มไฟล์/dev/nullเพื่อให้แน่ใจว่าสิ่งที่เป็น grep-ed จะไม่พบในไฟล์ (ว่าง) /dev/nullดังนั้นเฉพาะตำแหน่งที่ถูกต้องจะถูกส่งออก"
Olivier Dulac

แต่ด้วยการค้นหา/dev/nullคุณไม่ต้องเสียเวลาในการค้นหาไฟล์ดัมมี่ที่ไม่ว่างเปล่า และในที่สุดความตั้งใจในการค้นหา/dev/nullนั้นชัดเจนสำหรับผู้ที่คุ้นเคยกับสำนวนนี้
alexis

5

man grep:

-H, - ด้วยชื่อไฟล์

พิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง นี่คือค่าเริ่มต้นเมื่อมีมากกว่าหนึ่งไฟล์ที่จะค้นหา

ความแตกต่างเป็นผลมาจาก grep ที่ถูกเรียกด้วยหนึ่งหรือสองอาร์กิวเมนต์ไฟล์ในสองกรณี แทนการเพิ่ม/dev/nullคุณสามารถเรียกกับการโต้แย้งgrep -Hบางที/dev/nullพฤติกรรมนั้นได้รับการสนับสนุนอย่างกว้างขวางมากขึ้น


3
grep -Hไม่สามารถพกพาได้ - /dev/nullเคล็ดลับใช้งานได้โดยไม่มี grep GNU
Chris Down

4

ตัวอย่างแรกเทียบเท่ากับการรัน grep มากกว่าสองไฟล์สำหรับแต่ละไฟล์ที่พบว่าเป็นผลมาจากการfindแสดงออก ตัวอย่างเช่นถ้าfindพบสามไฟล์a.txt, b.txtและc.txtจากนั้นgrepจะทำงานเป็น

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

ซึ่งgrepจะแสดงชื่อไฟล์ที่เอาต์พุตตรงกัน เนื่องจากไม่มีสิ่งใดตรงกับ / dev / null จึงรับประกันได้ว่าชื่อไฟล์ของไฟล์แรกจะถูกพิมพ์หากตรงกับ

ในขณะที่ตัวอย่างที่สองมีค่าเท่ากับ

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

ในกรณีนี้ชื่อไฟล์จะไม่ถูกพิมพ์สำหรับการแข่งขันเนื่องจากมีเพียงหนึ่งอาร์กิวเมนต์

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