如何根据给定的 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.1
、1.1.1.2
和 1.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 权限,以确保获得最佳、准确的结果。
为了证明这一点,我在名为 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 范围的 IP,即 1.1.1.1
、1.1.1.2
和 1.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 权限,以确保获得最佳、准确的结果。