我需要找到一种方法grep
在比赛后返回不同行大小的内容。有些比赛后面有 4 行,其他有 20 行。我都需要它们。
每小时我都希望返回前一小时的日志条目,其中的时间戳如下:
time: 20200115132443
为此,我想象每个 cronjob 都会将前一小时的时间戳作为 grep 语句运行:
grep "time: 2020011507"
我遇到的问题是比赛后某些条目的日志大小不同,因此类似的事情grep -C 5
并不总是有效。
我想知道是否应该返回匹配的所有内容直到下一个匹配的 grep 语句(这会错过最后一个条目),或者是否有其他方法来运行它。示例日志文件片段如下所示:
time: 20200115132443
logging stuffs
time: 20200115134543
more logging
stuffs
like this
time: 20200115140201 # this should now not be returned
也许我太复杂了,可以只运行grep
当前小时的语句,然后获取该小时之前和前一小时之后的所有内容。
答案1
可能的方法:
# variable S0 - date string for hour ago
S0="time: $(date -d '1 hour ago' +%Y%m%d%H)"
# Variable S1 - date string for current hour
S1="time: $(date +%Y%m%d%H)"
# taking lines from between two just defined strings
# including first and excluding second date string
# from file /var/log/log.log
sed -n "/^${S0}/,/^${S1}/ {/^${S1}/"'!p};' /var/log/log.log
现在尝试将其打造成紧凑的单衬:
sed -n "/^time: $(date -d '1 hour ago' +%Y%m%d%H)/,/^time: $(date +%Y%m%d%H)/ {/^time: $(date +%Y%m%d%H)/"'!p}' /var/log/log.log
您可以将输出重定向到临时文件并使用它。
或者您可以简单地在一个内衬的末尾添加一个管道和 grep:
|grep "mystring"
。
聚苯乙烯取决于操作系统的命令日期格式可能有所不同。
我们这里使用的Linux:日期 -d '1 小时前' +%Y%m%d%H
我们可以使用Linux:日期 -d @$(($(日期 +%s)-3600)) +%Y%m%d%H
macOS X:日期 -r $(($(日期 +%s)-3600)) +%Y%m%d%H
ETC。
更新:发现用于删除最后找到的行的 sed 部分“$d”不起作用,因此更新了 sed 行以正常工作。