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