2011-02-24 3 views
1

У меня возникли проблемы с преобразованием моего обычного выражения в рабочую команду sed на Centos 5.5.Отфильтровать IP с помощью regex и sed

Я хочу, чтобы фильтровать IP-адрес из строки:

"example.org has address 123.45.67.890" -> "123.45.67.890" 

Моя регулярное выражение до сих пор:

/([a-zA-Z\. ]+)([0-9\.]+)/ 

И пример моей команды с использованием СЭД является:

host example.org | grep 'has address' | sed 's/\([a-zA-Z\\. ]+\)\([0-9\\.]+\)/\2/' 

Но все, что я получаю от этой команды, является входным для sed: «example.org имеет адрес 123.45.67.890»

Любые идеи?

+0

этот shoudl будет на unix ** user ** сайт не сайт программирования, так как sed является стандартным инструментом командной строки –

ответ

4
host example.org | awk '/has address/ {print $4 }' 
1

Для этого вам не нужен sed. Вы можете использовать cut вместо того, чтобы разобрать пространство:

host example.org | grep 'has address' | cut -d' ' -f4 

Это просто занимает 4-е слова, когда разделители пробелов.

0

Ваш ([a-zA-Z\. ]+) захватывает все до IP-адреса и включает в себя это в матче. Это также приведет к сбою совпадения, если имя домена имеет в нем какие-либо цифры. Использование: 'назад

/(?<has address)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ 

Вы, по-видимому need to use Perl mode for sed to support lookbehinds. Вы также можете использовать группы захвата. Если вы хотите более разборчивого шаблон (т.е. только соответствовать материал, который выглядит очень сильно, как IP-адрес), вы можете попробовать это:

/(?<has address)(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\b/ 

Это должно соответствовать четыре номера 0-255, разделенных точками и предшествуют «имеет адрес».

+0

Perl mode применяется к настраиваемой версии 'sed' под названием' ssed'. –

2

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

host example.org | grep "has addres" | awk '{print $4}' 
0

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

host example.org | grep -Po '.*has address \K[0-9.]*' 
0

хозяина exmaple.org | sed -n 's /^.* (. *) $/\ 1/p'

Смежные вопросы