Я использую следующую SED программы одна строки:
sed -nr ':main; /^[0-9 :,-]{23} ERROR/{ :loop; p; n; /^[0-9 :,-]{23}/b main; b loop}'
Первый [0-9 :,-]{23}
признает запись журнала старта. Сразу после него перед косой чертой вы можете написать дополнительное регулярное выражение, чтобы ограничить, какие записи печатать. Выражение в {...}
проходит через следующие строки до тех пор, пока не будет найден новый заголовок записи.
Моя программа работает для журналов, где журнальные записи начинаются с:
2015-08-25 12:49:34,906 ...
и печатает все записи с трассировки стека, который имеет ошибку после начала записи. Пример:
2015-08-25 12:49:34,906 ERROR [http-8080-89] [[email protected]] NullPointerException:
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
...
СЭД Программа Объяснение
СЭД выражение Программа /regexp/ command
средства: если текущая строка соответствует регулярное выражение команды запуска.
sed прочитает строку ввода и запустит программу. Когда строка соответствует /^[0-9 :,-]{23} ERROR /
, она запускает командный блок {...}
, если нет, то после завершения программы sed не будет выводить текущую строку на вывод (опция -n), тогда sed считывает следующую строку и снова запускает программу. Это повторяется до конца ввода.
{...}
объяснение:
p
- напечатать текущую строку
n
- читать следующую строку
/^[0-9 :,-]{23}/b main
- если строка соответствует регулярное выражение по-прежнему на этикетке :main
- эффективно перезапустив всю программу на экране текущая строка без прочтения следующей строки - не пропустить следующее возможное исключение
- Продолжить на этикетке
:loop
Так регэкспы:
/^[0-9 :,-]{23} ERROR /
матчей линии, начинается запись журнала
/^[0-9 :,-]{23} /
матчи линия, следующая запись журнала
Поскольку вы упоминаете 'grep', вы на платформа * nix? – devnull
Должно быть возможно добиться того, что вы хотите использовать 'sed' или аналогичные утилиты, но вам нужно предоставить некоторые данные образца ... – devnull
@devnull: Я использую Linux. –