ฉันจะเก็บเน้นการจับคู่ของ grep ได้อย่างไรเมื่อทำการ piping ไปที่ grep


4

หากฉันเรียกใช้grep foo bar.txtgrep จะเน้นการ "foo" ในbar.txtแต่ละครั้ง แต่บางครั้งฉันต้องการใช้findเพื่อตรวจสอบว่าไฟล์ grep ค้นหา ดังนั้นฉันจะทำสิ่งนี้:

find . -iname "*.abc" | xargs grep foo

หรือสิ่งนี้:

find . -iname "*.abc" -exec grep foo {} \;

ในทั้งสองกรณี grep ค้นหาเหตุการณ์ "foo" ในไฟล์ที่ระบุอย่างถูกต้อง แต่เอาต์พุตไม่มีการเน้นสีใด ๆ

ฉันจะใช้findเพื่อเลือกไฟล์สำหรับ grep เพื่อค้นหาโดยไม่ไฮไลต์ได้อย่างไร

ฉันใช้ Gnome Terminal 3.4.1.1 บน Ubuntu 12.04 โดยมี bash เป็น shell ของฉัน

คำตอบ:


4

ในทั้งสองคำสั่งปัญหาคือไม่grepเพียง แต่คำสั่งอื่นจะสร้างเอาต์พุตจริง ( xargsและfindตามลำดับ)

คุณสามารถแก้ไขได้โดยเรียกgrepชื่อไฟล์แต่ละชื่อโดยตรง:

IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS

หรือเป็นหนึ่งซับ:

IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS

มันทำงานอย่างไร:

  • IFS=$'\n' ตั้งค่าตัวคั่นฟิลด์ภายในเป็นอักขระขึ้นบรรทัดใหม่ (หรือช่องว่างในชื่อไฟล์จะทำให้เกิดปัญหา)

  • for FILE in $(COMMAND); do COMMANDS doneวนซ้ำไฟล์ที่ระบุโดยCOMMANDตั้งค่าตัวแปรFILEเป็นไฟล์ปัจจุบันและเรียกใช้งานCOMMANDS

  • grep foo $FILEค้นหาfooใน$FILEและส่งผลโดยตรงไปยังหน้าจอ

  • unset IFS ตั้งค่าตัวคั่นฟิลด์ภายในกลับไปเป็นค่าเริ่มต้น (ไม่จำเป็นในสคริปต์)


3

เพียงแค่grepเอาท์พุทของคุณอีกครั้งเพื่อสีมัน

ฉันทำสิ่งที่คล้ายกันที่นี่: รับข้อมูลเพิ่มเติมเกี่ยวกับการจับคู่จาก grep


2
นั่นง่ายกว่าวิธีของฉันมาก ไวยากรณ์ที่ปรับแล้วให้ใช้grepเพียงครั้งเดียวและอนุญาตให้มีช่องว่างในชื่อไฟล์:find . -iname "*.abc" -print0 | xargs -0 cat | grep foo
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.