我有一个文件file.txt,如下所示:
start cal
end cal
start eff
end eff
start cal
error
end cal
start dod
end dod
我想得到的是最后一组'start cal'和'end cal'之间的界限。我正在使用tac和grep来做到这一点。但徒劳无功。有什么帮助吗? 以下是我的代码:
tac file.txt | grep -m1 'start cal*end cal'
我做错了什么?对于上面的例子,我需要命令返回'error'。
答案 0 :(得分:1)
Grep不是完成此任务的好工具。它基于行的匹配。你可以考虑使用awk。
如果您之间有单行:
tac file|awk '/end cal/{p=1;next}/start cal/{exit}p'
如果它可能是多行:
tac file|awk '/end cal/{p=1;next}/start cal/{exit}p'|tac
输出:
error
答案 1 :(得分:1)
我不知道grep是否可以做到这一点,但在这里它是傻瓜。我是第一个承认,它不是很漂亮。
tac file.txt | gawk '/start cal/ { exit } { if (echo) print } /end cal/ { echo = 1 }'
n.b。肯特的答案更好了。
答案 2 :(得分:0)
你做错了两件事:
start cal*end cal
匹配start ca
,后跟0个或更多l
个,后跟end cal