Помечать вхождения ключевого слова другим цветом


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ключевые слова зеленым :).

Выполнение канала to egrep --color FAILпокажет только строки, где присутствует FAILключевое слово.


1
Для grepрешения см. Unix.stackexchange.com/a/34322
manatwork

у вас есть доступ для изменения исходного кода? это скрипт bash?
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 поддерживали другой механизм раскраски, но в этих версиях есть ошибка, которая не позволяет вам использовать эту функцию в конвейере более одного раза. Grep BSD эмулирует более старый механизм окраски grep GNU, и он будет работать дважды в конвейере, но он кричит о "пустом подвыражении" из-за manatworkвзлома.

Вы можете удалить обратную косую черту в конце первых двух строк, чтобы сделать все это одной строкой. Я просто разделил это здесь для ясности и чтобы играть хорошо с форматом страницы SE.


Это действительно блестяще! Но по какой-то причине сценарий, кажется, не выделяет второе утверждение на моей машине. Я использую CentOS 5.
Theodor

2
Здесь происходит то, что CentOS 5 поставляет GNU grep, достаточно старый, чтобы не поддерживать GREP_COLORSмножественное число. Он использует только старый GREP_COLORметод, и этот метод содержит ошибку, которая мешает ему делать правильные вещи. Если вы измените команду для использования GREP_COLOR=32и тому подобное, она изменит цвет выделения только для первого совпадения. Если вы передадите результат через конвейер, hexdump -cвы увидите, что добавление второй egrepкоманды что-то делает, но это не разрешено ANSI. Итог: вы должны обновить, grepчтобы заставить это работать правильно.
Уоррен Янг

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

Я только что проверил мое решение на CentOS 6 коробки, и это делает работу там, подтверждающие мой диагноз. (Предыдущие тесты проводились на серверах Ubuntu.) EL6 поставляется с GNU grep 2.6.3. Интересно, что они также исправили GREP_COLOR(единственную) ошибку, несмотря на то, что эта функция устарела после замены.
Уоррен Янг

Я не могу понять, как это решает проблему, так как 1-й grep отфильтровывает все "FAIL", поэтому для второго grep ничего не останется, чтобы соответствовать ..
laertis

1

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


1

Основываясь на ответе Уоррена Янга, я написал этот скрипт на Python, который делает то же самое более элегантно и с гораздо меньшим набором текста. Вот как вы должны использовать этот скрипт:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.