LinuxとSolaris - ネットマスクIPを通常のIPから分離

LinuxとSolaris - ネットマスクIPを通常のIPから分離

IPアドレスとネットマスクIPを含むファイルがあります。

私の目標は、次のように始めることです。file_with_IPs.txtそして他のファイルに貼り付けてくださいfile_with_only_netmask_ips.txt

注 - ネットマスクIPはネットマスクIPの組み合わせであり、xxx.xxx.xxx.xxx/1から最大xxx.xxx.xxx.xxx/32まで開始できます。

例えば

  10.140.4.11    10.140.4.110    
  255.255.0.0    255.255.255.0    
  10.219.39.188  10.219.39.200
  10.219.39.189  10.219.39.145
  10.140.4.12    10.140.4.120
  10.219.39.138   10.219.39.140
  10.219.39.139   10.219.39.239
  255.0.0.0        255.255.0.0
  255.255.255.128    255.255.255.192

だから結局私は入るでしょうfile_with_IPs.txt文書

  10.140.4.11    10.140.4.110    
  10.219.39.188  10.219.39.200
  10.219.39.189  10.219.39.145
  10.140.4.12    10.140.4.120
  10.219.39.138   10.219.39.140
  10.219.39.139   10.219.39.239

そしてfile_with_only_netmask_ips.txt次のネットマスクIPのみがあります。

  255.255.0.0    255.255.255.0
  255.0.0.0        255.255.0.0
  255.255.255.128    255.255.255.192

ネットマスクIPと一般IPを分離する最良の方法は何かを提案してください。

kshシェルを使用してプロセスを作成し、LinuxおよびSolarisシステムでプロセスを実行する必要があります。

注:perl one Linear、sed、awkはkshスクリプトで使用できます。

答え1

「ネットマスクIP」は、すべての設定ビットが左側にまとめられていることを意味するようです。 /0から/32まで32個しかありません。 grepステートメントにこれをリストできます(またはに渡すファイルにある方が良いgrep -f)。

この方法は退屈ですが、簡単です。

^0\.0\.0\.0$
^128\.0\.0\.0$
^192\.0\.0\.0$
^224\.0\.0\.0$

実際には私たちが探しているバイナリパターンなので、もう一度数値に変換してから少し修正してパターンと一致するかどうかを確認できます。しかし、これはgrepで完了するのではなく、実際のプログラミング作業になります。

紀元前に近いことができますが。テスト方法は次のとおりです$ip

(
    echo 'obase=2';
    echo "$ip" | sed -e 's/\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)/\1*(256^3)+\2*(256^2)+\3*256+\4/'
) bc | grep -q '^1*0*$' && echo yes || echo no

分解すると、echoはbcにバイナリとして出力するように指示します。その後、このsed行はIPアドレスを式に変換して数値を計算します。255.255.255.0になります。255*(256^3)+255*(256^2)+255*256+0見てくださいbc

obase=2
255*(256^3)+255*(256^2)+255*256+0

印刷し、パターンと11111111111111111111111100000000一致することを確認します。^1*0*$grep

IPを数値に変換するユーティリティがあれば、上記の複雑さを大幅に排除できます。それでも、grepパターンリストを使用するよりも遅くなる可能性があります。

答え2

1つの方法は次のとおりですawk

awk '{
    for(i=1;i<=NF;i++) {
        if($i~/^255/) {
            netmask[NR]=i>1?netmask[NR]"\t"$i:$i
        }
        else { 
            regular[NR]=i>1?regular[NR]"\t"$i:$i
        }
    }
}
END {
    for(i=1;i<=NR;i++) {
        if (regular[i]) {
            print regular[i] > "file_with_IPs.txt"
        }
        if (netmask[i]) {
            print netmask[i] > "file_with_only_netmask_ips.txt"
        }
    }
}' file

テスト:

$ ls
file

$ cat file
10.140.4.11    10.140.4.110    
255.255.0.0    255.255.255.0    
10.219.39.188  10.219.39.200
10.219.39.189  10.219.39.145
10.140.4.12    10.140.4.120
10.219.39.138   10.219.39.140
10.219.39.139   10.219.39.239
255.0.0.0        255.255.0.0
255.255.255.128    255.255.255.192

$ awk '{
>     for(i=1;i<=NF;i++) {
>         if($i~/^255/) {
>             netmask[NR]=i>1?netmask[NR]"\t"$i:$i
>         }
>         else { 
>             regular[NR]=i>1?regular[NR]"\t"$i:$i
>         }
>     }
> }
> END {
>     for(i=1;i<=NR;i++) {
>         if (regular[i]) {
>             print regular[i] > "file_with_IPs.txt"
>         }
>         if (netmask[i]) {
>             print netmask[i] > "file_with_only_netmask_ips.txt"
>         }
>     }
> }' file

$ ls
file  file_with_IPs.txt  file_with_only_netmask_ips.txt

$ cat file_with_IPs.txt 
10.140.4.11     10.140.4.110
10.219.39.188   10.219.39.200
10.219.39.189   10.219.39.145
10.140.4.12     10.140.4.120
10.219.39.138   10.219.39.140
10.219.39.139   10.219.39.239

$ cat file_with_only_netmask_ips.txt 
255.255.0.0     255.255.255.0
255.0.0.0       255.255.0.0
255.255.255.128 255.255.255.192

関連情報