简短(非 SED)答案

简短(非 SED)答案

如何使用 查找 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我经常用它来弄清楚有人要求我运行什么。它使用命令和各种开关/参数,只向您显示手册页的相关部分。

相关内容