Как выбрать и распечатать IP-адрес от ряда строк?

У меня есть предложение 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

3
задан 21 November 2014 в 17:23

7 ответов

Это возможно, но не изящно:

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.

7
ответ дан 17 November 2019 в 19:09

Используйте эту команду 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
2
ответ дан 17 November 2019 в 19:09

Я использую 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 адреса, в отличие от других ответов

1
ответ дан 17 November 2019 в 19:09

Я сделал бы как это в интерпретаторе 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 на терминале.

0
ответ дан 17 November 2019 в 19:09

Расширение ответа 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
0
ответ дан 17 November 2019 в 19:09

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:]]/,""), который может быть удален при желании.

0
ответ дан 17 November 2019 в 19:09

Это - 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 код следует
  • regex в коде жемчуга является почти таким же как в grep решение выше
6
ответ дан 1 December 2019 в 12:56

Другие вопросы по тегам:

Похожие вопросы: