Який регулярний вираз я можу використовувати, щоб співставити 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
Отже, ви хочете лише зібрати IPv4 адреси, правда ?
Ар'ян

5
Технічно такі IP адреси, як 192.1.4097дійсні, приймаються Linux glibc та Windows.
grawity

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

1
@Arjan: 0x7f.1і0177.1
grawity

Відповіді:


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, але я не отримуй нічого - :(
jennifer

1
@jennifer, вам необхідно включити розширені регулярні вирази: grep -E <pattern> <file>(або просто роздрукувати матчі:grep -Eo <pattern> <file>
Arjan

подобається це ? grep -E '\ b \ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} \ b' / тощо / господарі
Дженніфер

3
@udo: Ну це збігається, 1.1.1.1.1але він приховує останнє .1у висновку, я не бачу, як це може допомогти.
cYrus

1
Ваш regexp не відповідає 10.0.0.1
Стефан Зайдель

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

The

-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
Ласкаво просимо у суперрусера На це питання вже є кілька хороших відповідей. Щоб допомогти людям зрозуміти відмінності між ними, відредагуйте свою відповідь та поясніть, що робить її кращою / відмінною від інших.
Máté Juhász

цей вираз не враховує таких юридичних 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 =

[[$ 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 NOK Наведене вище можна змінити, щоб "фільтрувати" наданий IP за будь-якою схемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.