1

使用:

$ awk --version
GNU Awk 3.1.7

我对正确使用包含/{ }. awk例如,这有效:

$ echo "4,testing" | awk -F, '/test/ {print $0}'
4,testing

使用ifandmatch代替正斜杠正则表达式语法也可以使用(如果添加了额外的外部操作大括号):

$ echo "4,testing" | awk -F, '{if(match($0, "test")) {print $0}}'
4,testing

所以,我想,/REGEX/应该相当于if(match($0, "test")),对吧?

无论如何,我想对每个字段进行一些测试 - 然后对整个字符串进行正则表达式检查......并match在嵌套动作括号内if按预期工作:

$ echo "4,testing" | awk -F, '{if($1==4) {if(match($0, "test")) {print $0}}}'
4,testing

...但是,如果我想if(match(...))用正斜杠正则表达式替换,我得到:

$ echo "4,testing" | awk -F, '{if($1==4) {/test/ {print $0}}}'
awk: {if($1==4) {/test/ {print $0}}}
awk:                    ^ syntax error

谁能解释规则是什么,何时使用正斜杠正则表达式 - 以及何时使用match()正则表达式?


在写这篇文章时,我偶然发现这是可行的:

$ echo "4,testing" | awk -F, '{if($1==4) {if(/test/) {print $0}}}'
4,testing

...所以看起来:在一个动作中,正斜杠正则表达式必须在if语句的参数中......但这对我来说仍然没有意义 - 鉴于在上面的第一个示例中,正则表达式不是(至少,对我来说不是很明显)位于if()争论中?

4

2 回答 2

4

正斜杠内的字符串是正则表达式字符串awk就像 /test/不是操作一样,就像match()函数是函数而不是操作一样。语法是正则表达式比较运算符/test/{print $0}的简写。但是,这是条件在块之外的情况。if ($0~/test/){print $0}~

您等同{if (match($0, "test")){print $0}}于,{/test/{print $0}}但是在块内您仍然需要该if语句:

$ echo "4,testing" | awk -F, '{if($1==4) {if (/test/){print $0}}}'
4,testing

regexp 运算符~是常用的而不是match()函数,尽管它确实有它的用例。

你真正应该做的是:

$ echo "4,testing" | awk -F, '$1==4&&/test/'
4,testing

我们不需要块作为默认块,awk我们{print $0}使用逻辑运算符 AND 来测试两个条件是否为真&&

于 2013-08-01T10:27:05.167 回答
1

的基本语法awk是它是一个序列:

<condition> <action>

是在每一行测试的<condition>表达式;如果为真,<action>则执行。如果 action 是一个{ ... }块,它必须包含statements。在语句中,要测试您必须使用的条件if

另一种思考方式是,每一行的部分都有一个隐含if的部分。<condition>awk

正则表达式只是一种可以出现在条件中的表达式。

于 2013-08-01T10:22:36.230 回答