正则表达式 - 与 awk 中的字符串部分完全匹配

regex - match exactly to a string portion in awk

我有一个文件,其中一列包含由 , 分隔的字符组成的字符串 示例:

a123456, a54321, a12312

我需要在逗号分隔列表中找到包含特定数字的行。 示例:我想查找仅包含 a12345.

的所有行

我尝试使用以下内容:

awk ' ~/a12345/ {print}'

但这会打印出包含以下内容的行:

a123456, a54321, a12312

因为正则表达式匹配 a123456 中的前 6 个字符,我猜。

我的问题是,如何制作一个只打印出仅包含完全匹配项的行的正则表达式?

尝试像下面这样使用 grep 的单词匹配:

grep -w a123456 myfile.txt

如果您需要在刚刚开始的字段中,请使用类似的东西:

egrep -w ^a123456 myfile.txt

使用 awk:

awk -F ',\s*' ' == "a12345"' filename

要沿逗号(可选地后跟空格)拆分行,并且 select 仅第一个字段恰好是 "a12345" 的那些行。即使该字段包含 "a12345" 之后算作单词边界的字符,这也将起作用,也就是说

a12345.foo, bar, baz

被过滤掉了。

如果要测试多个字段,则必须测试所有字段:

awk -F ',\s*' 'function check() { for(i = 1; i <= NF; ++i) { if($i == "a12345") return 1; } return 0 } check()' filename
$ awk '/(^|[^[:alnum:]])a12345([^[:alnum:]]|$)/' file
$ awk '/(^|[^[:alnum:]])a123456([^[:alnum:]]|$)/' file
a123456, a54321, a12312

对于 GNU awk,您可以使用单词分隔符:

$ awk '/\<a12345\>/' file
$ awk '/\<a123456\>/' file
a123456, a54321, a12312