要使用awk打印遵循图案的多(2)行:
我在某个地方找到了以下解决方案
$ awk '/Linux/{x=NR+2}(NR<=x){print}' file
Linux
Solaris
Aix
我在试着理解语法
通常,awk语法是
awk 'pattern{action}' file
在这里我们可以找到
pattern = /Linux/
action = {x=NR+2}
那么什么是(NR<=x){print}
呢?
解决方案:
我对此类c语法的理解是:
While read (file,line)
{
if (line ~ '/pattern/') then
{
x= NR+2
}
if (NR <= x)
{
print
{
}
对于NR=1和if (行~‘/模式/’),则将x设置为NR+2,例如(1+2 =3)。该值在该过程结束之前不会被重置。因此,当读取下一行并且!(行~ '/pattern/')则x仍然为3时,(NR (2) <= 3)为真,因此它打印下一行,这要归功于@Edmorton
发布于 2019-04-16 21:59:20
FWIW我不会写你所问的代码,相反,我会写:
awk '/Linux/{c=3} c&&c--' file
参见https://stackoverflow.com/a/17914105/1745001上的示例"g“。
话虽如此,使用类似C的语法编写的原始代码应该是:
NR=0
x=0
While read (file,line)
{
NR++
if (line ~ "Linux") {
x = NR+2
}
if (NR <= x) {
print
}
}
顺便说一句,我知道它经常被误用,但不要在你的软件中使用“模式”这个词,因为它是高度模糊的-使用字符串、regexp或条件(或者在shell中使用,但不使用awk、sed、grep等,并且只在适当的地方使用"globbing pattern"),无论你真正想要的是哪一个。
例如,您编写的awk语法是:
awk 'pattern{action}' file
不是的。或者,取决于你认为“模式”是什么意思!尽管许多书籍、教程等都在说,为了消除任何歧义,您应该简单地将awk语法视为:
awk 'condition{action}' file
其中,condition
可以是以下任意一种:
对关键字进行正则表达式(如BEGIN
)或END
var < 7
或NF
),或1
$0 ~ "foo"
、$0 ~ /foo/
、/foo/
或$0 ~ var
)或match($0,/foo/)
index($0,"foo")
可能还有其他我忘了列出来的东西。
发布于 2019-04-16 03:56:40
您的脚本有两个块
$ awk '/Linux/ {x=NR+2}
NR<=x {print}' file
第一个代码块设置变量x
,第二个代码块用于打印行。请注意,您可以删除{print}
,因为它是默认操作。
https://stackoverflow.com/questions/55695841
复制相似问题