正则表达式用于排除一定范围内的数据

正则表达式用于排除一定范围内的数据

我想删除所有格式为 10.20.30.* 且最后 3 位数字在 0 到 200 范围内的 IP 地址,并将所有剩余的 IP 移动到新文件中。

我已将要排除的IP列表放入文件whiteIP.txt中,其内容为:

^10.20.30.([0-1][0-9][0-9]|2[00])

我的原始文件的内容是:

10.20.30.150,20
10.20.30.134,20
10.20.30.201,20
10.20.30.5,20
10.20.30.250,20
10.20.30.42,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20

我正在尝试命令:

grep -vE -f whitetest.txt testIP.txt

它给了我错误的结果。它应该给我以下结果:

10.20.30.201,20
10.20.30.250,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20

任何建议都会有很大帮助。

答案1

几件事:

.是一个特殊字符,因此必须对其进行转义:

^10\.20\.30\.([0-1][0-9][0-9]|2[00])

2[00]匹配 20 个,而不是 200 个:

^10\.20\.30\.([0-1][0-9][0-9]|200)

您必须分别处理单位数和两位数:

^10\.20\.30\.([0-1][0-9][0-9]|200|[0-9][^0-9]|[0-9][0-9][^0-9])

这给出了正确的结果:

$ grep -vE -f whitetest.txt testIP.txt
10.20.30.201 20
10.20.30.250 20
222.233.201.5 20
10.233.201.5 20
111.233.201.5 20

答案2

我认为这应该得到你想要的:

grep -vE '10\.20\.30\.(1|..?,|200)
' <<\IN
10.20.30.150,20
10.20.30.134,20
10.20.30.201,20
10.20.30.5,20
10.20.30.250,20
10.20.30.42,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20
IN

基本上,您只需排除 10.20.30 的任何匹配项,其中最后一个八位字节少于三个字符,以 1 开头,或者整个为 200。

以上打印:

10.20.30.201,20
10.20.30.250,20
222.233.201.5,20
10.233.201.5,20
111.233.201.5,20

相关内容