繁体   English   中英

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

[英]How to print matched regex pattern using 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

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

这是非常基本的

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

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

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

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

这是一个使用 GNU 的awk实现 ( ) 的示例:

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

之后,您可能希望扩展它以处理同一行上的多个匹配项。

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

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

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

如果您只对输入的最后一行感兴趣,并且希望只找到一个匹配项(例如 shell 命令的摘要行的一部分),您还可以尝试使用这个非常紧凑的代码,从How to print regexp matchings 中采用使用`awk`?

$ 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使用后视正则表达式的另一个不错的解决方案。 此解决方案对您的安装要求较低:

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

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

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

要实现不区分大小写的匹配,请添加i修饰符

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

要在比赛后打印所有内容:

perl -lne 'if ($found){print} else{if (/regex(.*)/){print $1; $found++}}' textfile

要打印比赛和比赛后的所有内容:

perl -lne 'if ($found){print} else{if (/(regex.*)/){print $1; $found++}}' textfile

题外话,这也可以使用 grep 来完成,如果有人正在寻找 grep 解决方案,只需将其张贴在这里

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

在这种情况下,使用 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

如果您知道要查找的文本/模式(例如“yyy”)在哪一列,您只需检查该特定列以查看它是否匹配,然后打印它。

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

xxx yyy zzz

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

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

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

xxx yyyz zzz
xxx zyyyz

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM