解释awk命令

CBR*_*CBR 17 unix awk

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

$ /usr/xpg4/bin/awk '_&&_--;/PATTERN/{_=2}' input
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

Ed *_*ton 37

有关此处重复的答案,请参阅/sf/answers/1253987381/.


twa*_*erg 13

_在这里被用作变量名称(有效但显然令人困惑).如果您将其重写为:

awk 'x && x--; /PATTERN/ { x=2 }' input
Run Code Online (Sandbox Code Playgroud)

那么解析会更容易一些.每当/PATTERN/匹配时,变量设置为2(并且不输出该行) - 这是下半部分.第一部分在x不为零时触发,并且递减x以及打印当前行(默认操作,因为该子句未指定操作).

最终结果是在模式匹配后立即打印两条线,只要这些线都不匹配模式.


Chr*_*our 8

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

行数在块中指定,如果行匹配{_=2},则变量_设置为2 PATTERN.在匹配行之后读取的每一行都会导致_递减.您可以读取_&&_--好像_大于零然后减去一个,这在匹配后的每一行都会发生,直到_达到零.当你_用一个更明智的名字替换变量时,这很简单n.

一个简单的演示应该清楚(打印任何行匹配后的2行foo):

$ cat file
foo
1
2
3
foo
a
b
c

$ awk 'n && n--;/foo/{n=2}' file
1
2
a
b
Run Code Online (Sandbox Code Playgroud)

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

Awk具有以下结构condition{block},当条件被评估为True时,则对当前记录执行block.如果您不提供块,则awk使用默认块,{print $0}因此,在正则表达式匹配之后,n && n--;没有块的条件仅对行进行求值为True n.分号只是界定条件的条件n&&n--,使条件/foo/明确表示条件没有阻塞.

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

$ awk '/foo/{n=3} n && n--' file
foo
1
2
foo
a
b
Run Code Online (Sandbox Code Playgroud)

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


she*_*ter 2

奇妙的晦涩难懂。时间允许的时候会更新。

_被用作变量名。这&&是一个逻辑运算符,有 2 个真实操作一起运行。一旦 _ 的值减为零,&& 的第二半部分为 false,并且不会生成任何输出。

print -- "
xxxxx
yyyy
PATTERN
zzz
aa
bbb
ccc
ddd" | awk '_&&_--;/PATTERN/{_=2}'
Run Code Online (Sandbox Code Playgroud)

输出

zzz
aa
Run Code Online (Sandbox Code Playgroud)

调试版本

print -- "
xxxxx
yyyy
PATTERN
zzz
aa
bbb
ccc
ddd" | awk '_&&_--;{print "_="_;print _&&_};/PATTERN/{_=2;print "_="_ }'
Run Code Online (Sandbox Code Playgroud)

输出

_=
0
_=
0
_=
0
_=
0
_=2
zzz
_=1
1
aa
_=0
0
_=0
0
_=0
0
_=0
0
Run Code Online (Sandbox Code Playgroud)