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 shell 编写该过程,并且需要在 Linux 和 Solaris 计算机上运行该过程

备注 perl one Linear , sed 和 awk 可以在 ksh 脚本中

答案1

通过“网络掩码IP”,您似乎意味着所有设置位都在左侧组合在一起。其中只有 32 个,从 /0 到 /32。您可以在 grep 语句中列出它们(或者更好的是,在您传递到的文件中grep -f)。

这种方法虽然乏味,但很简单;

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

由于它实际上是我们正在寻找的二进制模式,因此您可以将其转换回数字,然后对其进行一些位调整以确认它与模式匹配。不过,这将是一个实际的编程任务,而不是您与 grep 一起完成的任务。

虽然你可以做一些与 bc 接近的事情。以下是测试方法$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

一种方法是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

相关内容