Grep - 匹配后返回不同行大小的内容

Grep - 匹配后返回不同行大小的内容

我需要找到一种方法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 行以正常工作。

相关内容