2010-10-24 12:00:49 +0000 2010-10-24 12:00:49 +0000
36
36

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

При следующем синтаксисе 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

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

Ответы (12)

57
57
57
2010-10-24 13:01:43 +0000

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

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

с

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

note: на солнечных батареях, вероятно, egrep сделает эту работу.

10
10
10
2010-10-24 13:50:10 +0000

Как тебе это:

perl -MRegexp::Common=net -ne '/($RE{net}{IPv4})/ and print "$1\n"' /etc/hosts
5
5
5
2012-09-13 08:12:16 +0000
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
5
5
2012-09-13 08:35:57 +0000

Чтобы найти совпадения только с 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
5
5
2012-06-26 11:15:04 +0000

Флаг

-w / --word-regexp

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

3
3
3
2010-10-24 15:14:58 +0000

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

( X='\([0-9]\{1,2\}\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)' ; grep "\([^\.]\|^\)$X\.$X\.$X\.$X\([^\.]\|$\)" file )
1
1
1
2015-11-17 09:56:08 +0000

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

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

Пожалуйста, используйте grep -E или egrep как подходящую для вашей версии ОС.

0
0
0
2015-04-17 11:17:29 +0000

Регулярное выражение для соответствия 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
0
0
2016-09-01 09:46:09 +0000

grep -Eo ‘([0-9]{1,3}…?{4}’

Пример: curl http://korben.info/ip | grep “IP видимый depuis mon serveur” | grep -Eo ‘([0-9]{1,3}…?{4}’…

0
0
0
2013-09-02 05:56:39 +0000

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 адресам с ведущими 0s. например, оно не будет соответствовать 192.168.1.01 Это выражение не будет соответствовать IP адресам с более чем 4 октетами. например, оно не будет соответствовать 192.168.1.2.3.

0
0
0
2015-10-29 18:58:11 +0000

Я использую 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.
-1
-1
-1
2017-02-15 10:02:50 +0000

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

ip=

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

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

13
3
2
6
3