要使用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
复制相似问题