1

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

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

通常我需要的行是日志中的 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
4

3 回答 3

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。

于 2013-08-19T23:58:31.787 回答
0

sed 是用于在单行上进行简单替换的出色工具,但对于其他任何事情,只需使用 awk:

awk -v ts="$timestamp" '$0 ~ ts{print; f=1; next} f{exit}' file
于 2013-08-20T11:12:35.650 回答
0

我自己的幼稚方法

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

sed -n "b main; :branch {s/^$timestamp/$timestamp/p; n; t 分支; q}; b 结束; :main /^$timestamp/b 分支 :end"

于 2013-08-20T16:56:05.420 回答