Позначте виникнення ключового слова іншим кольором


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
manatwork

у вас є доступ до зміни вихідного коду? це баш сценарій?
h3rrmiller

@manatwork За цим посиланням ви вказали я натиснув мій шлях до stackoverflow.com/questions/972370 і з деякими tail -fі awkмагії, я добре йти =)
Theodor

Відповіді:


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 'означає "жирний зелений", а інше означає "жирний червоний". Додаткову інформацію див. У статті Вікіпедії про коди ANSI .

На жаль, для цього потрібна версія GNU grep версії 2.5.3 або новішої. Старіші версії GNU grep підтримували інший механізм забарвлення, але ці версії мають помилку, яка заважає використовувати функцію в конвеєрі не один раз. BSD grep імітує старіший механізм забарвлення GNU, і він буде працювати двічі в конвеєрі, але він кричить про "порожній суб-вираз" через manatworkзлом.

Ви можете зняти косої риски в кінці перших двох рядків, щоб зробити це єдиним рядком. Я просто розділив це тут для наочності і для того, щоб грати добре з форматом сторінки SE.


Це справді геніально! Але чомусь сценарій не підкреслює друге твердження на моїй машині. Я запускаю CentOS 5.
Теодор

2
Тут відбувається те, що CentOS 5 надсилає GNU grep досить старого, що він не підтримує GREP_COLORS, множину. Він використовує лише старіший GREP_COLORметод, і цей метод має помилку в ньому, що заважає йому робити правильно. Якщо ви зміните команду на використання GREP_COLOR=32та інше, вона змінить колір підсвітки лише першого поєднання. Якщо ви передаєте результат через, hexdump -cви можете бачити, що додавання другої egrepкоманди щось робить, але це не є законним ANSI. Підсумок: вам потрібно оновити, grepщоб це працювало правильно.
Warren Young

Ха-ха, це такий проникливий коментар. Так, CentOS5 набуває старого вигляду, як і в багатьох ОС: s працює на старій машині, виплюнувши старі, бог покинуті повідомлення журналу :) Я спробую перевірити, чи не можливе оновлення до centos6.
Теодор

Я тільки що перевірив моє рішення на CentOS 6 коробки, і це робить роботу там, що підтверджують мій діагноз. (Раніші тести були на серверах Ubuntu.) EL6 поставляється з GNU grep 2.6.3. Цікаво, що вони також виправили GREP_COLOR(єдину) помилку, хоча функція була припинена, як тільки її замінили.
Warren Young

Я не можу зрозуміти, як це вирішує проблему, оскільки 1-й греп буде відфільтровувати всі "FAIL", тому нічого не залишиться, щоб відповідати другому
грепу

1

Ви можете використовувати multitail або ccze для цього, обидва дозволяють конфігураціям описувати регулярні вирази відповідно до кольорів.


1

На основі відповіді Воррена Янга я написав цей сценарій Python, який робить те ж саме елегантніше і з набагато меншим набором тексту. Ось так ви використовуєте цей сценарій:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.