awk - 在动作中使用正则表达式语句(带斜杠)(大括号)

时间:2013-08-01 10:15:26

标签: awk gawk

使用:

$ awk --version
GNU Awk 3.1.7

我对/中动作大括号{ }内的正斜杠awk中正确使用正则表达式感到有些困惑。例如,这有效:

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

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

$ 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()参数中?

2 个答案:

答案 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

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