Многострочный grep - PullRequest
       30

Многострочный grep

0 голосов
/ 01 марта 2019

Я получил файл со схемой, подобной этой:

172.18.0.7
172.18.0.9
172.18.0.8
172.18.0.7
172.18.0.9
172.18.0.8
172.18.0.7
172.18.0.9
172.18.0.8
172.18.0.7
172.18.0.9
172.18.0.8

Так что его 7-> 9-> 8-> 7-> 9-> 8-> 7-> 9-> 8-> 7-> 9-> 8-> 7-> 9-> 8 ... в его конце.

Я хочу получить строки, где эта схема отличается,Например, 7->8->9:

172.18.0.7
172.18.0.8
172.18.0.9

Поскольку файл содержит около 100000 строк, я бы хотел использовать grep для их фильтрации.

Я пробовал что-то вроде этого:

grep -Pzl "172.18.0.7 * \ n 172.18.0.9 * \ n 172.18.0.8 * \ n"

, который не сработал должным образом.Я хотел найти шаблон, который соответствует схеме, упомянутой первой.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

GNU sed 4.2 поддерживает -z:

sed -z 's/172.18.0.7\n172.18.0.9\n172.18.0.8\n//g' file

Это решение не будет работать, когда первая строка потенциального набора из трех будет выглядеть как

some_other_chars_before_172.18.0.7

Когда вы добавите \n в начале матча, вам нужно удалить последние \n, чтобы найти 2 сета без чего-то промежуточного, но это позволило бы последней строке, заканчивающейся

172.18.0.8_and_more_characters

Это похоже на тупик, но вы можете изменить свой ввод в стиле Windows и соответствовать Smart:

 sed -rz 's/\n/\r\n/g;s/(\n|^)172.18.0.7\r\n172.18.0.9\r\n172.18.0.8\r//g;s/\r//g' file
0 голосов
/ 01 марта 2019

Использование GNU awk:

awk -v RS='\n*[0-9.]+7\n[0-9.]+9\n[0-9.]+8\n' NF file

Разделитель записей RS устанавливается таким образом, чтобы он совпадал с 3 строками, имеющими цифры и точки и заканчивающимися соответственно на 7, 9, 8(в этом порядке).

Выходная запись ORS разделитель (по умолчанию) \n, входной скрипт (только NF) печатает все непустые строки (которые не совпадают RS).

...