1

私の目標は、IPアドレスを3オクテットと正確に一致させることですが、4つのIPオクテットは有効なオクテットでなければなりません-<0から255>の間

たとえば、ファイルに次の IP があります

$ more file    
192.9.200.10
192.9.200.100
192.9.200.1555
192.9.200.1
192.9.200.aaa
192.9.200.@
192.9.200.:
192.9.200
192.9.200.

最初の 3 つのオクテットを一致させる必要があります - 192.9.200 で、4 つのオクテットが有効でなければなりません (0-255)

最後に - 結果は次のようになるはずです:

192.9.200.10
192.9.200.100
192.9.200.1

基本的な構文は次のとおりです。

IP_ADDRESS_THREE_OCTETS=192.9.200
cat file | grep -x $IP_ADDRESS_THREE_OCTETS.[  grep‏ Regular Expression syntax ]

4 つのオクテットが有効でなければならないのに、3 つのオクテットに一致させるために 4 つのオクテットに正しい「grep 正規表現」を記述する方法をアドバイスしてください。

4

4 に答える 4

3

テキストを正規表現パターンに変換するには、いくつかの高度なツールを使用する必要があるため、それをそのまま使用することもできます。

perl -ne'
    BEGIN { $base = shift(@ARGV); }
    print if /^\Q$base\E\.([0-9]+)$/ && 0 <= $1 && $1 <= 255;
' "$IP_ADDRESS_THREE_OCTETS" file

ベースのハードコーディングが許容される場合、次のようになります。

perl -ne'print if /^192\.9\.200\.([0-9]+)$/ && 0 <= $1 && $1 <= 255' file

これらのスニペットは両方とも、STDIN からの入力も受け入れます。


完全な IP アドレスの場合:

perl -ne'
    BEGIN { $ip = shift(@ARGV); }
    print if /^\Q$ip\E$/;
' 1.2.3.4 file

また

perl -nle'
    BEGIN { $ip = shift(@ARGV); }
    print if $_ eq $ip;
' 1.2.3.4 file
于 2013-02-22T11:36:20.277 に答える
2

正規表現は数値の比較には適していません。次のようにしawkます。

$ awk -F. '$1==192 && $2==9 && $3==200 && $4>=0 && $4<=255 && NF==4' file
192.9.200.10
192.9.200.100
192.9.200.1

本当に使用したい場合は、代替が必要なため、拡張正規表現または使用grepのフラグが必要です。-Eegrep

$ grep -Ex '192\.9\.200\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])' file
192.9.200.10
192.9.200.100
192.9.200.1

$ IP=192\.9\.200\.

$ grep -Ex "$IP(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])" file

.注:文字どおりのピリオドを意味するようにエスケープする必要があります。

于 2013-02-22T11:34:47.083 に答える
0

持っているものが有効な IPv4 アドレスであることを本当に確認したい場合は、 (コアモジュールinet_aton()の一部) の戻り値をいつでも確認できます。Socket

于 2013-02-23T02:16:26.457 に答える