SED 搜索并删除部分匹配的 IP

SED 搜索并删除部分匹配的 IP

我运行了各种 bash 脚本,它们会扫描日志文件,查找那些试图制造恶作剧、向我们发送垃圾邮件等的人。

我已经努力了好几天试图弄清楚这个问题。

我有一个文本文件,其中列出了 ip

我使用 sed 扫描列表并删除 IP,例如我们的 IP 和其他已知 IP 和 IP 范围。这些 IP 可能是由犯错的人添加到此列表中的。

例如

在第一行中我尝试匹配所有45.182.32.165 以 45 开头的 IP。

理想情况下,我想删除以下内容 45.0.0.0/8或任何网络掩码/24

sed -i '' '/^45.*.*.*/d'  /directory/blocked_subnets/somelist
sed -i '' '/^50.81.238.*/d'  /directory/blocked_subnets/somelist
sed -i '' '/^50.84..*/d'  /directory/blocked_subnets/somelist

这些线路有时确实能起到预期的作用。

我尝试了在网上找到的各种正则表达式,但它们似乎不起作用。

我希望在这方面更有经验的人可以帮助我改进这个 sed -i 以使其正常工作。

其中“”是因为我在 freebsd 机器上执行此操作。

先感谢您。

答案1

感谢您的帮助。

可惜的是,上述建议对我都不起作用。

经过大量阅读和实验

我发现必须在 -i 之前添加 -r(以激活正则表达式),这是我用于正则表达式的格式,它似乎有效。

sed -r -i '' '/^120[.]152[.][0-9]{1,3}[.][0-9]{1,3}/d' /path/to/some/file

从文件“file”中删除 ip 120.152.35.192

我在“The Regedx Coach”上测试了正则表达式,它似乎是有效的。

然而,我欢迎任何额外的意见和建议来完善上述内容。

问候

答案2

我认为您的问题是用作.匹配任何字符的通配符,而不是用作\.匹配文字的通配符.

不幸的是,我不知道与 FreeBSD 的区别,但由于这是一个相当简单的正则表达式,我想它应该可以工作。我将使用以下通用正则表达式(非常简单)作为任何 IP 的通用正则表达式:

'/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/d'
  • ^: 以。。开始
  • [0-9]:任意数字
  • +:前一个匹配发生 1 次或多次
  • \.:文字点

所以现在如果我想匹配您的要求我会改变每个八位字节以匹配网络:

sed -i '' '/^45\.[0-9]+\.[0-9]+\.[0-9]+/d' /directory/blocked_subnets/somelist
sed -i '' '/^50\.81\.238\.[0-9]+/d' /directory/blocked_subnets/somelist
sed -i '' '/^50\.84\.[0-9]+\.[0-9]+/d' /directory/blocked_subnets/somelist

另外,请注意,只有当列表的每一行都以 IP 开头时(IP 之前甚至没有空格),此方法才会起作用。如果不是这种情况,只需删除^

看:https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html

答案3

顺便说一句:这也适用于 BusyBox 版本的命令。

对于其他正在寻找此答案的人,您可以使用grep -n范围、cut行号,然后传递执行sed删除该行的命令。

有几种方法可以做到这一点(单行或使用变量一次一个步骤),但这里是在线的:

grep -nm1 "^192.168.254.0/24" ./blocked_subnets.txt | cut -d \: -f 1 | xargs -n 1 -I {} sed -i "{}d" ./blocked_subnets.txt

如果使用变量,则不需要使用xargs以下sed步骤:

N=$(grep -nm1 "^192.168.254.0/24" ./blocked_subnets.txt | cut -d \: -f 1)
sed -i "${N}d" ./blocked_subnets.txt

你需要以。。开始(插入符号)字符来捕获一些极端情况,您还需要在第二个示例中使用 {} shell 替换,因为下一个字符是字母([a-zA-Z],表示"$Nd"失败)。在第一场比赛后m1停止。grep

编辑:

是的是通配符匹配,但它匹配.IP 地址中的我们没必要逃脱因此不需要对 IP 范围(或 IP 地址)进行预处理,只需进行验证,并且grep使固定2>/dev/null那也是(虽然可能需要grep)。


额外的:

如果您要直接从中删除(或从包含添加时的输出ip的日志中删除),则需要将匹配中的插入符号( )字符更改为空格()(以捕捉相同的极端情况)。ip^grep

相关内容