У меня есть предложение whic, содержит IP-адрес. Например,
This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.
От вышеупомянутого предложения я хочу распечатать IP-адрес только. Как я могу сделать это? Я слышал, что возможно сделать это с sed
Это возможно, но не изящно:
echo 'This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.' \
| sed 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/'
[0-9]
соответствия любая цифра, \{1,3\}
средства это может быть повторено 1 - 3 раза. \.
соответствия точка. Целый IP получен эти \(...\)
круглые скобки, что прибывает, прежде и после подобран .*
, т.е. что-либо повторило нуль или больше раз. Целая соответствующая строка (т.е. целая строка) тогда заменяются содержанием первой группы соответствия.
можно сделать его более читаемым путем представления переменной:
n='[0-9]\{1,3\}'
... | sed "s/.*\($n\.$n\.$n\.$n\).*/\1/"
Это печатает целую строку, если IP не найден. Это также не проверяет на недопустимого дюйм/с как 256.512.999.666.
Используйте эту команду grep
:
grep -Eo '[0-9.]+ ' file
Или еще лучше:
grep -oP '\d+\.\d+\.\d+\.\d+' file
или
grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}" file
Я использую grep:
echo 'This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.' | 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]))'
Это распечатает только допустимые IP адреса, в отличие от других ответов
Я сделал бы как это в интерпретаторе python 3. Это не только захватывает текст, которые находятся в этом 111.111.111.111
формат, но также и это проверяет на допустимый или нет.
>>> import re
>>> import ipaddress
>>> text = "This sentence contains an ip number 1.2.3.4 and 111.111.111.111 451.976.897.786 port number 50, i want to print the IP address only."
>>> foo = re.findall(r'(?<!\S)(?:\d{1,3}\.){3}\d{1,3}(?!\S)', text)
>>> foo
['1.2.3.4', '111.111.111.111', '451.976.897.786']
>>> for i in foo:
... try:
... ipaddress.ip_address(i)
... except:
... pass
...
IPv4Address('1.2.3.4')
IPv4Address('111.111.111.111')
Для получения интерпретатора python 3, команды типа python3
на терминале.
Расширение ответа choroba:
, Если Вы не хотите, чтобы новая строка была распечатана и Вы только хотите распечатать IP:
$ echo -e 'This sentence contains an ip number 1.2.3.4 and port number 50, \ni want to print the IP address only.\n One more IP is 1.24.53.3.' \
| sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/1p'
Вывод:
1.2.3.4
1.24.53.3
Объяснение:
-n flag is for quiet / silent.
p print the replaced text
AWK, объединенный с RegExp, очень подходит для обработки частей строк.
Основная идея о реве остроты к для цикла через строку и проверку на присутствие четырех цифр и точек, повторенных в максимальные 4 раза; одновременно мы можем проверить на цифру, повторенную 2 - 4 раза для Образца номера порта
awk '{for(i=1;i<=NF;i++) { if ($i~/[[:digit:]\.]{4}/) printf $i; if ( $i~/[[:digit:]]{2,4}/) printf ":"$i }}'
, выполненного
$ echo "This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only." | awk '{for(i=1;i<=NF;i++) { if ($i~/[[:digit:]\.]{4}/) printf $i; if ( $i~/[[:digit:]]{2,4}/) printf ":"$i }}'
1.2.3.4:50,
, Ваше предложение содержит 50 и, вместе без разделения, следовательно распечатанного вместе, но с gsub(/[[:punct:]]/,"")
, который может быть удален при желании.
Это - a grep
решение:
echo "$sentence" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
-o
распечатайте только часть соответствия-E
переключатели к расширенному regex[0-9]
) один или несколько раз (+
) затем точка (\.
) и снова цифры...Здесь другое решение с perl
:
echo "$sentence" | perl -l -ne '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ && print $&'
-l
указанный разделитель строки (новая строка)-n
канавка циклов вход, данный echo
(могли быть несколько строк),-e
код следуетgrep
решение выше