35

С помощью следующего синтаксиса grep я хочу сопоставить все IP-адреса в файле (из сценария ksh )

  grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' file

Проблема: он также соответствует словам (IP), которые имеют более 4 октетов:

1.1.1.1.1 

или же

192.1.1.1.160

Как сопоставить действительный IP-адрес и только IP-адреса с 4 октетами? Я также могу использовать Perl - однострочное синтаксическое решение, если grep не работает.

12 ответов12

56

попробуй это:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

который соответствует всем выражениям от 0.0.0.0 до 999.999.999.999

с

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/hosts

вы получите только IP-адреса

нота:
на солярисе, вероятно, egrep сделает работу.

10

Как это:

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
5

The

-w / --word-regexp 

Параметр flag to grep позволяет сопоставлять его только на границах слов, что означает, что ваше совпадение должно быть либо окружено пробелами, либо начинаться / заканчиваться в начале / конце строки!

5
if [ ` echo $ip | '^((25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'  | grep -o "\." | wc -l` -eq 1 ];
then ipv4=true;
else 
ipv4=false;
5

Чтобы найти совпадения только с 4 октетами (исключая такие вещи, как 1.1.1.1.1), используйте это:

grep -P '(?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)'

Он никогда не должен обнаруживать не-IP-адреса. Выражение может быть более сложным для проверки большего количества вещей, но это должно работать в большинстве случаев. Он не будет совпадать с предыдущим 0, поскольку 010.1.12.1 не является обычным способом записи IP-адресов.

3

Немного сложно, но это должно работать:

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )
0

grep -E '^((25 [0-5] | 2 [0-4] [0-9] | [1]?[1-9] [0-9]?).){3}(25 [0-5] | 2 [0-4] [0-9] | [1] [1-9]?[0-9])$»

Модифицированная версия ответа Арно Б.

Это выражение не будет соответствовать IP-адресам с ведущими 0. например, оно не будет соответствовать 192.168.1.01. Это выражение не будет соответствовать IP-адресам с более чем 4 октетами. например, он не будет соответствовать 192.168.1.2.3

0

Регулярное выражение для сопоставления IP-адреса в TCL

установить "192.168.10.25"

if {[regexp
{^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$} $a]} 
{
    puts "yes"
}
0

Я использую egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/hosts для сопоставления IP-адресов в начале строки. Его также можно использовать без ^ чтобы разрешить пробелы или другие символы перед IP-адресом.

[0-9]{1,3} --> this matches a number between 1 and 999.
\. --> this is to add the dot.
([0-9]{1,3}\.){3} --> get a number with a dot 3 times.
[0-9]{1,3} --> finally add the fourth number.
0

grep -Eo '([0-9] {1,3}.?){4}»

Пример: curl http://korben.info/ip | grep "IP visible depuis mon serveur" | grep -Eo '([0-9] {1,3}.?){4}»

0

Укороченная версия длинного регулярного выражения:

egrep '([1-2]?[0-9]{0,2}\.){3,3}[1-2]?[0-9]{0,2}' 

Пожалуйста, используйте grep -E или egrep в зависимости от вашей версии ОС

-1

Вот что у меня сработало для ksh и ksh93 в AIX:

ф =

[[$ ip == [0-9] @("" | [0-9]) @("" | [0-9]). [0-9] @("" | [0-9]) @("" | [0-9]) [0-9] @. ("" | [0-9]) @("" | [0-9]). [0-9] @("" | [0-9]) @("" | [0-9])]] && echo OK || echo NOK Выше можно изменить, чтобы "отфильтровать" предоставленный IP по любому желаемому шаблону.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .