如何根据给定的 CIDR 从文本文件中删除 IP?

How to remove IP(s) from a text file based on given CIDR?

为了证明这一点,我在名为 blocked.txt 的文本文件中有几个 IP,其内容如下:

1.1.1.1
1.1.1.2
1.1.1.3
2.1.1.1
2.1.1.2

因此给定 1.1.1.0/24

的 CIDR 输入

我想删除属于此 CIDR 范围的 IP,即 1.1.1.11.1.1.21.1.1.3

唯一让我卡住的是如果给定 CIDR 形式,如何列出所有 IP。示例:

#!/bin/bash
cidr_ip="1.1.1.0/24"
ip_exist=$(echo "${cidr_ip}" | grep_all_the_ip_in_that_CIDR in blocked.txt)
echo ${ip_exist} # This will list out all the iP and then I can use this to remove the IP

预期的输出,blocked.txt只会有这个内容:

2.1.1.1
2.1.1.2

=================================

我正在使用此数据进行测试:

161.35.169.25
104.228.72.171
177.5.53.176
103.56.43.225
20.58.48.57
27.115.124.6
1.1.1.1
111.229.188.72
27.115.124.70
51.15.179.65
77.245.149.46
180.163.220.68
71.68.239.90
45.142.120.87
42.236.10.125
42.236.10.114
212.70.149.53
1.1.1.0/24
1.1.1.9
1.1.1.10
1.1.1.2
1.1.1.3
2.1.1.0/24
2.1.1.1
3.1.1.0/24
212.70.149.84
103.249.77.2
5.178.86.76

编辑: 由于 OP 添加了更多示例来处理带有 / 的行,因此可以尝试以下操作。

awk -F'/' -v val="1.1.1.0/24" '
BEGIN{
  match(val,/.*\./)
  matched=substr(val,RSTART,RLENGTH-1)
  split(substr(val,RSTART+RLENGTH),arr,"/")
  for(i=arr[1];i<=arr[2];i++){
   skip[matched"."i]
  }
}
!( in skip)
'  Input_file


您能否尝试使用 GNU awk 中显示的示例进行跟踪、编写和测试。其中变量 val 是您的 IP 范围。

awk -v val="1.1.1.0/24" '
BEGIN{
  match(val,/.*\./)
  matched=substr(val,RSTART,RLENGTH-1)
  split(substr(val,RSTART+RLENGTH),arr,"/")
  for(i=arr[1];i<=arr[2];i++){
   skip[matched"."i]
  }
}
!([=11=] in skip)
'  Input_file

说明: 为以上添加详细说明。

awk -v val="1.1.1.0/24" '                        ##Starting awk program from here and creating variable val which has that range here.
BEGIN{                                           ##Starting BEGIN section of this program from here.
  match(val,/.*\./)                              ##using match function to match everything till . in variable val here.
  matched=substr(val,RSTART,RLENGTH-1)           ##Creating matched which has sub string of matched regex value in var variable.
  split(substr(val,RSTART+RLENGTH),arr,"/")      ##Splitting rest of value of var which is actual range into array arr here.
  for(i=arr[1];i<=arr[2];i++){                   ##Running for loop from 1st item value to 2nd item value of array here.
   skip[matched"."i]                             ##Creating skip array which has index as matched(variable) dot and i here, it contains which ips to be negleted basically.
  }
}
!([=12=] in skip)                                    ##In main block of program checking condition if current line is NOT present in skip then print that line.
' Input_file                                     ##Mentioning Input_file name here.

另一种方法是使用支持 CIDR 表示法的 nmap:

nmap -sn -v 1.1.1.0/24 | awk '/^Nmap scan/ { print  }' > ipadds.txt

运行 CIDR 范围上的 nmap 使用 -v 进行简单的 ping 扫描以显示也可能已关闭的主机。使用 awk 去除 IP 地址以外的所有内容,将它们输出到文件 ipadds.txt

grep -v -f ipadds.txt blocked.txt

使用 ipadds.txt 中的条目对 blocked.txt 进行反向搜索。

注意 - 该解决方案可能并不适合所有人,并且取决于网络管理和您使用网络扫描工具的能力。您还需要 运行 nmap 的 sudo 权限,以确保获得最佳、准确的结果。