Ответ 1
Используйте sed -r
(расширенное регулярное выражение) или выйдите из группы захвата с помощью \
Это для назначения, поэтому у меня нет выбора, кроме как использовать 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 не поддерживает не жадных операторов вроде? и |.
Я размахивал своим мозгом, но я не могу придумать, как это сделать без неживых операторов. Как я могу это сделать?
Используйте sed -r
(расширенное регулярное выражение) или выйдите из группы захвата с помощью \
grep будет более подходящим там (если у вас 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)
Если у вас есть 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
Эти символы включают:
(
, )
{
, }
|
?
Как правило (хотя и не для вашего случая), я использую следующее для соответствия 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
Вы также можете сделать это:
Окна:
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;