awk '
function valid(v,a) { return (int(v)==v && v>=a[0] && v<=a[1] ? 1 : 0) }
BEGIN { FS="/" # split input on "/"
ip[0]=0; ip[1]=255 # ip tuple range
sm[0]=0; sm[1]=32 # subnet mask range
}
{ print "############", $0
n=split($1,a,".") # split ip on "."
if (NF>2 || n!=4) next # more than 2 "/"-delimited fields or ip tuple count !=4?
for (i=1;i<=4;i++) # loop through ip tuples
if (! valid(a[i],ip)) next # validate each tuple
if (NF==2 && ! valid($2,sm)) next # validate the subnet mask (if provided)
}
1 # if we get here we have a valid ip(/mask) so print it
' ip.txt
4条答案
按热度按时间mwngjboj1#
有效的CIDR不仅仅意味着四组由句点分隔的数字。有效的CIDR要求每个数字介于
0
和255
之间。此外,子网掩码必须介于/0
和/32
之间。或者它可能根本不存在,这意味着/32
。根据https://www.oreilly.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html:
会是一个很好的正则表达式来满足四个带点的八位字节。添加子网掩码将导致:
和示例输出:
wztqucjr2#
一个awk解决方案,没有正则表达式:
这将使用来自How to Calculate a CIDR的信息检查CIDR
现在你只需要根据自己的需要进行输出.
6mzjoqzu3#
从问题和其他答案中搜索IP/掩码示例列表:
一个
awk
的想法:这产生:
alen0pnh4#
如果我理解正确的话,awk也没有/d等等。
GNU
AWK
具有所谓的字符类,在用户指南的Bracket Expressions章节中有描述,设计用于[
和]
,例如,如果您需要在file.txt
中查找包含字母后跟数字的行,您可以将其表示为160.0.0.0/24但不是:160.0.0.0/24aaa57
为了防止匹配部分而不是整个字提供Regexp operartos中描述的
\y
字边界,考虑以下简单示例,然后
给出输出
因此,只有在有效的CIDR表示法的情况下,它才应该匹配。
考虑到它规定每个元素都在某个范围内,利用算术比较而不是正则表达式可能更直接。