我正在寻找一种查看过去两天的多个日志文件并使其一次通过的方法。

最初,我尝试使用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} $0 ~ day {run=1} run == 1 {print FILENAME, $0}' *.log
    

    应该做到。

    说明:

    GNU awk按顺序处理所有文件。 GNU awk变量day初始化为shell表达式"$yesterday" GNU awk在处理新文件之前执行BEGINFILE规则。此规则清除run变量。只要一行($0)与GNU awk变量day("$yesterday")相匹配,就会设置run变量。设置了run变量后,将打印当前文件的名称(FILENAME),然后显示当前行($0)。

    10-05 20:36
    查看更多