Извлечение нескольких строк, только если все шаблоны совпадают в одном и том же порядке - PullRequest
1 голос
/ 08 июня 2019

Я сталкиваюсь с аналогичной трудностью, которую задали здесь .

Мой файл журнала Linux ( пример файла журнала ) содержит записи, как показано ниже, и я хотел быочистить строки 'Total Action Failed :' и 'Total Action Processed:' только в том случае, если за этими двумя строками следует строка, содержащая строку '> Processing file: R'.

INF----BusinessLog:08/06/19 20:44:33 > Processing file:  R1111111.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:33 > Data
    =========
    Overview:
        Total Action          : 100
        Total Action Failed   : 0
        Total Action Processed: 100

INF----BusinessLog:08/06/19 20:44:35 > Processing file:  R333333333.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:35 > Data
    =========
    Overview:
        Total Action          : 50
        Total Action Failed   : 0
        Total Action Processed: 50

Пробовал с помощью решения pcregrep дано по предыдущему вопросу, как показано ниже:

/opt/pdag/bin/pcregrep -M  '> Processing file:  R.*(\n|.)*Total Action Failed   :.*(\n|.)*Total Action Processed:'" $log_path/LogFile.log

У меня возникли проблемы со следующими двумя проблемами:

(1) Команда выше возвращает все строк, которые присутствуют между линиями шаблона - что не требуется

(2) Если файл журнала содержит записи, указанные ниже (> Processing file: Z) вместо (> Processing file: R), тогдаКоманда pcregrep выше не дает точного результата.

INF----BusinessLog:08/06/19 20:44:33 > Processing file:  R1111111.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:33 > Data
    =========
    Overview:
        Total Action          : 100
        Total Action Failed   : 0
        Total Action Processed: 100

INF----BusinessLog:08/06/19 20:44:35 > Processing file:  Z333333333.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:35 > Data
    =========
    Overview:
        Total Action          : 50
        Total Action Failed   : 0
        Total Action Processed: 50
INF----BusinessLog:08/06/19 20:44:45 > Processing file:  R555555555.R222222222.TEST0107, and creates the reports.
Line2
Line3
Line4
INF----BusinessLog:08/06/19 20:44:54 > Data
    =========
    Overview:
        Total Action          : 300
        Total Action Failed   : 45
        Total Action Processed: 300

Может ли кто-нибудь помочь мне найти решение этой проблемы?

Мне нужны только три строки, как показано ниже, когда все шаблоны совпадаютв том же порядке;Кроме того, число строк между первым шаблоном > Processing file: R и вторым шаблоном Total Action Failed : отличается, и оно не всегда будет 3 линиями.

INF----BusinessLog:08/06/19 20:44:33 > Processing file:  R1111111.R222222222.TEST0107, and creates the reports.
        Total Action Failed   : 0
        Total Action Processed: 50
INF----BusinessLog:08/06/19 20:44:45 > Processing file:  R555555555.R222222222.TEST0107
            Total Action Failed   : 45
            Total Action Processed: 300

1 Ответ

1 голос
/ 08 июня 2019

Я думаю, что вы зацикливаетесь на попытке создать регулярное выражение, которое удовлетворяет вашим требованиям, хотя на самом деле все, что вам действительно нужно, - это указывать первую строку и последние две строки каждого блока, который начинается со строки, включающей> Processing file: R.Учитывая это, с любым awk в любой оболочке на каждом компьютере UNIX:

$ awk -v OFS='\n' '
    /> Processing file:[[:space:]]*R/ { if (h) print h, y, z; h=$0 }
    NF { y=z; z=$0 }
    END { print h, y, z }
' file
INF----BusinessLog:08/06/19 20:44:33 > Processing file:  R1111111.R222222222.TEST0107, and creates the reports.
        Total Action Failed   : 0
        Total Action Processed: 50
INF----BusinessLog:08/06/19 20:44:45 > Processing file:  R555555555.R222222222.TEST0107, and creates the reports.
        Total Action Failed   : 45
        Total Action Processed: 300

Если это не то, что вам нужно, обновите ваш вопрос, чтобы уточнить ваши требования и предоставить пример, для которого вышеописанное не работает, и мывместо этого можно опубликовать тривиальное, переносимое решение awk.

...