ฉันรู้วิธีการ grep 2 คำหลักโดยใช้คำสั่ง 1 แต่ฉันสามารถจัดการเพื่อสีหนึ่งของพวกเขาในการส่งออก นี่คือคำสั่งของฉัน:
grep 'keyword1' file.log | grep 'keyword2'
เพียง แต่keyword2
เป็นไฮไลต์ ฉันจะkeyword1
เน้นในเวลาเดียวกันได้อย่างไร
ฉันรู้วิธีการ grep 2 คำหลักโดยใช้คำสั่ง 1 แต่ฉันสามารถจัดการเพื่อสีหนึ่งของพวกเขาในการส่งออก นี่คือคำสั่งของฉัน:
grep 'keyword1' file.log | grep 'keyword2'
เพียง แต่keyword2
เป็นไฮไลต์ ฉันจะkeyword1
เน้นในเวลาเดียวกันได้อย่างไร
คำตอบ:
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
หมายถึง "เบื้องหน้าสีฟ้าตัวหนาบนพื้นหลังปกติ"
grep -R --color=always keyword1 . | grep keyword2
ควรจะทำงาน คุณเปลี่ยนเส้นทางเอาต์พุตอีกครั้ง (เช่นโดยการไพพ์วินาทีgrep
เข้าless -R
)? ถ้าเป็นเช่นนั้นคุณจะต้องเพิ่ม--color=always
เข้าไปในอันที่สองด้วย
--color=auto
จำเป็นสำหรับวินาทีที่สองgrep
หลังจาก'keyword2'
นั้น
--color=always
ไปยังคำตอบเพราะคุณอาจต้องการไปป์less
หรืออะไรบางอย่างด้วย
ลองใช้นิพจน์ทั่วไปที่เกิดขึ้นจริงแทนที่จะส่งไปยังอินสแตนซ์อื่นของgrep
เช่น:
grep -E "\<foo\>.*\<bar\>" file
ข้อ จำกัด นี้สำหรับการจับคู่บรรทัดที่คำหลักนี้ตรงกันในคำสั่งนี้เท่านั้นขออภัย อย่างไรก็ตามการใช้grep
คำถามของคุณค่อนข้างไม่มีประสิทธิภาพและคุณควรหลีกเลี่ยง คำตอบของ @DanielHสวยตรงไปตรงมามากขึ้นสำหรับกรณีของคุณอาจจะเป็น
สำหรับการจับคู่ 'หรือ' คำหลักฉันใช้สิ่งนี้เป็นประจำ:
grep -E "(foo|bar)" file
foo.*bar|bar.*foo
หรือว่าเป็นสิ่งที่จำเป็นสำหรับกรณีนี้ (ซึ่งดูเหมือนจะเป็นไฟล์บันทึกซึ่งอาจมีลำดับมาตรฐานสำหรับคำหลัก) ผมเพิ่มคำตอบของฉันก่อนที่คุณจะอัปเดตของคุณ แต่ฉันจะให้มันไปรอบ ๆ ในกรณีที่มีสถานการณ์ที่ถูกล่ามโซ่grep
จริงๆมีความจำเป็น (หรือเอาท์พุทเวลาอื่นสีไม่ควรที่จะส่งไปยังสถานีเช่นgrep | less -R
)