如何使用awk grep IP块?

时间:2016-04-08 07:54:47

标签: bash awk

我有一个这样的文本文件:

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?

中的最后.不起作用

3 个答案:

答案 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

我想这是实现这一目标的最简单方法。