grep: แสดงผลลัพธ์ทั้งหมด แต่ไฮไลต์ตรงกับการค้นหา


43

ใน bash หากฉันต้องการรันคำสั่งและแสดงเฉพาะบรรทัดเอาต์พุตที่ตรงกับรูปแบบที่กำหนดฉันสามารถไพพ์ไปที่grepเช่น

ไฟล์ testfile

hello
there
my
friends

คำสั่ง

$ cat testfile | grep 'hello'
hello #this will be highlightd

นี่จะเน้นการจับคู่การค้นหาและแสดงทั้งบรรทัดที่ตรงกับ ฉันสามารถใช้-Aและ-Bเพื่อแสดงบรรทัดก่อนและหลังบรรทัดนั้น คำถามของฉันเป็นไปได้หรือไม่ที่จะรันคำสั่งและแสดงเอาต์พุตทั้งหมดตามปกติ แต่เพื่อเน้นการค้นหาที่ตรงกันอย่าง grep ดังนั้น ouput ของฉันจะเป็น

hello #highlighted
there
my
friends

คำตอบ:


38

ในการใช้ Color GREP เพื่อเน้นเฉพาะรูปแบบที่ตรงกัน แต่ไม่สามารถเปลี่ยนเอาต์พุตได้:

grep --color=always -e "^" -e "hello" testfile

รูปแบบแรกจะจับคู่ทุกบรรทัด (ทุกบรรทัดจะถูกพิมพ์) รูปแบบที่สอง (และรูปแบบต่อไปนี้) ทำให้ข้อความที่ตรงกันถูกเน้นด้วยสี

เนื่องจากรูปแบบแรกตรงกับทุกบรรทัด แต่ไม่ตรงกับอักขระที่พิมพ์ได้จึงไม่เพิ่มการเน้นสีใด ๆ เพื่อไม่ให้แข่งขัน / รบกวนการอ่านของข้อความที่เน้นสี


ทำงานร่วมกับ kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"ใน zsh
Michael Cole

สำหรับใช้ใน Bash: highlight () {grep --color = always -e "^" -e $ *; }
Jon

สิ่งนี้ใช้ได้กับ FreeBSD เช่นกันคุณเพียงแค่ต้องสลับ patern แรกและอันที่สอง ( "^"ต้องเป็นวินาที)
MariánČerný

25

เพิ่มตัวเลือก-zในคำสั่ง grep GNU ของคุณ:

cat testfile | grep --color=always -z 'hello'

หรือสั้นกว่า

grep --color=always -z 'hello' testfile

3
นี่เป็นแฮ็คที่หยาบมาก มันมีผลต่อการรักษาไฟล์ทั้งหมดเป็นบรรทัดเดียว ดังนั้น (1) หากไฟล์มีขนาดใหญ่มากอาจเป็นไปได้ว่าหน่วยความจำหมดและ (2) หากไฟล์ไม่มีรูปแบบเลยก็จะไม่มีผลลัพธ์ใด ๆ
G-Man กล่าวว่า 'Reinstate Monica'

grep รุ่นนี้รองรับอะไรได้บ้าง? ใน grep 2.5.4, -z ไม่สามารถใช้งานได้ ...
อเล็กซ์

@Alex: ฉันใช้ GNU grep รุ่น 2.6.3
Cyrus

2
@ G-Man: ประหยัดทรัพยากรมากขึ้น:grep --color "hello\|$" file
Cyrus

@Cyrus: ใช่นั่นเป็นคำตอบที่ดีกว่า น่าเสียดายที่มันเป็นคำตอบที่เทียบเท่ากับbot779 สำหรับคำถามนี้และเกือบจะเหมือนกับคำตอบที่ยอมรับ ( 1และ2 ) กับคำถามที่ฉันเชื่อมโยง
G-Man กล่าวว่า 'Reinstate Monica'

5

เช่นเดียวกับคำตอบก่อนหน้านี้คุณสามารถตรวจพบ$จุดสิ้นสุดทั้งหมด:

cat testfile | grep --color -E "hello|$"

-E(หรือ--extended-regexp) \หมายถึงว่าตัวละครเป็นพิเศษจะต้องหนีด้วย เมื่อใช้งาน|จะถือว่าเป็นเงื่อนไข "หรือ" regex

Grep |$จะจับและพิมพ์ทุกบรรทัดที่มีจุดจบ แต่เนื่องจาก $ เป็นอักขระที่ซ่อนอยู่จึงไม่สามารถเน้นได้

ปรับปรุง:

หากคุณต้องการพิมพ์ผลลัพธ์ทั้งหมด แต่กลับด้วยรหัสการออกไม่ว่าจะพบการจับคู่หรือไม่คุณสามารถใช้คำสั่ง perl:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

ถ้าคุณชอบsed - นี่คือตัวอย่างวิธีเน้นสีที่ตรงกันทั้งหมด + รหัสทางออกกลับหากไม่พบที่ตรงกัน: https://askubuntu.com/a/1200851/670392


2

อันนี้ใช้ได้กับ GNU grep และ grep บน FreeBSD:

grep --color=always 'hello\|$'

มันตรงกับข้อความ "hello" หรือ ( \|) สตริง null ที่ไม่สามารถพิมพ์ได้ในตอนท้ายของแต่ละบรรทัด ( $) นั่นเป็นสาเหตุที่ทำให้แต่ละบรรทัดพิมพ์ออกมา แต่จะเน้นเฉพาะ "hello" เท่านั้น

โอกาสที่คุณได้--color=autoกำหนดค่าในเปลือกของคุณแล้ว จากนั้นคุณอาจไม่จำเป็นต้องระบุ--color=always:

grep 'hello\|$'

นอกจากนี้คุณยังสามารถรุ่นที่ง่ายขึ้นโดยใช้egrep(ด้วยนิพจน์ทั่วไปแบบขยาย) โดยที่|"หรือ" นิพจน์ไม่จำเป็นต้องหลบหนี:

egrep 'hello|$'

สิ่งนี้ไม่ตอบวิธีแสดงบรรทัดอินพุตทั้งหมด
Chris Page

@ChrisPage ฉันจะบอกว่าทำอย่างนั้น: นั่นเป็นสาเหตุที่ทำให้แต่ละบรรทัดถูกพิมพ์แต่เฉพาะ "สวัสดี" เท่านั้นที่ถูกเน้น
MariánČerný

0

เพิ่มไปยังคำตอบด้านบน ฟังก์ชันไฮไลต์ {} ที่กล่าวถึงในความคิดเห็นจะใช้งานได้ก็ต่อเมื่อข้อมูลถูกส่งเข้ามาเท่านั้น นามแฝงต่อไปนี้ซึ่งไม่สมบูรณ์แบบมีประโยชน์มากกว่า:

alias greph="grep --color=always -e^ -e"

สิ่งนี้ใช้ได้กับคำสั่งเช่น:

greph foo bar.txt

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