LINUX.ORG.RU

Гибконастраиваемая подсветка логов. Хочу.

 ,


3

1

Для разбора больших логов иногда применяю перловую конструкцию вида

echo -e "string1\nerror\nsuccess\nstring2\nfail" |\
    perl -p -e 's/(success)/\e[1;32;10m$&\e[0m/g;' -e 's/(error|fail)/\e[0;31;10m$&\e[0m/g'
чтобы подсветить success зелёным, ошибочные сообщения красным (остальные строки *тоже выводятся*, пусть и не так важны, поэтому grep не котируется)
Но в некоторых случаях было бы полезнее подсветить значения после маркера, а не сам маркер, т.е. в строках
Marker1: value1
Marker2: value2
надо подсветить value1 и value2, зная только имя маркеров.
На это моего знания perl/sed уже не хватает, плиз хелп

★★★★★

Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Спасибо, но железка на которой приходится делать смотреть логи слишком консервативная, дополнительный софт не подходит

zolden ★★★★★
() автор топика

Быдлокод, но думаю, сойдёт. ;)

#!/usr/bin/perl -w

while (<>) {
        if (m/success/) {
                s/([^\w]+)(.*)/$1\e[1;32;10m$2\e[0m/;
        }
        if (m/error|fail/) {
                s/([^\w]+)(.*)/$1\e[0;31;10m$2\e[0m/;
        }
        print $_;
}
beastie ★★★★★
()
#!/bin/bash

default=$(tput op)
red=$(tput setaf 1 || tput AF 1)
green=$(tput setaf 2 || tput AF 2)

sed -r "s/(Marker1: )(.+)$/\1${red}\2${default}/
        s/(Marker2: )(.+)$/\1${green}\2${default}/" "${@}"
unclear
()
Ответ на: комментарий от unclear

То что надо для статичного файла, но на запущенном дампе трафика видимо возникают проблемы с буферизацией.
sed -u не помогает при этом

zolden ★★★★★
() автор топика
Ответ на: комментарий от YAR

Ээх, видимо я слишком погорячился со словом «гибконастраиваемая»
Я надеялся знатоки перла подскажут, какие пару символов надо поменять в моём исходном отднострочнике, а пока всё что предлагается - жуткий оверхед :(

zolden ★★★★★
() автор топика
Ответ на: комментарий от zolden
echo -e "string1\nerror\nsuccess\nstring2\nfail\nMaker1: value1\nMaker2: value2" | \
perl -p \
-e 's/(success)/\e[32m$&\e[0m/g;' \
-e 's/(error|fail)/\e[31m$&\e[0m/g;' \
-e 's/(Maker1:) (.*)/$1 \e[36m$2\e[0m/m;' \
-e 's/(Maker2:) (.*)/$1 \e[01;34m$2\e[0m/m;'
gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Спасибо, очень круто получилось на статичном файле, но на бегущем логе (я смотрю дамп трафика в реальном времени) опять какие-то проблемы с буферизацией и ничего не выводится.
Судя по гуглу надо выставить $| в ненулевое значение, но не пойму как это сделать в данном случае

zolden ★★★★★
() автор топика
Ответ на: комментарий от zolden

А так?

#!/bin/bash

default=$(tput op)
red=$(tput setaf 1 || tput AF 1)
green=$(tput setaf 2 || tput AF 2)

tail -f "$@" \
| sed -r "s/^(Marker1: )(.+)$/\1${red}\2${default}/
          s/^(Marker2: )(.+)$/\1${green}\2${default}/"

unclear
()
Ответ на: комментарий от gh0stwizard

Вот она рыба моей мечты, спасибо!

zolden ★★★★★
() автор топика
Ответ на: комментарий от unclear

Большое спасибо, работает.
На самом деле первый вариант тоже работал, дело было в буферизации grep'а, который стоял перед этим

zolden ★★★★★
() автор топика
Ответ на: комментарий от zolden

У grep'а есть опция --line-buffered, хотя думаю вы сами разобрались.

unclear
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.