如何使用awk从文件中获得匹配正则expression式模式?

使用awk ,我需要在与正则expression式匹配的文件中find一个单词。

我只想打印与模式匹配的单词。

所以,如果在行中,我有:

 xxx yyy zzz 

和模式:

 /yyy/ 

我只想得到:

 yyy 

编辑:感谢kurumi我设法写这样的事情:

 awk '{ for(i=1; i<=NF; i++) { tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/) if(tmp) { print $i } } }' $1 

这就是我需要:)非常感谢!

这是非常基本的

 awk '/pattern/{ print $0 }' file 

请求awk使用//searchpattern ,然后打印出该行,默认情况下称为logging,由$ 0表示。 至less阅读文档 。

如果您只想打印出匹配的单词。

 awk '{for(i=1;i<=NF;i++){ if($i=="yyy"){print $i} } }' file 

这听起来像是在模仿GNU的grep -o行为。 这样做,只要你想在每一行的第一场比赛:

 awk 'match($0, /regex/) { print substr($0, RSTART, RLENGTH) } ' file 

这是一个例子:

 % awk 'match($0, /at/) { print substr($0, RSTART, RLENGTH) } ' /usr/share/dict/words | head act act act act aft ant apt art art art 

对于你的作业的其余部分,你应该在awk手册中查找每个matchRSTARTRLENGTH

之后,你可能希望扩大这个处理在同一行上的多个匹配。 我不能为你做所有的功课:-)

gawk可以使用这个动作获得每一行的匹配部分:

 { if (match($0,/your regexp/,m)) print m[0] } 

match(string,regexp [,array])如果存在数组,则将其清零,然后将数组的第零个元素设置为由regexp匹配的整个string部分。 如果regexp包含圆括号,则数组的整数索引元素被设置为包含与相应的括号化子expression式匹配的string部分。 http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions

如果Perl是一个选项,你可以试试这个:

 perl -lne 'print $1 if /(regex)/' file 

如果您只对input的最后一行感兴趣,并且希望只find一个匹配项(例如shell命令摘要行的一部分),那么您也可以尝试使用从AWG中的Print regexp匹配中采用的非常简洁的代码:

 $ echo "xxx yyy zzz" | awk '{match($0,"yyy",a)}END{print a[0]}' yyy 

或者部分结果的更复杂的版本:

 $ echo "xxx=a yyy=b zzz=c" | awk '{match($0,"yyy=([^ ]+)",a)}END{print a[1]}' b 

警告:具有三个参数的awk match()函数只存在于gawk ,而不是mawk

这里是另一个不错的解决scheme,在grep使用lookbehind正则expression式而不是awk 。 该解决scheme对您的安装有更低的要求:

 $ echo "xxx=a yyy=b zzz=c" | tail -n1 | grep -Po '(?<=yyy=)[^ ]+' b