У меня есть входной файл, который содержит:

19:04:01.631948 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:02.061482 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72      addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:03.583896 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72  addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:04.005483 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:05.511947 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:05.997361 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:07.427876 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:07.925385 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:09.403864 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
19:04:09.845241 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto UDP (17), length 48)

181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72   addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
19:04:10.877531 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [none], proto IGMP (2), length 28)

и я хочу, чтобы вывод был таким:

181.173.82.61
and other ips
(just senders IP (left IP))

Я попробовал следующее регулярное выражение в grep:

grep -E -o '[1-9][0-9][0-9]?\.[1-9][0-9][0-9]?\.[0-9][0-9][0-9]?\.[0-9][0-9][0-9]?\.\s\>

Чтобы решить эту проблему, я пытаюсь проверить IP-адреса в следующем формате:

(ip)(port)(space)(>)

а затем sed и удалите> и номера портов, но моя доза регулярного выражения не работает.
Я буду признателен за любые другие способы, такие как awk или лучшие регулярные выражения.

5 ответов5

1

Прямо сейчас ваше регулярное выражение ищет только IP в формате xxx.xxx.xxx.xxx , но IP-адреса могут быть x.x.x.x и что-то между ними, например xxx.xxx.x.xx (и в вашем примере: xxx.xxx.xx.xx для части IP).

Это значит, что ваше регулярное выражение должно выглядеть примерно так:

'[1-9]{1,3}\.[0-9}{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,4} >'

Это говорит: «Я хочу 1-9 где-нибудь от 1 до 3 подряд, затем«. », Затем 0-9 где-нибудь от 1-3 подряд» и так далее. У меня работает без ? , FWIW.

Так как вы явно говорите «пробел и>», вам не нужно слишком увлекаться.

1

Я почти уверен, что это может быть лучше, чем это, но если я скопирую ваш пример в тестовый файл и удалим разметку (лишние 4 пробела в начале), то это работает:

>cat testfile | grep -E "[1-9]{1,3}\.[0-9}{1,3}\.[0-9]{1,3}\.[1-9]{1,3}" | cut -d. -f1-4

Вывод только фильтров grep до:

181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72      addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"
181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72  addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
181.173.82.60.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=standby group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=100 auth="vlan72^@^@"

Cut используется для захвата только первых четырех полей (-f для поля, 1-4 для 1,2,3,4) с использованием точки в качестве -d элиминатора).

1

Если вам нужен только первый IP-адрес каждой строки, вы можете сделать это:

grep '>' file.txt | gawk '{print $1}' | cut -d "." -f -4

Вывод на ваш пример файла:

181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60

Объяснение:

  • grep '>' file.txt : печатать только те строки, которые содержат символ > . В опубликованном вами файле эти строки начинаются с IP.

    grep '>' file.txt | head -1
    181.173.82.61.1985 > 250.66.33.195.1985: HSRPv0-hello 20: state=active group=72 addr=171.64.72.1 hellotime=2s holdtime=7s priority=120 auth="vlan72^@^@"
    
  • gawk '{print $1}' : печатать первое поле каждой строки.

      grep '>' file.txt | gawk '{print $1}' | head -1
      181.173.82.61.1985
    
  • cut -d "." -f -4 : использовать . в качестве разделителя полей и распечатать все до 4-го поля. Это удаляет лишние номера с IP-адресов.

    grep '>' file.txt | gawk '{print $1}' | cut -d "." -f -4 | head -1
    181.173.82.61
    
1

Используя ваш файл примера и регулярное выражение, я пришел к этому более простому решению:

perl -ne 'print "$1\n" if /^(.*)\.\d+ >/' test.txt

Он печатает каждый матч перед ". Portnumber >"

0

Я довольно удивлен, что никто не опубликовал это чрезвычайно простое решение grep . Я скопировал и вставил ваш образец текста в текстовый файл с именем "ips.txt" и выполнил следующую команду:

grep -Eo "^([0-9]{1,3}\.){3}[^. ]*" ips.txt

Вывод, который я получил, был:

181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60
181.173.82.61
181.173.82.60

И если вы хотите увидеть ВСЕ IP_ADDR в файле, просто опустите ^ в начале регулярного выражения команды grep. Он отобразит все IP-адреса в списке для дальнейшего просмотра по желанию.

Который оказывается тем же самым выходом как принятый ответ только без использования такого количества каналов. Пока ваш файл, который нужно проанализировать, содержит отправителя IP_ADDR в начале строки, эта команда будет делать то, что вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .