Sed - Как извлечь IP-адрес с помощью sed?

Это для назначения, поэтому у меня нет выбора, кроме как использовать sed.

Учитывая сообщения с файлами, как я могу извлечь все IP-адреса и распечатать их?

Сначала я попробовал

sed -n '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' messages

Но он ничего не печатал. Проведя некоторое исследование, я узнал, что sed не поддерживает не жадных операторов вроде? и |.

Я размахивал своим мозгом, но я не могу придумать, как это сделать без неживых операторов. Как я могу это сделать?

Ответ 1

Используйте sed -r (расширенное регулярное выражение) или выйдите из группы захвата с помощью \

Ответ 2

будет более подходящим там (если у вас sed, вы должны иметь grep тоже):

grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' messages

Это ваш собственный regex без изменений (проверено OK)

Ответ 3

Если у вас есть GNU sed, вы можете просто добавить флаг -r для использования ERE:

sed -rn '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file

В противном случае вам нужно будет избежать определенных символов:

sed -n '/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)/p' file

Эти символы включают:

  • с помощью круглых скобок: (, )
  • фигурные скобки: {, }
  • 'или' pipe: |
  • неживые вопросительные знаки: ?

Как правило (хотя и не для вашего случая), я использую следующее для соответствия IP-адресу:

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file

Или в режиме совместимости:

sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' file

Ответ 4

Вы также можете сделать это:

Окна:

ipconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '2 d' | head -n1;

OSX:

ifconfig | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '1 d' | head -n1;