如何使用 查找 IP 地址范围sed
?
例如:
sed '/85.159.56/s/$/ --- API SYSTEMS/'
这将找到以 85.159.56 开头的 IP 地址并在其旁边打印: --- API SYSTEMS
我有一个范围要过滤,但我不确定如何应用 Between 或大于 in sed
:
sed '/192.200.160.0 - 192.200.191.255/s/$/ --- APIv2 SYSTEMS/'
答案1
数字范围不太适合正则表达式,因为它们需要这样的表达式:
gsed '/192\.200\.1\([6-8][0-9]\|9[01]\)\./s/$/ --- APIv2 SYSTEMS/'
要匹配 160 和 191 之间的值,因此理想情况下,您需要编写可以生成表达式的代码,因为手动编写或修改此类表达式的人为错误的可能性非常高。更好的解决方案可能是能够理解 IP 地址并支持 CIDR 表示法的解决方案,例如 Perl网络地址::IP模块,然后解析 IP 地址并检查它们是否是->within
从其他地方解析的某个范围。
答案2
简短(非 SED)答案
抱歉,但这是我能在一句台词中做到的最好的事情。显然,这不是 SED。
perl -MNetAddr::IP -i.bak -nle '$re=NetAddr::IP->new("85.159.56.0/24")->re(); if(/$re/){ print $_ . " --- APIv2 SYSTEMS"}else{print}' yourfile.txt
它能做什么
这将采用子网“85.159.56.0/24”并将其转换为正则表达式,然后测试该表达式的每一行,如果存在匹配,则会将“ --- APIv2 SYSTEMS”添加到行末尾。
- “-Mmodule”在运行代码之前加载模块。
- “-i.bak”表示它将就地修改文件(yourfile.txt)并备份为yourfile.txt.bak
- “-n”导致 Perl 循环你的程序,这使得它迭代文件名参数,有点像 sed -n 或 awk
- “-s”允许您在程序外部设置参数
- 而“---variable=X”就是我们设置它的方式。
- “-l”是因为我很懒,它会清理输入行并将回车符附加到任何输出
- 最后“-e 'print“I'm a one-liner”'是保存代码的位
只是正则表达式
如果您只想要正则表达式(在 grep 或 sed/awk 等中使用):
perl -MNetAddr::IP -lse 'print NetAddr::IP->new($range)->re()' -- -range=85.159.56.0/24
如果您好奇的话,它会输出以下内容:
(?:(?<![0-9])85\.159\.(?:56)\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?![0-9]))
先决条件
值得注意的是,您可能需要从 cpan 安装 NetAddr::IP 模块(我使用 cpanm 因为我没有足够的内存,但语法是相同的:
sudo cpanm install NetAddr::IP
结束语
SED 和 AWK 是很棒的工具,我确实有几本关于它们的书,并尝试在必要时使用它们,但是 Perl 通常会为您提供一系列模块和整个单行代码的支持。我很确定 Python 也有这类工具,但我是 Perl 的粉丝。我也可以推荐吗http://explainshell.com我经常用它来弄清楚有人要求我运行什么。它使用命令和各种开关/参数,只向您显示手册页的相关部分。