使用linux命令在文件中的两行之间查找字符串

时间:2016-06-17 12:03:06

标签: linux grep

我有一个文件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'。

3 个答案:

答案 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)

你做错了两件事:

  1. grep分别检查每一行,因此一个模式永远不会在两行或多行中匹配
  2. 正则表达式start cal*end cal匹配start ca,后跟0个或更多l个,后跟end cal