Awk хорошо подходит для этого типа задач. По сути, скрипт awk обрабатывает одну строку за раз, но позволяет вам изменять / читать глобальные переменные при обработке каждой строки. Чтобы применить awk к этой проблеме, вы можете создать мини-конечный автомат, который будет помнить при обработке строки «внутри» записи журнала и печатать любую информацию из «совпадающих» записей.
Вот пример программы на awk. Блок BEGIN
выполняется один раз перед обработкой любого ввода, в то время как основной блок выполняется один раз в строке - $0
содержит все содержимое строки.
BEGIN{
inmatch=0
last=""
}
{
if(match($0,"INFO|DEBUG")){
if(inmatch){
print last
}
inmatch=0
}
if(match($0,"jdbc\.sqlonly")){
inmatch=1
}
last=$0
}
Этот скрипт печатает последнюю строку каждой записи журнала, которая начиналась со строки, содержащей jdbc.sqlonly
. Начало новой записи журнала определяется как любая строка, содержащая INFO
или DEBUG
. Параметр регулярного выражения для функции match () можно легко настроить. Чтобы запустить скрипт, сохраните его в файле и вызовите следующим образом:
$ cat log.file | awk -f script.awk
/* [related.classname] : some comments go here */
/* [other.classname] : some comments go here */
«Комбинированные» или однострочные сценарии awk также можно создавать в командной строке, что удобно для временных решений, которые не оправдывают использование полнофункционального языка сценариев.
$ cat test.file | awk 'BEGIN{inmatch=0;last=""}{if(match($0,"INFO|DEBUG")){if(inmatch){print last}inmatch=0} if(match($0,"jdbc\.sqlonly")){inmatch=1}last=$0}'
/* [related.classname] : some comments go here */
/* [other.classname] : some comments go here */