我有一个这样的文本文件:
1|2|3|4|5|6|7|8|9|192.168.1.1
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
如果$ 10以“192.168.2。”开头,我需要打印,如下所示:
1|2|3|4|5|6|7|8|9|192.168.2.1
我试过这样(我使用var因为我从其他文件中得到这个ip块,这只是样本):
awk -v var="192.168.2." -F'|' '{if ($10 ~ "^" var) print $0;}'
输出:
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
我该如何解决?为什么在var?
中的最后.
不起作用
答案 0 :(得分:2)
使用此awk
:
awk -v var="192[.]168[.]2[.]" -F'|' '$10 ~ var{print}' file
如果您无法更改输入IP
格式,请尝试以下操作。
awk -v var="192.168.2." -F'|' 'BEGIN{gsub("[.]", "\\.", var)} $10 ~ var{print}'
输出:
1|2|3|4|5|6|7|8|9|192.168.2.1
答案 1 :(得分:1)
.
字符是通配符。您应该使用\.
替换匹配字符串中的实例,并且应该使用/
包围正则表达式。如果您想参数化IP地址,可能需要更新的
var="192\.168\.2\."
awk -F'|' '{if ($10 ~ /^'${var}'/) print $0;}'
您可能还想使用Awk的模式规则语义:
awk -F'|' '$10 ~ /^'${var}'/ {print $0}'
这有点整洁。
您可以像这样转义您的IP地址:
var=$(echo ${var} | sed 's/\./\\./g')
答案 2 :(得分:1)
gawk -F"|" 'match($10, "192.168.2.*") {print}' input-file
我得到以下输出:
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
我想这是实现这一目标的最简单方法。