首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释awk命令

解释awk命令
EN

Stack Overflow用户
提问于 2013-08-24 00:43:40
回答 5查看 3.8K关注 0票数 17

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

代码语言:javascript
复制
$ /usr/xpg4/bin/awk '_&&_--;/PATTERN/{_=2}' input

有人能解释一下吗?

EN

回答 5

Stack Overflow用户

发布于 2013-08-24 02:25:55

有关此处复制的答案,请参阅https://stackoverflow.com/a/17914105/1745001

票数 38
EN

Stack Overflow用户

发布于 2013-08-24 00:56:46

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

代码语言:javascript
复制
awk 'x && x--; /PATTERN/ { x=2 }' input

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

最终结果是在任何模式匹配后立即打印这两行,只要这两行都不与该模式匹配。

票数 15
EN

Stack Overflow用户

发布于 2013-08-24 00:56:41

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

行数在块{_=2}中指定,如果行与PATTERN匹配,则变量_设置为2。在匹配行之后读取的每一行都会导致_递减。你可以把_&&_--看作是_大于0然后是负1,在匹配之后的每一行都会发生这种情况,直到_为零。将变量_替换为更合理的名称(如n )非常简单。

一个简单的演示就能清楚地说明这一点(打印与foo匹配的任何行后面的2行):

代码语言:javascript
复制
$ cat file
foo
1
2
3
foo
a
b
c

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

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

Awk具有以下结构condition{block},当一个条件被求值为True时,将为当前记录执行块。如果不提供块,awk将使用缺省块{print $0},因此n && n--;是一个没有块的条件,只有在正则表达式匹配后,n行的计算结果才为True。分号只是分隔条件/foo/的条件n&&n--,从而明确表示该条件没有块。

要打印匹配后面的两行,包括匹配,您可以这样做:

代码语言:javascript
复制
$ awk '/foo/{n=3} n && n--' file
foo
1
2
foo
a
b

Extra extra:使用/usr/xpg4/bin/awk的完整路径这一事实告诉我,这段代码是为Solaris机设计的,因为/usr/bin/awk完全损坏了,应该不惜一切代价避免使用。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18407890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档