Unix 解释awk命令

Unix 解释awk命令,unix,awk,Unix,Awk,今天我在网上搜索一个命令来打印一个模式后的下两行,我遇到了一个我无法理解的awk命令 $ /usr/xpg4/bin/awk '_&&_--;/PATTERN/{_=2}' input 有人能解释一下吗?非常模糊。将在时间允许时更新 \被用作变量名。&&是一个逻辑运算符,有两个true操作一起运行。一旦u的值减为零,&&的后半部分为false,并且不生成任何输出 print -- " xxxxx yyyy PATTERN zzz aa bbb ccc ddd" | awk '_

今天我在网上搜索一个命令来打印一个模式后的下两行,我遇到了一个我无法理解的awk命令

$ /usr/xpg4/bin/awk '_&&_--;/PATTERN/{_=2}' input

有人能解释一下吗?

非常模糊。将在时间允许时更新


\
被用作变量名。
&&
是一个逻辑运算符,有两个true操作一起运行。一旦u的值减为零,&&的后半部分为false,并且不生成任何输出

print -- "
xxxxx
yyyy
PATTERN
zzz
aa
bbb
ccc
ddd" | awk '_&&_--;/PATTERN/{_=2}'
输出

zzz
aa
_=
0
_=
0
_=
0
_=
0
_=2
zzz
_=1
1
aa
_=0
0
_=0
0
_=0
0
_=0
0
调试版本

print -- "
xxxxx
yyyy
PATTERN
zzz
aa
bbb
ccc
ddd" | awk '_&&_--;{print "_="_;print _&&_};/PATTERN/{_=2;print "_="_ }'
输出

zzz
aa
_=
0
_=
0
_=
0
_=
0
_=2
zzz
_=1
1
aa
_=0
0
_=0
0
_=0
0
_=0
0

简单地说,该命令在给定正则表达式匹配后打印许多行,但不包括匹配的行

行数在块
{u2}
中指定,如果行匹配
模式
,则变量
{/code>设置为2。在匹配行之后读取的每一行都会导致
递减。您可以读取
&&
,就像
大于零然后从中减去一一样,匹配后的每一行都会发生这种情况,直到
达到零为止。用一个更合理的名称(如
n
)替换变量
\uu
)非常简单

一个简单的演示应该清楚地说明这一点(打印任何匹配的
foo
行后面的两行):

因此,
n
只有在将一行与
foo
匹配后设置为2时才是真的,然后它递减
n
并打印当前行。由于
awk
具有短路评估
n
仅在
n
为真(n>0)时减小,因此在这种情况下
n
的唯一可能值为2,1或0

Awk具有以下结构
条件{block}
,当条件的计算结果为True时,则对当前记录执行block。如果不提供块
awk
将使用默认块
{print$0}
so
n&&n--
是一个没有块的条件,该块仅对正则表达式匹配后的
n
行计算为True。分号仅用于分隔条件
/foo/
的条件
n&&n--
,明确表示该条件没有块

要打印匹配后的两行,包括您要执行的匹配,请执行以下操作:

$ awk '/foo/{n=3} n && n--' file
foo
1
2
foo
a
b

额外:使用了
/usr/xpg4/bin/awk
的完整路径这一事实告诉我,此代码适用于Solaris机器,因为
/usr/bin/awk
已完全损坏,应不惜一切代价避免使用

\u
在这里被用作变量名(有效但明显容易混淆)。如果您将其改写为:

awk 'x && x--; /PATTERN/ { x=2 }' input
这样就更容易解析了。只要匹配了
/PATTERN/
,变量就会被设置为
2
(并且该行没有输出)-这是第二部分。第一部分在
x
不为零时触发,并递减
x
并打印当前行(默认操作,因为该子句未指定操作)


最终结果是,只要两行中的任何一行都与图案不匹配,就在图案匹配后立即打印这两行。

说明

print -- "
xxxxx
yyyy
PATTERN
zzz
aa
bbb
ccc
ddd" | awk '_&&_--;{print "_="_;print _&&_};/PATTERN/{_=2;print "_="_ }'
awk
表达式具有以下形式:

condition action; NEXT_EXPRESSION
如果条件为真,将执行操作。进一步注意,如果条件为真,但操作被省略,awk
将执行
打印
(默认操作)

代码中有两个表达式将在每一行输入上执行:

_&&_--          ;
/PATTERN/{_=2}
两者之间用
分隔。正如我所说的,如果省略操作,将发生默认操作
打印
,它与相同:

_&&_--    {print};
/PATTERN/ {_=2}
在您的示例中,
\uuu
是一个变量名,它在第一行输入上由
0
初始化,然后由awk自动使用

第一个条件是
(0)&(0)
。。由于
0&&0
的计算结果为
false
且awk将不打印,导致条件为false的内容

如果找到模式,
将被设置为
2
,这使得第一个条件在下一行是
(2)和&(2)
,在该行之后的下一行是
(1)和&(1)
,因为在对条件进行评估后,
将递减。两者的计算结果均为
true
,awk将打印这些行


不过,这是一个很好的谜题;)

请参阅此处重复的答案。

稍有错误,后减量具有更高的逻辑顺序或优先级,因此显式地
(0)和&(0--)
,因为
(0和&&0)--
计算结果为-1。很高兴知道。。让我用这种方式来增强帖子。@sudo_O
awk'&&&&;1{printf“%i\n”/Pattern/{{u=2}'input.txt
我不理解上面这行的输出。如果减量发生在之前(符合awk文档,您是对的),则
&
的右侧在第一次测试中应为1,在模式匹配后的第二次测试中应为0。所以我希望只打印一行。。我在这里遗漏了什么?这很微妙,但也许这有助于你注意到条件
0,2,1,0,2,1,0
之前的
n
模式,这是因为后减量发生在条件评估之后。
跳过
回音
先决定,然后
n
递减。@sudo\u是的,在散步时考虑过这个问题。。运算符优先级与条件求值之前或之后发生的增量操作无关。对不起,我真丢脸,我应该知道这件事!;)。。。现在将更新帖子,使其完全正确。。。