我想在按当前时间过滤的日志文件中打印这些行。
我现在的设置读取整个文件并仅打印匹配的行。 如何在打印多行时停止读取整个文件。
通常我需要的行是日志深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
答案 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”