ฉันรู้วิธีการ 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)