การค้นหา grep -r โดยค่าเริ่มต้นอยู่ที่ไหน


16

ฉันพบว่าฉันค้นหาโดยใช้ grep โดยไม่ระบุเส้นทางเหมือนgrep -r 'mytext'ใช้เวลานานมาก ในขณะเดียวกันถ้าฉันค้นหาด้วยพา ธ ที่ระบุgrep -r 'mytext' .มันจะค้นหาสิ่งที่ฉันต้องการได้ทันที ดังนั้นฉันอยากรู้ว่าในรูปแบบแรกในไดเรกทอรีใด grep ค้นหา?

UDATE: รุ่น grep: grep (GNU grep) 2.10


3
ลองพิมพ์ไปเขียนfoomytextbar(ตามด้วย Enter) grep -r 'mytext'หลังจากทำงาน
sr_

2
บางทีคุณควรระบุว่าราชาแห่งgrepนั้นคืออะไร ด้วย GNU grepฉันใช้บน Linux grep -r 'mytext'และgrep -r 'mytext' .ทำสิ่งเดียวกัน: ค้นหาซ้ำเริ่มจากไดเรกทอรีปัจจุบัน เมื่อใช้-rสวิตช์ GNU จะgrep ไม่ค้นหา STDIN
จัดการ

2
อา. ฉันทดสอบด้วยgrep2.12: pastebin.com/L4my26QSในขณะเดียวกันฉันพบสิ่งนี้ในไฟล์ NEWS เกี่ยวกับรุ่น 2.11 (2012-03-02): "ถ้าไม่มีตัวถูกดำเนินการไฟล์และตัวเลือกบรรทัดคำสั่ง -r หรือเทียบเท่า ตอนนี้ grep ค้นหาไดเรกทอรีการทำงานก่อนหน้านี้ grep เพิกเฉยกับ -r และค้นหาอินพุตมาตรฐานแบบไม่ซ้ำซ้อน -r ที่พบใน GREP_OPTIONS ไม่มีผลใหม่นี้ "
จัดการ

3
grep GNU เพิ่งเปลี่ยนพฤติกรรมด้วยอาร์กิวเมนต์ -r (ดูการกระทำ ) ดังนั้น "grep -r PATTERN" ด้วย grep ที่ใหม่กว่าจะค้นหาไดเรกทอรีปัจจุบันไม่ใช่ STDIN
hluk

2
@Mikel ฉันได้อัปเดตคำถามของฉันด้วยเวอร์ชัน grep ดูเหมือนว่าคำตอบที่ฉันชี้ว่าถูกต้องนั้นเป็นสิ่งที่ถูกต้องเพราะฉันใช้ grep 'เก่า' ดังนั้นมันไม่สำคัญว่าฉันจะระบุ -r หรือไม่ถ้าไม่มีไดเรกทอรีให้มันค้นหาใน STDIN Btw ขอบคุณสำหรับการตรวจสอบนั้นตอนนี้ฉันจะได้ตระหนักถึงการเปลี่ยนแปลงในอนาคตใน grep;)

คำตอบ:


24

จริงๆแล้วมันไม่ได้ค้นหาที่ไหนเลย มันจะรออินพุตจากอินพุตมาตรฐาน

ลองสิ่งนี้:

beast:~ viroos$ grep foo

เมื่อคุณพิมพ์บรรทัดที่มี "foo" และกด Enter บรรทัดนี้จะถูกทำซ้ำมิฉะนั้นเคอร์เซอร์จะถูกย้ายไปที่บรรทัดใหม่ แต่ grep จะไม่พิมพ์อะไรเลย


6
ที่ฉันแสดงความคิดเห็นข้างต้นgrep -r PATTERNกับ grep GNU รุ่นใหม่กว่าจะไม่อ่านอินพุตมาตรฐาน แต่ค้นหารูปแบบในไดเรกทอรีปัจจุบัน (ดูการกระทำ ) การเปลี่ยนแปลงนี้สมเหตุสมผลเนื่องจากคุณอาจไม่ต้องการค้นหาอินพุตมาตรฐานเมื่อคุณระบุการ-rตั้งค่าสถานะ
hluk

ฉันตรวจสอบเวอร์ชั่น grep ของฉันมันคือ 2.10 ดังนั้นคำตอบนี้จึงมีความเกี่ยวข้องอย่างสมบูรณ์ Btw ตอนนี้ฉันจะรู้ว่าต้องรออะไรจาก grep รุ่นใหม่

3

เหมือนคำตอบก่อนหน้าโดย Maciek พูดว่า:

จริงๆแล้วมันไม่ได้ค้นหาที่ไหนเลย มันจะรออินพุตจากอินพุตมาตรฐาน

อย่างไรก็ตามคุณสามารถเขียนลงใน stdin ของโปรแกรมที่กำลังรันอยู่หากคุณมี / proc พร้อมใช้งานโดยการไพพ์ข้อมูลลงในมันเป็นตัวบ่งชี้แรก 0:

ในการวิ่งครั้งเดียว

grep "hello"

และดูมันรอไปเรื่อย ๆ ... ในเทอร์มินัลอื่นพิมพ์สิ่งนี้:

echo "hello $USER" > /proc/`pgrep grep`/fd/0

ดูเทอร์มินัลแรกพิมพ์สวัสดีและชื่อผู้ใช้ของคุณ

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