这是我的日志格式(为了演示而简化)
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