IPアドレスの照合に使用できる正規表現は何ですか?


35

次のgrep構文を使用して、ファイル内のすべてのIPアドレスを一致させたい(kshスクリプトから)

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

問題:4オクテット以上の単語(IP)にも一致します。

1.1.1.1.1 

または

192.1.1.1.160

有効な IPと4オクテットのIPアドレスのみを一致させるにはどうすればよいですか?また、Perlを使用することもできますgrep。これが機能しない場合は、1行の構文ソリューションです。


4
それも一致し999.999.999.999ます。
cYrus

4
だから、あなたは、IPv4アドレスのみをgrepしたい、
アルジャン

5
技術的には、などのIPアドレス192.1.4097は有効であり、Linux glibcおよびWindowsで受け入れられます。
悲しみ

1
ああ、私は知らなかったping 2130706433、OS X上:PING 2130706433 (127.0.0.1): 56 data bytes
アルジャン

1
@アルジャン: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アドレスのみを取得します

注:
solarisでは、おそらく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>
Arjan

このような ?grep -E '\ b \ d {1,3} \。\ d {1,3} \。\ d {1,3} \。\ d {1,3} \ b' / etc / hosts
jennifer

3
@udo:これは一致します1.1.1.1.1.1、出力の最後を非表示にします。どのように役立つかわかりません。
cYrus

1
あなたの正規表現は、10.0.0.1一致していません
ステファン・ザイデル

10

これはどうですか:

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

いいね!(これはとして返さ192.1.1.1.160192.1.1.1ますが、質問者にとっては問題ないと思います。)
Arjan

2
適合IPアドレスが本当に必要な場合、これが完成に近い可能性がある唯一のタイプのソリューションです。質問を見たとき、「10フィートの標準正規表現の極ではそれに触れない」と考えました。警告、どこでも警告:-)。
ダニエルアンダーソン

5

-w / --word-regexp 

grep単語の境界でのみ一致するようにフラグを設定します。つまり、一致を空白で囲むか、行の先頭/末尾で開始/終了する必要があります。


5

(1.1.1.1.1のようなものを除く)正確に4オクテットの一致のみを見つけるには、これを使用します。

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

非IPアドレスを検出することはありません。より多くのものを検証するために式はより複雑になる可能性がありますが、これはほとんどの場合に機能するはずです。010.1.12.1はIPアドレスを書き込む一般的な方法ではないため、前の0とは一致しません。


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ます。奇数...または8進数ですか?はい、確かに8進数ですので、先行ゼロについては正しいと思います。
アルジャン

はい、00127(8進数)= 87(10進数)。確かにそれらはすべて有効な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])$ '

Arnaud B.の回答の修正版。

この表現は、先頭に0が付いたIPアドレスには一致しません。たとえば、192.168.1.01とは一致しませんこの表現は、4オクテット以上のIPアドレスとは一致しません。たとえば、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}' 

ご使用のOSバージョンに適したgrep -Eまたはegrepを使用してください


2
スーパーユーザーで歓迎します。この質問にはすでにいくつかの良い答えがあります。両者の違いを理解できるように、回答を編集して、他の回答との違いを説明してください。
マテユハス

この式では、8.8.8.8のような有効なIPは考慮されていませんecho "8.8.8.8" | grep -Eo '([1-2][0-9]{0,2}\.){3,3}[1-2][0-9]{0,2}'=>結果なし
-anneb


0

TCLでIPアドレスを照合するための正規表現

「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

AIXでkshとksh93を使用した場合の効果を次に示します。

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を任意のパターンに「フィルタリング」するために変更できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.