打印一组与正则表达式匹配的第一个连续行,然后退出

时间:2013-08-19 23:32:46

标签: regex logging sed grep

我想在按当前时间过滤的日志文件中打印这些行。

我现在的设置读取整个文件并仅打印匹配的行。 如何在打印多行时停止读取整个文件。

通常我需要的行是日志深3行,多行长。

目前我使用:

timestamp=`date +"%Y-%m-%d %H:%M:%S"`
tac mylogfile | gsed -n "/^$timestamp/p" | tac
在这个简单的演示

中,tac有点多余

示例数据:

2013-08-19 19:23:42
2013-08-19 19:23:42
2013-08-19 19:23:42
2013-08-19 19:23:42
2013-08-19 19:23:43
2013-08-19 19:23:43
2013-08-19 19:23:43
2013-08-19 19:23:44
2013-08-19 19:23:44
2013-08-19 19:23:44
2013-08-19 19:23:44
2013-08-19 19:23:45
2013-08-19 19:23:45
2013-08-19 19:23:45
2013-08-19 19:23:46
2013-08-19 19:23:46
2013-08-19 19:23:46
2013-08-19 19:23:46
2013-08-19 19:23:46
2013-08-19 19:23:46
2013-08-19 19:23:46
2013-08-19 19:23:46

3 个答案:

答案 0 :(得分:0)

使用退出命令

您可以使用(q)uit命令告诉sed何时停止处理并退出。它仍然需要从每个文件的开头处理,但是只要遇到停止模式就可以退出。例如:

timestamp_start='2013-08-19 19:23:45'
timestamp_stop='2013-08-19 19:23:46'

sed -n "/$timestamp_start/p; /$timestamp_stop/q" /tmp/example.log

如果你的sed不处理地址的正则表达式,这对你不起作用。除了GNU sed 4.2.2之外,我还没有用它来测试它,它的工作原理如上所述。 YMMV。

答案 1 :(得分:0)

sed是一个很好的工具,可以在一行上进行简单的替换,但除此之外,只需使用awk:

awk -v ts="$timestamp" '$0 ~ ts{print; f=1; next} f{exit}' file

答案 2 :(得分:0)

我自己的天真方法

使用来自///的标签和条件分支; t'决定循环或退出。

sed -n“b main;:branch {s / ^ $ timestamp / $ timestamp / p; n; t branch; q}; b end ;:main / ^ $ timestamp / b branch:end”