grep: วิธีระบายสีคำหลัก 2 คำอย่างไร


12

ฉันรู้วิธีการ grep 2 คำหลักโดยใช้คำสั่ง 1 แต่ฉันสามารถจัดการเพื่อสีหนึ่งของพวกเขาในการส่งออก นี่คือคำสั่งของฉัน:

grep 'keyword1' file.log | grep 'keyword2'

เพียง แต่keyword2เป็นไฮไลต์ ฉันจะkeyword1เน้นในเวลาเดียวกันได้อย่างไร

คำตอบ:


15

grepคำสั่งยอมรับ--color=alwaysตัวเลือกเพื่อให้คุณสามารถใช้

grep 'keyword1' file.log --color=always | grep 'keyword2'

ตามที่gertvdijk ชี้ให้เห็นคำสั่งนี้อาจไม่มีประสิทธิภาพ แต่จะค้นหาบรรทัดทั้งหมดที่มีทั้ง keyword1 และ keyword2 หากคุณต้องการเน้นสีที่แตกต่างกันคุณสามารถใช้

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

ซึ่งจะเน้นคำหลัก 2 เป็นสีน้ำเงิน mtส่วนวิธีการที่grepจะเน้นการจับคู่ข้อความนี้โดยใช้รหัส CSIและ01;34หมายถึง "เบื้องหน้าสีฟ้าตัวหนาบนพื้นหลังปกติ"


1
+1 สำหรับคำอธิบายโดยละเอียดและตัวเลือกการปรับแต่งสำหรับกรณีการใช้งาน!
gertvdijk

ตลกเมื่อฉันลองนี้ด้วย: grep -R --color = always keyword1 | grep keyword2 // เฉพาะคำหลักแรกที่ถูกไฮไลต์ ฉันจะปรับคำตอบของคุณให้ทำงานกับการค้นหาแบบเรียกซ้ำได้อย่างไร
TenLeftFingers

1
น่าแปลกที่grep -R --color=always keyword1 . | grep keyword2ควรจะทำงาน คุณเปลี่ยนเส้นทางเอาต์พุตอีกครั้ง (เช่นโดยการไพพ์วินาทีgrepเข้าless -R)? ถ้าเป็นเช่นนั้นคุณจะต้องเพิ่ม--color=alwaysเข้าไปในอันที่สองด้วย
Daniel H

คำตอบที่ดี! ในการไฮไลต์ทั้งสองอย่าง a --color=autoจำเป็นสำหรับวินาทีที่สองgrepหลังจาก'keyword2'นั้น
Luis

@ Luis ใช่คุณพูดถูกที่ Grep อย่างน้อยมักจะเป็นค่าเริ่มต้นที่ไม่มีสี (แม้ว่าอาจจะเป็นตัวเลือกกำหนดเวลาได้หรือไม่ฉันไม่คิดว่าฉันจะถูกแทนที่ในปี 2013 เมื่อมันทำงานบนเครื่องของฉันโดยที่ไม่ ... ) ฉันเพิ่ม--color=alwaysไปยังคำตอบเพราะคุณอาจต้องการไปป์lessหรืออะไรบางอย่างด้วย
Daniel H

3

ลองใช้นิพจน์ทั่วไปที่เกิดขึ้นจริงแทนที่จะส่งไปยังอินสแตนซ์อื่นของgrepเช่น:

grep -E "\<foo\>.*\<bar\>" file

ข้อ จำกัด นี้สำหรับการจับคู่บรรทัดที่คำหลักนี้ตรงกันในคำสั่งนี้เท่านั้นขออภัย อย่างไรก็ตามการใช้grepคำถามของคุณค่อนข้างไม่มีประสิทธิภาพและคุณควรหลีกเลี่ยง คำตอบของ @DanielHสวยตรงไปตรงมามากขึ้นสำหรับกรณีของคุณอาจจะเป็น

สำหรับการจับคู่ 'หรือ' คำหลักฉันใช้สิ่งนี้เป็นประจำ:

grep -E "(foo|bar)" file

1
ฉันคิดว่า OP ต้องการเพียงบรรทัดที่มีคำหลักทั้งสอง (คำสั่งที่คุณให้ไว้จะให้ทุกบรรทัดที่มีคำใดคำหนึ่ง)
Daniel H

@DanielH ขอบคุณที่ชี้ให้เห็น ฉันอัพเดตคำตอบแล้ว
gertvdijk

นั่นยังไม่ทำงานหาก foo มาก่อนบาร์หรือไม่ ฉันไม่ทราบว่ามีวิธีที่ดีกว่าfoo.*bar|bar.*fooหรือว่าเป็นสิ่งที่จำเป็นสำหรับกรณีนี้ (ซึ่งดูเหมือนจะเป็นไฟล์บันทึกซึ่งอาจมีลำดับมาตรฐานสำหรับคำหลัก) ผมเพิ่มคำตอบของฉันก่อนที่คุณจะอัปเดตของคุณ แต่ฉันจะให้มันไปรอบ ๆ ในกรณีที่มีสถานการณ์ที่ถูกล่ามโซ่grepจริงๆมีความจำเป็น (หรือเอาท์พุทเวลาอื่นสีไม่ควรที่จะส่งไปยังสถานีเช่นgrep | less -R)
Daniel H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.