Я тестирую регулярное выражение, необходимое для создания извлечения полей с помощью Splunk для nmap, и думаю, что я могу быть рядом ...
Пример полной строки:
Host: 10.0.0.1 (host) Ports: 21/open|filtered/tcp//ftp///, 22/open/tcp//ssh//OpenSSH 5.9p1 Debian 5ubuntu1 (protocol 2.0)/, 23/closed/tcp//telnet///, 80/open/tcp//http//Apache httpd 2.2.22 ((Ubuntu))/, 10000/closed/tcp//snet-sensor-mgmt/// OS: Linux 2.6.32 - 3.2 Seq Index: 257 IP ID Seq: All zeros
Я использовал подчеркивание "_" в качестве разделителя, потому что это немного облегчает чтение.
root@host:/# sed -n -e 's_\([0-9]\{1,5\}\/[^/]*\/[^/]*\/\/[^/]*\/\/[^/]*\/.\)_\n\1_pg' filename
То же регулярное выражение с удаленными escape-символами:
root@host:/# sed -n -e 's_\([0-9]\{1,5\}/[^/]*/[^/]*//[^/]*//[^/]*/.\)_\n\1_pg' filename
Выход:
... ... ...
Host: 10.0.0.1 (host) Ports:
21/open|filtered/tcp//ftp///,
22/open/tcp//ssh//OpenSSH 2.0p1 Debian 2ubuntu1 (protocol 2.0)/,
23/closed/tcp//telnet///,
80/open/tcp//http//Apache httpd 5.4.32 ((Ubuntu))/,
10000/closed/tcp//snet-sensor-mgmt/// OS: Linux 9.8.76 - 7.3 Seq Index: 257 IPID Seq: All zeros
... ... ...
Как вы можете видеть, сопоставление с образцом работает, хотя я не могу:
1 - соответствует шаблону в конце строки (запятая и белый / табуляция). Последняя строка содержит нежелательный текст (в этом случае информация о времени ОС и TCP). Логическое "ИЛИ" для двух символов (запятая и пробел), похоже, не совпадает.
...(\,|\s)
а также
2 - удалить любые ненужные данные - т.е. напечатать только соответствующий шаблон. Это на самом деле печать всей линии. Если я уберу флаг sed -n, оставшееся содержимое файла также будет напечатано. Я не могу найти способ печатать только совпадающее регулярное выражение.
то есть, почему, когда я явно говорю это не, sed печатает эти строки? =>
Host: 10.0.0.1 (host) Ports:
а также
OS: Linux 2.6.32 - 3.2 Seq Index: 257 IP ID Seq: All zeros
Будучи довольно новым для sed и regex, любая помощь или указатели очень ценятся!