AWK匹配指定IP起止段时误匹配相似IP的问题解决
解决AWK匹配IP时误匹配相似条目的问题
问题根源在于你用的正则匹配是部分匹配:
.在正则表达式里代表任意单个字符,不是字面意义的点- 没有限制匹配的位置,导致
130.202.10.0里的30.202.10.0子串会被误匹配,触发x=1,之后没遇到31.202.10.0,所以后面的内容一直被输出。
给你两个可行的解决办法:
方法一:直接整行字符串匹配
如果你的IP是单独占一行(没有多余字符),直接用字符串相等判断,完全避免正则匹配的坑:
awk -v startpat="${startpat}" -v endpat="${endpat}" '$0 == startpat{ x = 1} $0 == endpat{ x = 0}x' inputfile
这种方式只在整行内容和startpat/endpat完全一致时才切换状态,不会出现子串误匹配的情况。
方法二:转义IP并锚定正则匹配
如果IP所在行可能有空格或其他前缀后缀(比如行首空格),可以先转义IP里的.,再用行首行尾锚定确保整行匹配:
awk -v startpat="${startpat}" -v endpat="${endpat}" ' BEGIN { # 把IP里的.转义成正则的字面量. gsub(/\./, "\\.", startpat) gsub(/\./, "\\.", endpat) # 加上行首^和行尾$锚定,确保只匹配整行 startpat = "^" startpat "$" endpat = "^" endpat "$" } $0 ~ startpat { x = 1 } $0 ~ endpat { x = 0 } x' inputfile
用以上两种方法处理你的输入文件,都会得到预期输出:
abcd efgh
内容的提问来源于stack exchange,提问作者Aires69
相关产品推荐
相关产品推荐

