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

时间:2015-02-26 13:26:25

标签: regex awk

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

a123456, a54321, a12312

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

我尝试使用以下内容:

awk ' $1~/a12345/ {print}'

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

a123456, a54321, a12312

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

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

3 个答案:

答案 0 :(得分:1)

$ awk '/(^|[^[:alnum:]])a12345([^[:alnum:]]|$)/' file
$ awk '/(^|[^[:alnum:]])a123456([^[:alnum:]]|$)/' file
a123456, a54321, a12312

使用GNU awk,你可以使用单词分隔符:

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

答案 1 :(得分:0)

尝试使用grep的单词匹配,如下所示:

grep -w a123456 myfile.txt

如果你需要刚开始的领域,那么使用类似的东西:

egrep -w ^a123456 myfile.txt

答案 2 :(得分:0)

使用awk:

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

要沿着逗号分割该行(可选地后跟空格)并仅选择第一个字段正好为“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