如何使用awk对最后一组行进行grep?

如何使用awk对最后一组行进行grep?,awk,grep,tac,Awk,Grep,Tac,我的file.txt文件中有以下内容 Start 1 2 3 5 end Start a b c d end 如何仅使用awk获得从“开始”到“结束”的结尾部分,如下所示 Start a b c d end 努力: awk '/Start/ {{ f = 1;n++ }} f && n == 2; /end/ {{ f = 0 }}' file.txt 您可以使用此awk: awk '$1 == "Start" { s = ""; p

我的file.txt文件中有以下内容

Start
1
2
3
5
end
Start
a
b
c
d
end
如何仅使用awk获得从“开始”到“结束”的结尾部分,如下所示

Start
a
b
c
d
end
努力:

awk '/Start/ {{ f = 1;n++ }} f && n == 2; /end/ {{ f = 0 }}' file.txt

您可以使用此
awk

awk '$1 == "Start" { s = ""; p = 1 }
p { s = s $0 ORS }
$1 == "end" { p = 0 }
END { printf "%s", s }' file

使用
tac
+
awk
解决方案,请尝试以下内容

tac Input_file | awk '/^end/{found=1} found; /^Start/{exit}' | tac
说明:
tac
将以相反的顺序(从下到上的方式)打印输入文件,然后将其输出传递给
awk
命令,并在
awk
中从
结束
的第一次出现到
开始
的第一次出现进行代码打印。当发现第一次出现
start
时,退出
awk
code,该输出再次被发送到
tac
,后者将反转输出并以原始输入文件的形式发布


第二种解决方案:使用GNU
awk
可以像这样尝试,但它假设开始和结束关键字的外观没有差异(意味着每次开始后OP的输入文件中都有结束关键字,否则会给出假阳性结果)

awk -v RS= '{sub(/.*Start/,"Start")} 1' Input_file

如果您已经知道如何获得第一个匹配,这里有一个获取最后一个匹配的提示:使用
tac
以行方式反转输入文件,调整代码以获得第一个匹配,然后使用
tac
againi尝试了以下命令awk'/Start/{f=1;n++}}f&&n==2/end/{{f=0}}}file.txt但我不想给出任何数字“2”,因为我可能不知道发生了多少次。@Sandeep,感谢您发布您的努力,请在您的问题中添加他们,因为评论不是为了显示努力,请继续,干杯。如果在输入的最后一行
结束
之后有一行
开始
呢?从文件的最后一个
开始
到结尾,还是打印第二个
开始
和最后一个
结束
之间的文本块?
awk -v RS= '{sub(/.*Start/,"Start")} 1' Input_file