我正在寻找一种查看过去两天的多个日志文件并使其一次通过的方法。
最初,我尝试使用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} $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
)。