Использование awk для получения линий между двумя шаблонами - PullRequest
0 голосов
/ 10 мая 2019

новичок с awk и пытается написать скрипт bash, чтобы использовать его для печати строк между двумя шаблонами в файле журнала, и я не могу заставить его работать. 1001 *

Я думаю, мне нужноэкранировать некоторые символы.

Вот пример раздела журнала, из которого я пытаюсь получить строки:

Processing... AP710  (/var/opt/testsys/rptprint/AP710)
sidjosajdois
sokds3488sds
doskdoskdoskdo
sodk229929
sending entire report to Job Mgr (spool) for user

Я хочу четыре строки между «Обработка ...»строка (первый шаблон) и строка «отправка» (второй шаблон), и есть только один раздел журнала, в котором есть этот выше раздел с первой строкой шаблона и второй строкой шаблона.

попытался использовать awk со следующей командой, используя часть первого шаблона и, при необходимости, экранировать символы "/":

awk '/\/var\/opt\/testsys\/rptprint\/AP710/{flag=1;next}/sending entire report to Job Mgr/{flag=0}flag' log 

Но это дает мне другой раздел журнала, который также имеетпуть "/ var / opt / testsys / rptprint / AP710", поэтому я попытался изменить его, чтобы он имел больше строки (первый шаблон), добавив "Processing ...", и он ничего не возвращает ....

awk '/Processing\.\.\. AP710 \(\/var\/opt\/testsys\/rptprint\/AP710/{flag=1;next}/sending entire report to Job Mgr/{flag=0}flag' log

Может ли кто-нибудь дать несколько советов по поводу awk, чтобы я мог провести границу между двумя шаблонами?Потратив несколько часов, я собираюсь немного помешаться на попытках понять это, и я думаю, что, будучи новичком в awk, я упускаю что-то очевидное.

Приветствия.

1 Ответ

3 голосов
/ 10 мая 2019

Всякий раз, когда вы обнаруживаете, что экранируете символы в регулярном выражении, чтобы сделать их буквальными, действительно подумайте, следует ли вам использовать регулярное выражение или вместо этого вам следует сравнивать строки.На самом деле, всегда начинайте со сравнения строк и переключайтесь на регулярное выражение, если вам нужно в.

$ awk '
    $0=="sending entire report to Job Mgr (spool) for user" { inSection=0 }
    inSection;
    $0=="Processing... AP710  (/var/opt/testsys/rptprint/AP710)" { inSection=1 }
' file
sidjosajdois
sokds3488sds
doskdoskdoskdo
sodk229929
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...