如何过滤某个时间范围内的日志

如何过滤某个时间范围内的日志

这是我的日志格式(为了演示而简化)

2018-04-12 14:43:00.000 ERROR hello
2018-04-12 14:44:01.000 ERROR world
2018-04-12 14:44:03.000 INFO this is a multi-line log
NOTICE THIS LINE, this line is also part of the log
2018-04-12 14:46:00.000 INFO foo

那么如何过滤日志[2018-04-12 14:44:00.000, 2018-04-12 14:45:00.000)以产生以下输出呢?

2018-04-12 14:44:01.000 ERROR world
2018-04-12 14:44:03.000 INFO this is a multi-line log
NOTICE THIS LINE, this line is also part of the log

答案1

awk

awk -v 'start=2018-04-12 14:44:00.000' -v end='2018-04-12 14:45:00.000' '
   /^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2} / {
     inrange = $0 >= start && $0 <= end
   }
   inrange' < your-file

它不适用于mawk不支持 POSIX 字符类和间隔正则表达式运算符的情况。

答案2

如果您只想要特定时间之间的特定线路,那么awk就可以了。给出一个简单的教程

首先找出您想要的线路:

cat -n logfile

这将显示文件的内容以及行号。

要打印出您想要的行号:

awk 'NR==2,NR==4' logfile

这会打印出第 2 行和第 4 行之间的范围。

如果您想打印出两行或多行或一系列不连续的行(如果您需要的话),那么您可以使用||或将它们分开;

awk 'NR==5,NR==10;NR==15,NR==20' logfile

继续打印特定时间范围之间的行,将上面的内容与 grep 结合起来egrep

egrep "2018-04-12 14:44:01.000|2018-04-12 14:46:00.000" logfile | awk NR==5,NR==10

egrep允许返回多个字符串。该|符号分隔每个字符串。这将打印具有时间范围的开始和结束时间的行(我将结束时间更改为稍后的时间以包含更多行)及其行号。然后,您可以使用awk打印两行之间(包括两行)的范围。

您可以将所有这些作为示例,并对其进行修改以适应您的日志文件的需要以及您想要根据时间打印的内容。

答案3

目前有类似的问题,但是当一分钟没有日志时,“简单”的 sed/awk 方式失败(例如空闲路由器)

最终生成了一个grep最后 n 分钟的声明如下:

searchterms() {
  backlog_minutes=15;
  for searchstamp in $(seq 0 60 $((60*backlog_minutes)));do
   LANG=en_US.UTF-8 date "+%b %d %H:%M" -d @"$(($(date +%s)-$searchstamp))";done ;
  } ;
greptarget=$(searchterms|sed 's/^/-e "/g;s/$/"/g' )

##Openwrt
which logread |grep -q logread && ( grepcmd=$(echo  grep  "$greptarget"); echo "logread|$(echo $grepcmd)"|sh )
## Linux Debian/Ubuntu
which logread |grep -q logread || (echo grep -e $greptarget /var/log/syslog|sh ;exit 0)

我之前尝试过什么(https://unix.stackexchange.com/a/437445/374376

##_date_syslog_15_min() { LANG=en_US.UTF-8 date "+%b %d %H:%M" -d "15 min ago"   ; } ;
##_date_syslog_now() { LANG=en_US.UTF-8 date "+%b %d %H:%M" ; } ;
## ↑↑ this ones failed when there are no log entries

答案4

你可以这样做sed

sed -n '/2018-04-12 14:44:00.000/,/2018-04-12 14:45:00.000/p' log_file

值得注意的是,这只会匹配第一个实例,它只是使用日期作为分隔符来打印。

类似的事情可以通过以下方式实现awk

awk '/^2018-04-12 14:44:00.000.*/,/2018-04-12 14:45:00.000.*/' log_file

相关内容