Bash脚本:在两个字之间的linex计数之前获取值

Bash脚本:在两个字之间的linex计数之前获取值,bash,sed,Bash,Sed,问题如下 文件: 在上面的文件中,我想计算command和done之间的行数,并给出一个名称列表,其中该计数大于1 此处的输出应为: Name1 Name2 我尝试过: sed-n/command/,/done/p | count 有什么想法吗?这可以是一种方式: $ awk '/done/ {if (t>1) print name} {t++} /^Name/ {name=$0} /command/ {t=0}' a Name1 Name2 解释 /done/{if t>1 prin

问题如下

文件:

在上面的文件中,我想计算command和done之间的行数,并给出一个名称列表,其中该计数大于1

此处的输出应为:

Name1
Name2
我尝试过:

sed-n/command/,/done/p | count

有什么想法吗?

这可以是一种方式:

$ awk '/done/ {if (t>1) print name} {t++} /^Name/ {name=$0} /command/ {t=0}' a
Name1
Name2
解释 /done/{if t>1 print name}如果行包含done,则仅当计数器大于1时才打印块的标题。 {t++}在任何情况下递增计数器。 /^Name/{Name=$0}存储行值。 /command/{t=0}如果该行包含command,请重置计数器。 这可以是一种方式:

$ awk '/done/ {if (t>1) print name} {t++} /^Name/ {name=$0} /command/ {t=0}' a
Name1
Name2
解释 /done/{if t>1 print name}如果行包含done,则仅当计数器大于1时才打印块的标题。 {t++}在任何情况下递增计数器。 /^Name/{Name=$0}存储行值。 /command/{t=0}如果该行包含command,请重置计数器。 如果名称不是固定字符串,则可以使用:

awk '/command/{cmd=1; n=0;next} !cmd{p=$1;next} cmd{n++} /done/{if (n>2) print p; cmd=0; next}' dat
Name1
Name2
如果名称不是固定字符串,则可以使用:

awk '/command/{cmd=1; n=0;next} !cmd{p=$1;next} cmd{n++} /done/{if (n>2) print p; cmd=0; next}' dat
Name1
Name2
这个awk怎么样:

awk '/^[A-Z]/{name=$0;count=-1;next}/done/&&count>1{print name;next}{count++}' file
输出:

Name1
Name2
也就是说,如果行以左对齐的大写字母开头,则将其保存为命令名,并将计数器设置为-1。。。因此,当命令出现时,下一行之后的值将为零。然后移动到下一行,不再费事。如果该行与字符串done匹配,并且计数器大于1,则打印我们先前保存的名称,然后移到下一行。所有其他行的增量计数器。

这个awk如何:

awk '/^[A-Z]/{name=$0;count=-1;next}/done/&&count>1{print name;next}{count++}' file
输出:

Name1
Name2

也就是说,如果行以左对齐的大写字母开头,则将其保存为命令名,并将计数器设置为-1。。。因此,当命令出现时,下一行之后的值将为零。然后移动到下一行,不再费事。如果该行与字符串done匹配,并且计数器大于1,则打印我们先前保存的名称,然后移到下一行。所有其他行的增量计数器。

是,这是给定的模式。如果命令不是文字字符串,则在名称操作块中执行该逻辑://^[^[:space:]/{Name=$0;t=0;getlineYes,这是给定的模式。如果命令不是文字字符串,则在名称操作块中执行该逻辑://^[^[:space:]/{Name=$0;t=0;getline