使用:
$ awk --version
GNU Awk 3.1.7
我对/
中动作大括号{ }
内的正斜杠awk
中正确使用正则表达式感到有些困惑。例如,这有效:
$ echo "4,testing" | awk -F, '/test/ {print $0}'
4,testing
使用if
和match
代替正斜杠正则表达式语法也可以(如果添加了额外的外部动作括号):
$ 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()
参数中?
答案 0 :(得分:3)
正斜杠内的字符串是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来使用&&
测试两个条件为TRUE。
答案 1 :(得分:1)
awk
的基本语法是它的序列:
<condition> <action>
<condition>
是在每一行上测试的表达式;如果是,则执行<action>
。如果action是{ ... }
块,则必须包含语句。在声明中,要测试条件,您必须使用if
。
另一种思考方式是每条if
行的<condition>
部分周围隐含awk
。
正则表达式只是一种可以出现在条件中的表达式。