查看来自 yesterday/today 的日志

View logs from yesterday/today

我正在寻找一种将过去两天的多个日志文件合并为一个通道的方法。

起初,我尝试使用 GREP:

#!/bin/bash

yesterday=$(date --date="yesterday" +"%Y-%m-%d")
today=$(date +"%Y-%m-%d")
grep "$yesterday\|$today" *.log | less

这很好,但它不会输出匹配之间的行(其中没有日期的行,例如错误堆栈跟踪 - 这是我真正感兴趣的)...

所以我发现了这个:

#!/bin/bash

yesterday=$(date --date="yesterday" +"%Y-%m-%d")
sed -ne '/$yesterday/,$p' *.log | less

对于每个文件,它输出从第一个匹配项到文件末尾的所有内容。那太完美了……除了一件事……阅读它时,我不知道我在看哪个文件的内容。我想在每一行的开头看到文件名,就像使用 grep 一样。

谢谢 ;-)

不是 sed 解决方案,但正如您所要求的 更好/更好的方法...如果您在某个地方有 GNU awk,

awk -v day="$yesterday" 'BEGINFILE {run=0} [=10=] ~ day {run=1} run == 1 {print FILENAME, [=10=]}' *.log

应该能做到。

解释:

GNU awk 按顺序处理所有文件。 GNU awk 变量 day 被初始化为 shell 表达式 "$yesterday" GNU awk 在处理新文件之前执行 BEGINFILE 规则。此规则清除 run 变量。每当一行 ([=16=]) 与 GNU awk 变量 day ("$yesterday") 匹配时,就会设置 run 变量。当设置 run 变量时,打印当前文件的名称 (FILENAME),然后是当前行 ([=16=]).