Поиск текста между двумя строками с помощью awk и regex - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь найти текст между двумя строками, содержащими определенный текст в файле, сопоставив его с помощью awk и regex.

Вот регулярное выражение:

(\ INVITE\ sip\:)(00|\+)(.*)@(?!((10.[1-2]47.(.*))|(172.(.*))))

I 'я пытаюсь использовать негативную перспективу, чтобы исключить конкретные IP-сети из результатов: 10.147.0.0, 10.247.0.0 и 172.0.0.0

Вот мое утверждение awk:

awk '/(\ INVITE\ sip\:)(00|\+)(.*)@(?!((10.[1-2]47.(.*))|(172.(.*))))/{flag=1}/SOME TEXT/{flag=0}flag' file 

Сам regex работает нормально и возвращает желаемый результат из примера, приведенного ниже в первой строке, но если я добавлю его в AWK, он не будет работать.

INVITE sip: +358XXXXXXX@10.147.XXX.XXX; пользователь = телефон SIP / 2.0

11/01 13: 30: 46.000 172.16.171.80 local0.notice [S =799368583] [SID = 2a0cb4: 31: 22781827] INVITE sip: + 4747XXXXXX; npdi; rn=+47XXXXXX@212.XXX.XXX.XXX; пользователь = телефон SIP / 2.0

11/01 13:30: 46.000 172.16.171.80 local0.notice [S = 799368584] [SID = 2a0cb4: 31: 22781827] INVITE sip: + 47XXXXXX; npdi; rn=+47XXXXXX@172.XXX.XXX.XXX; пользователь = телефон SIP / 2.0

11/01 13: 30: 46.000 172.16.171.80 local0.notice [S = 799368789] [SID = 2a0cb4: 31: 22781828] INVITE sip: 00358XXXXXX@10.47.XXX.XXX; пользователь = телефон SIP / 2.0

Без негативного прогноза это работает, так что возвращаемый результат - это тот, который я бы хотел исключить.

1 Ответ

0 голосов
/ 05 ноября 2019

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

Если вы хотите избежать perl и использовать отрицательный обходной путь, используйте tr, чтобы заменить символы новой строки на другой символ, который не отображается в ваших данных, а затем замените двойные вхождения этого символа на новую строку - это приведет кдве последовательности строк в одной строке дают вам больше опций соответствия, таких как использование grep с ключом -P для выбора того, что вы хотите с отрицательным поиском.

Если вы привержены awk, вы можете использовать его длявыберите строки, которые вы хотите удалить, поместите их в файл с вашим исходным файлом, отсортируйте их, а затем uniq -u, чтобы удалить (теперь дублированные) записи, которые не нужны.

...