ทำเครื่องหมายการเกิดขึ้นของคำหลักที่มีสีแตกต่างกัน


13

ฉันมีโปรแกรมที่แยกออกเป็นstdoutชอบ:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

เพื่อให้ง่ายขึ้นจุดที่ล้มเหลวจากผลลัพธ์ที่ฉันต้องการทำเครื่องหมายการเกิดขึ้นของคำหลักFAILด้วยสีแดงโดยไม่ละทิ้งข้อความอื่น ๆ มันจะดีถ้าฉันยังสามารถเน้นOKคำหลักด้วยสีเขียว :)

การทำไพพ์เพื่อegrep --color FAILแสดงเฉพาะบรรทัดที่มีFAILคำหลักอยู่


1
สำหรับgrepวิธีการแก้ปัญหาดูunix.stackexchange.com/a/34322
จัดการ

คุณมีสิทธิ์เข้าถึงเพื่อเปลี่ยนรหัสต้นฉบับหรือไม่ มันเป็นสคริปต์ทุบตี?
h3rrmiller

@manatwork จากการเชื่อมโยงที่คุณระบุฉันคลิกวิธีของฉันไปstackoverflow.com/questions/972370และมีบางส่วนtail -fและawkมายากล, ฉันดีไป =)
เทโอดอร์

คำตอบ:


10

จากการmanatworkแฮ็ก "หรือไม่มีอะไร" ที่ยอดเยี่ยมในคำถามอื่น ๆ ฉันเสนอสิ่งนี้ซึ่งเพิ่มความสามารถในการรับสองสีไฮไลต์:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

นั่นคือคุณรันgrepเอาต์พุตเกินสองครั้งด้วยGREP_COLORSตัวแปรสภาวะแวดล้อมที่แตกต่างกันในแต่ละครั้ง

ค่า '01; 32 'หมายถึง "ตัวหนาสีเขียว" และอีกวิธีหนึ่งคือ "ตัวหนาสีแดง" ดูบทความ Wikipedia เกี่ยวกับรหัส ANSIสำหรับแนวคิดเพิ่มเติม

อนึ่งนี่ต้องใช้ GNU grep รุ่น 2.5.3 หรือสูงกว่า grep รุ่นเก่าของ GNU สนับสนุนกลไกการระบายสีที่แตกต่างกัน แต่เวอร์ชันเหล่านั้นมีข้อบกพร่องที่ทำให้คุณไม่สามารถใช้คุณสมบัตินี้ได้ในมากกว่าหนึ่งครั้ง BSD grep เลียนแบบ grep GNU grep แบบเก่าและมันจะทำงานสองครั้งในขั้นตอนการทำงาน แต่มันตะโกนเกี่ยวกับ "sub-expression ว่าง" เนื่องจากการmanatworkแฮ็ค

คุณสามารถลบแบ็กสแลชที่ส่วนท้ายของสองบรรทัดแรกเพื่อให้เป็นบรรทัดเดียวทั้งหมด ฉันเพิ่งแยกมันที่นี่เพื่อความชัดเจนและเล่นได้ดีกับรูปแบบหน้า SE


นั่นยอดเยี่ยมแน่นอน! แต่ด้วยเหตุผลบางอย่างสคริปต์ดูเหมือนจะไม่เน้นคำสั่งที่สองในเครื่องของฉัน ฉันใช้ CentOS 5
Theodor

2
สิ่งที่เกิดขึ้นที่นี่ก็คือ CentOS 5 จัดส่ง GNU grep เก่าพอที่จะไม่รองรับGREP_COLORSพหูพจน์ มันใช้GREP_COLORวิธีที่เก่ากว่าเท่านั้นและวิธีนั้นมีจุดบกพร่องที่ป้องกันไม่ให้ทำสิ่งที่ถูกต้อง หากคุณเปลี่ยนคำสั่งที่จะใช้GREP_COLOR=32และจะเปลี่ยนสีไฮไลต์ของการจับคู่ครั้งแรกเท่านั้น หากคุณไพพ์ผลลัพธ์ผ่านhexdump -cคุณจะเห็นว่าการเพิ่มegrepคำสั่งที่สองทำบางสิ่งบางอย่าง แต่ไม่ใช่ ANSI ที่ถูกกฎหมาย บรรทัดล่าง: คุณต้องอัพเกรดgrepเพื่อให้การทำงานถูกต้อง
Warren Young

ฮ่าฮ่านั่นเป็นความคิดเห็นที่ลึกซึ้ง ใช่ CentOS5 กำลังจะเก่าเช่นเดียวกับ OS หลาย ๆ ตัวที่ทำงานบนเครื่องเก่าที่ปล่อยข้อความบันทึกที่ถูกละทิ้งพระเจ้า :) ฉันจะพยายามดูว่าการอัพเกรดเป็น centos6 นั้นเป็นไปไม่ได้หรือไม่
Theodor

ผมได้ตรวจสอบเพียงการแก้ปัญหาของฉันใน CentOS 6 กล่องและมันไม่ทำงานมียืนยันการวินิจฉัยของฉัน (การทดสอบก่อนหน้านี้อยู่บนเซิร์ฟเวอร์ของ Ubuntu) EL6 มาพร้อมกับ GNU grep 2.6.3 ที่น่าสนใจก็คือพวกเขายังแก้ไขGREP_COLORข้อผิดพลาด (เอกพจน์) แม้ว่าคุณสมบัติจะเลิกใช้ทันทีที่ถูกแทนที่
Warren Young

ฉันไม่สามารถเข้าใจวิธีการแก้ปัญหานี้ตั้งแต่วันที่ 1 grep จะกรองออกทั้งหมด "ล้มเหลว" ดังนั้นจะมีอะไรเหลือสำหรับ grep ที่สองจะมีการแข่งขัน ..
laertis

1

คุณสามารถใช้ multitail หรือ ccze สำหรับสิ่งนี้ทั้งคู่อนุญาตให้ config เพื่ออธิบาย regexps ให้ตรงกับสี


1

จากคำตอบของ Warren Young ฉันเขียนสคริปต์ Pythonที่ทำสิ่งเดียวกันนี้ได้อย่างสวยงามและพิมพ์น้อยลง ดังนั้นนี่คือวิธีที่คุณใช้สคริปต์นั้น:

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