查看来自 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 命令中为每一行添加文件名前缀?
- 是否有更好/更好的方法来做到这一点?
谢谢 ;-)
不是 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=]
).
我正在寻找一种将过去两天的多个日志文件合并为一个通道的方法。
起初,我尝试使用 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 命令中为每一行添加文件名前缀?
- 是否有更好/更好的方法来做到这一点?
谢谢 ;-)
不是 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=]
).