我有一个不规则结构的文本文件,如下面的
first_name1 last_name1 designation1 email1 phone_number1
first_name2 last_name2 designation2 email2
first_name3 last_name3 designation3 email3 phone_number3 address3
如您所见,电子邮件可能是最后一列,倒数第二列或第三列。这意味着一个人根本无法使用$ NF来获取电子邮件。我的目标是获取电子邮件地址,然后在@之前提取部分,例如email1 = foobar@dept.company.com然后我想提取foobar。如何编写awk查询以提取电子邮件地址的第一部分。我试过这个,但它正在寻找完全匹配。我怎样才能进入正则表达式来完成工作。
awk '{for(i=1;i<=NF;i++){ if($i=="foobar@dept.company.com"){print $i} } }' users.txt
答案 0 :(得分:2)
您正在将$i
与字符串"foobar@dept.company.com"
进行比较,所以当然这只会进行精确比较。您正在寻找的是$i
是否匹配(~
)正则表达式(/.../
而不是"..."
),然后根据您的需要定制正则表达式。尝试类似:
awk '{for(i=1;i<=NF;++i){if ($i ~ /.+@.+/){sub(/@.*$/, "", $i); print $i; next}}}'
正则表达式/.+@.+/
匹配其中包含@
的字符串,以及之前和之后的一些非空字符。这将不匹配,例如@foobar
或foobar@
,或仅@
。您可能需要考虑使用更符合(某事物) /.+@.+\..+/
(某事物) @
的内容.
(某事)因为域名通常包含.
。如果您愿意,可以使这个正则表达式更加具体。
sub(/@.*$/, "", $i)
表示在$i
之后(包括)第一个@
中的所有内容替换为行结束($
),并带有空字符串{{ 1}},从而剥离""
之前的部分(即用户名)。 @
打印它,print $i
移动到下一行(跳过当前记录的任何剩余字段)。
答案 1 :(得分:0)
我根本不知道awk,但我查看了正则表达式参考,应该支持:\b([^ ]*@.*?)($|[^\w@.])
,其中第1组与电子邮件匹配。这只是在包含@
的单词边界之后搜索某些内容。匹配结束于下一个非单词字符,不包括@
和.
。