使用awk匹配姓氏

时间:2015-09-23 12:26:54

标签: regex unix awk

假设有一个像这样的文件

1 | John Smith | 70000
2 | Al McSmith | 60000

如果我使用

awk -F"|" '$2~/Smith/' file

两行都匹配。

有没有办法只匹配约翰史密斯? (仅限AWK)

编辑:我试图匹配那些以史密斯为姓氏的人,而不是匹配麦克史密斯或者史密斯等人。

4 个答案:

答案 0 :(得分:4)

这可能适合你:

awk -F'|' '$2~/ Smith\s*$/' file

它不匹配:

fooSmith
Smithfoo
foo Smith is middlename

答案 1 :(得分:1)

Smith之前粘贴一个空格:

awk -F'|' '$2~/ Smith/' testfile

如果其中有John Smitherton这样的名称,那么也请在后面添加一个空格(因为看起来每个字段之间都有<space><delim><space>)。否则你可以用正则表达式获得一点点,但你的空间填充在这里非常有用。

答案 2 :(得分:0)

我做了测试。我用你的内容创建了file:test.in:

  

1 |约翰史密斯| 70000个
  2 | Al McSmith | 60000

然后尝试了另一种表达方式:

 awk -F'|' '{print $2~/\sSmith\s/}'  test.in

打印:

1
0

所以,史密斯1,麦克史密斯0。

[UPD] \s - 是一个特定于gawk

的附加字符

答案 3 :(得分:0)

使用grep

的另一种解决方案
grep -E "[^|]*\|[^|]*\<Smith\>"

<强>解释

[^|]匹配除|

之外的任何字符

\||

匹配

\< \>开头和结尾