使用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
这就是我需要的东西:)非常感谢!
答案 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
手册中了解match
,substr
,RSTART
和RLENGTH
。
之后你可能希望扩展它以处理同一行上的多个匹配。我不能为你做所有你的作业: - )
答案 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