要使用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,如果(行〜'/ pattern /'),则x设置为NR + 2,例如(1 + 2 = 3)。在该过程结束之前,不会重置此值。因此,当读取下一行并且!(line〜'/ pattern /')时,x仍为3,(NR(2)<= 3)为true,因此将打印下一行 感谢@Edmorton的无私奉献
答案 0 :(得分:0)
您的脚本有两个块
$ awk '/Linux/ {x=NR+2}
NR<=x {print}' file
第一个块设置变量x
,第二个块用于打印行。请注意,您可以删除{print}
,因为它是默认操作。
答案 1 :(得分:0)
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
}
}
顺便说一句,我知道它经常被滥用,但是由于它的模棱两可,所以不要在软件中使用“模式”一词-使用字符串或正则表达式或条件(或在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/)
$0 == "foo"
或index($0,"foo")
true
。还有可能我忘记列出的其他内容。