如何使用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
手册中查找每个match
, RSTART
和RLENGTH
。
之后,你可能希望扩大这个处理在同一行上的多个匹配。 我不能为你做所有的功课:-)
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