Я использую эту запись в моих файлах журнала:

[что-то что-то]

что-то нужно и символы и цифры переменной длины. Мой специальный файл журнала содержит строку с символами, описанными выше. т.е.

Line 1: 14:40:45,107 DEBUG [AS-kmksdf] Error occured!
Line 2: something somethingg..
Line 3: 14:40:45,108 DEBUG Some other errors

Я хочу получить строку 1 и строку 2(потому что ошибка продолжается в строке 2). Мои файлы журналов растут динамически, и я показываю это на экране с:

tail -f log.txt

Как я могу показать строки, которые начинаются с моей специальной строки, пока она не получит новую строку, которая имеет номер номер: номер номер: номер номер, один или несколько длинных номеров (это код ошибки с разделенными запятыми номерами ошибок)

(Думаю поискать номер, номер: может хватить)

Я использую Cygwin с Windows7 и могу запустить некоторые команды Linux на моем cmd.exe.

Этот вопрос разрешен к: этот вопрос

1 ответ1

1

команда

tail -f log.txt | awk '{if($1~/[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9]+/){if($0~/\[[A-Za-z]+-[A-Za-z]+\]/){MATCH=1}else{MATCH=0}}if(MATCH){print $0}}'

Как это устроено

  • awk обрабатывает конвейерный вывод построчно.

  • Если первое поле строки (разделенное пробелом и обозначенное $1) соответствует регулярному выражению [0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9]+ , значение MATCH изменяется:

    • Если шаблон \[[A-Za-z]+-[A-Za-z]+\] встречается, для MATCH устанавливается значение 1 (верно).

    • Если шаблон \[[A-Za-z]+-[A-Za-z]+\] не встречается, для MATCH устанавливается значение 0 (ложно).

  • Наконец, если MATCH верен, print $0 печатает всю строку (обозначается $0).

    Поскольку MATCH является правдивым тогда и только тогда, когда последняя строка, начинающаяся с метки времени, содержала шаблон [something-something] , это дает желаемый результат.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .