![](/img/trans.png)
[英]How to print matched regex pattern using awk svr08-core1-1654761552.278?
[英]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
实现 ( gawk ) 的示例:
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
手册中阅读match
、 substr
、 RSTART
和RLENGTH
。
之后,您可能希望扩展它以处理同一行上的多个匹配项。
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.