awk找到一个列并修剪

时间:2016-12-08 21:58:19

标签: regex awk filter

我有一个不规则结构的文本文件,如下面的

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 

2 个答案:

答案 0 :(得分:2)

您正在将$i与字符串"foobar@dept.company.com"进行比较,所以当然这只会进行精确比较。您正在寻找的是$i是否匹配(~)正则表达式(/.../而不是"..."),然后根据您的需要定制正则表达式。尝试类似:

awk '{for(i=1;i<=NF;++i){if ($i ~ /.+@.+/){sub(/@.*$/, "", $i); print $i; next}}}'

正则表达式/.+@.+/匹配其中包含@的字符串,以及之前和之后的一些非空字符。这将匹配,例如@foobarfoobar@,或仅@。您可能需要考虑使用更符合(某事物) /.+@.+\..+/ (某事物) @ 的内容. (某事)因为域名通常包含.。如果您愿意,可以使这个正则表达式更加具体。

sub(/@.*$/, "", $i)表示在$i之后(包括)第一个@中的所有内容替换为行结束($),并带有空字符串{{ 1}},从而剥离""之前的部分(即用户名)。 @打印它,print $i移动到下一行(跳过当前记录的任何剩余字段)。

答案 1 :(得分:0)

我根本不知道awk,但我查看了正则表达式参考,应该支持:\b([^ ]*@.*?)($|[^\w@.]),其中第1组与电子邮件匹配。这只是在包含@的单词边界之后搜索某些内容。匹配结束于下一个非单词字符,不包括@.