我有格式化日志
##<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指定的替换对此命令无效。
答案 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。