我在尝试使用 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