Unix 解释awk命令
今天我在网上搜索一个命令来打印一个模式后的下两行,我遇到了一个我无法理解的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 '_
$ /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}
son&&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_Oawk'&&&&;1{printf“%i\n”/Pattern/{{u=2}'input.txt
我不理解上面这行的输出。如果减量发生在之前(符合awk文档,您是对的),则&
的右侧在第一次测试中应为1,在模式匹配后的第二次测试中应为0。所以我希望只打印一行。。我在这里遗漏了什么?这很微妙,但也许这有助于你注意到条件0,2,1,0,2,1,0
之前的n
模式,这是因为后减量发生在条件评估之后。跳过
或回音
先决定,然后n
递减。@sudo\u是的,在散步时考虑过这个问题。。运算符优先级与条件求值之前或之后发生的增量操作无关。对不起,我真丢脸,我应该知道这件事!;)。。。现在将更新帖子,使其完全正确。。。