2015-03-03 199 views
-1

我的日志格式提取数据

##<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

请编辑您的问题,以显示您已经尝试过的内容以及相应期望输出的一些示例输入。 – 2015-03-03 09:15:49

回答

0

如果使用awk,您可以使用date获取数据,例如最后5分钟这样的:

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

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

+0

http://stackoverflow.com/a/28815704/2088135可能的重复的答案:) – 2015-03-03 09:21:43

+0

它给我的整个日志文件 – Angel1403 2015-03-03 09:25:01

+0

@ Angel1403我只是改变'日期'格式一些。它需要100%正确,否则你就会全部获得。运行这个'date +“## <%d-%b-%Y%H:%M:%S”'看看它是否匹配行的开始。 – Jotne 2015-03-03 09:26:06

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(与TZ=GMT awk的调用之前)将mktime解释时间戳为GMT。