awk 匹配出现问题

awk 匹配出现问题

我在尝试使用 awk 匹配精确的字符串时遇到问题。

我的目的是在 csv 中搜索匹配项并获取该匹配项的行号。因此,如果我在下面的文件中搜索“1.1.1.2”,我希望它返回“1”

CSV

[apache@JBLAMPS001 tmp]$ cat test.csv
node2,1.1.1.2
node20,1.1.1.20
node21,1.1.1.21
node22,1.1.1.22
node102,1.1.1.102
node202,1.1.1.202

我尝试过的事情

[apache@JBLAMPS001 tmp]$ awk '/'1.1.1.2'/ {print NR}' test.csv
1
2
3
4
5
6

[apache@JBLAMPS001 tmp]$ awk '/\y'1.1.1.2'\y/ {print NR}' test.csv
1
5

[apache@JBLAMPS001 tmp]$ awk '"^1.1.1.2$" {print NR}' test.csv
1
2
3
4
5
6

有谁知道我该如何构建这个?谢谢。

答案1

如果您想使用正则表达式,则需要使用适当的修饰符和锚点来仅获得所需的匹配项。在您的情况下,正则表达式模式1.1.1.2.顺便说一句,意味着任何单个字符)将匹配所有行,从而得到结果。最后一个不是awk '"^1.1.1.2$" {print NR}'如何放入正则表达式模式awk- 您需要使用//$<field> ~ <pattern>


以下是获得您想要的结果的方法:

  • 正则表达式方式:转义所有.s 以按字面意思对待它们,添加$到匹配末尾:

    awk '/1\.1\.1\.2$/ {print NR}' test.csv
    
  • ,字符串操作:如果后面跟着任何水平空格分隔的最后一个字段,则打印记录号1.1.1.2

    awk -F ',[[:blank:]]*' '$NF == "1.1.1.2" {print NR}' test.csv 
    

答案2

ip=1.1.1.2; sed -ne "/,${ip//./\\.}\$/=" yourIPfile

我们转义点.并将其提供给 sed 命令=,该命令将显示匹配的行号。

答案3

你总是可以尝试旧的grep

grep -wFn 1.1.1.2 yourIPfile

或者

ip=1.1.1.2 ; grep -wFn $ip yourIPfile

在这两种情况下,输出都是

1:node2,1.1.1.2

相关内容