如何使用awk打印匹配的正则表达式?

时间:2011-04-04 08:13:54

标签: regex awk

使用awk,我需要在文件中找到与正则表达式匹配的单词。

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

所以如果在线上,我有:

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

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

7 个答案:

答案 0 :(得分:125)

这是非常基本的

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

要求awk使用pattern搜索//,然后打印出该行,默认情况下称为记录,用$ 0表示。至少阅读documentation

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

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

答案 1 :(得分:95)

听起来你正试图模仿GNU的grep -o行为。这样做只要你想要每行的第一场比赛:

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

以下是一个例子:

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

awk手册中了解matchsubstrRSTARTRLENGTH

之后你可能希望扩展它以处理同一行上的多个匹配。我不能为你做所有你的作业: - )

答案 2 :(得分:26)

gawk 可以使用此操作获取每行的匹配部分:

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

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

答案 3 :(得分:9)

如果您只对最后一行输入感兴趣,并且您希望只找到一个匹配项(例如shell命令汇总行的一部​​分),您还可以尝试从{{采用的这个非常紧凑的代码。 3}}:

$ 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

这是使用grep而不是awk中的How to print regexp matches using `awk`?的另一个不错的解决方案。此解决方案对您的安装的要求较低:

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

答案 4 :(得分:5)

关闭主题,这也可以使用grep来完成,只要有人在寻找grep解决方案,就可以在此处发布

echo 'xxx yyy zzze ' | grep -oE 'yyy'

答案 5 :(得分:2)

在这种情况下,使用sed也可以很优雅。示例(用行中的匹配组“ yyy”替换行):

$ cat testfile
xxx yyy zzz
yyy xxx zzz
$ cat testfile | sed -r 's#^.*(yyy).*$#\1#g'
yyy
yyy

相关手册页:https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions

答案 6 :(得分:0)

如果您知道要查找的文本/图案(例如“ yyy”)位于哪一列,则只需检查该特定列以查看其是否匹配,然后打印出来即可。

例如,给定一个具有以下内容的文件(称为 asdf.txt

xxx yyy zzz

仅在第二列与模式“ yyy”匹配时才打印,您可以执行以下操作:

awk '$2 ~ /yyy/ {print $2}' asdf.txt

请注意,这基本上也将匹配第二列中带有“ yyy”的任何行,如下所示:

xxx yyyz zzz
xxx zyyyz