从日志中提取数据

时间:2015-03-03 09:09:30

标签: shell unix awk scripting sh

我有格式化日志

##<01-Mar-2015 03:48:18 o'clock GMT> <info> 
##<01-Mar-2015 03:48:20 o'clock GMT> <info>
##<01-Mar-2015 03:48:30 o'clock GMT> <info>
##<01-Mar-2015 03:48:39 o'clock GMT> <info>

我必须编写shell脚本来从日志文件中的最后记录数据中提取最后5分钟的数据,然后在其中搜索字符串。我是shell脚本的新手,我使用了grep命令,但它没用。有人能帮我一下吗。 我尝试了以下脚本

#!/bin/bash

H=1  ## Hours
LOGFILE=/path/to/logfile.txt

X=$(( H * 60 * 60 )) ## Hours converted to seconds

function get_ts {
DATE="${1%%\]*}"; DATE="${DATE##*\[}"; DATE=${DATE/:/ };                 DATE=${DATE//\// }
TS=$(date -d "$DATE" '+%s')
}

get_ts "$(tail -n 1 "$LOGFILE")"
LAST=$TS

while read -r LINE; do
get_ts "$LINE"
(( (LAST - TS) <= X )) && echo "$LINE"
done < "$LOGFILE"

并在运行时获得以下错误 get_ts:DATE = $ {DATE /:/}:0403-011指定的替换对此命令无效。

2 个答案:

答案 0 :(得分:0)

如果您使用awk,则可以使用date获取数据,例如最后5分钟,如下所示:

awk '$0>=from' from="$(date +"##<%d-%b-%Y %H:%M:%S" -d -5min)" logile

PS,您需要date命令来匹配您的格式。

答案 1 :(得分:0)

我将日期解析为自纪元以来的秒数,并将其与系统时间进行比较:

TZ=GMT awk -F '[#<> :-]+' 'BEGIN { split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", mnames, ","); for(i = 1; i <= 12; ++i) m[mnames[i]] = i } mktime($4 " " m[$3] " " $2 " " $5 " " $6 " " $7) + 300 >= systime()' filename

-F '[#<> :-]+'是将日期拆分为单独的部分,因此$2是一天,$3一个月,$4一年,等等。然后代码的工作原理如下:

BEGIN {
  # build a mapping from month name to number (to use in mktime)
  split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", mnames, ",")
  for(i = 1; i <= 12; ++i) m[mnames[i]] = i
}

# build a numerically comparable timestamp from the split date, and
# select all lines whose timestamp is not more than 300 seconds behind
# the system time.
mktime($4 " " m[$3] " " $2 " " $5 " " $6 " " $7) + 300 >= systime()

TZ环境变量设置为GMT(在awk调用之前使用TZ=GMT)将使mktime将时间戳解释为GMT。