我运行了各种 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