Какое регулярное выражение я могу использовать для сопоставления с IP-адресом?


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оно не работает.


4
Это 999.999.999.999тоже будет соответствовать .
cyrus

4
Итак, вы хотите только grep IPv4-адреса, верно ?
Арджан,

5
Технически, такие IP-адреса 192.1.4097действительны и принимаются Linux glibc и Windows.
grawity 24.10.10

1
Ах, я никогда не знал ! ping 2130706433На OS X: PING 2130706433 (127.0.0.1): 56 data bytes.
Арджан

1
@Arjan: 0x7f.1и0177.1
благодарность

Ответы:


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 сделает работу.


Я пытаюсь использовать grep '\ b \ d {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3} \ b' / etc / hosts, но я не получить ничего - :(
Дженнифер

1
@jennifer, вам нужно включить расширенные регулярные выражения: grep -E <pattern> <file>(или, просто напечатать совпадения:grep -Eo <pattern> <file>
Арджан

так ? grep -E '\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b' / etc / hosts
Дженнифер

3
@udo: Ну, это соответствует, 1.1.1.1.1но оно скрывает последнее .1от вывода, я не вижу, как это может помочь.
cYrus 25.10.10

1
Ваше регулярное выражение не соответствует 10.0.0.1
Stefan Seidel

10

Как это:

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

Ницца! (Это также возвращает 192.1.1.1.160как 192.1.1.1, что, я думаю, хорошо для задающего вопрос.)
Арджан

2
Если действительно требуются совместимые IP-адреса, это единственный тип решения, который может быть близок к завершению. Когда я увидел вопрос, я просто подумал: «Я не буду касаться этого стандартным полюсом регулярных выражений в десять футов». Предостережения, предостережения везде :-).
Даниэль Андерссон

5

-w / --word-regexp 

Если флаг grepпомечает его как совпадающий на границах слов, это означает, что ваше совпадение должно быть либо окружено пробелами, либо начинаться / заканчиваться в начале / конце строки!


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-адресов.


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;

3

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

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

Как насчет 127.000.000.001тогда? ;-)
Арджан

Насколько я знаю, IP не имеют дополняющих нулей.
cYrus

1
Хм, ping 127.000.000.001конечно, работает на моем Mac. Но потом: я только что узнал, что даже ping 2130706433дает тот же результат. :-) Ой, ping 00127.00000.00000.00001переводится как 87.0.0.1. Странно ... Или восьмеричный может быть? Да, восьмеричное точно, так что вы правы насчет начальных нулей, я думаю.
Арджан

Да, 00127 (восьмеричное) = 87 (десятичное). Конечно, все они действительные IP-адреса, но я думаю, что это не стандартный способ их представления. Во всяком случае, это не запрошено спрашивающим.
cYrus

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


Это также не будет соответствовать 127.0.0.1.
Крис Чарабарук

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

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

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

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


2
добро пожаловать в суперпользователя. На этот вопрос уже есть несколько хороших ответов. Чтобы помочь людям понять различия между ними, отредактируйте свой ответ и объясните, что делает его лучше / отличается от других.
Матэ Юхас

это выражение не учитывает такие легальные ips, как 8.8.8.8 echo "8.8.8.8" | grep -Eo '([1-2][0-9]{0,2}\.){3,3}[1-2][0-9]{0,2}'=> нет результата
anneb


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"
}

-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 по любому желаемому шаблону.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.