2015-03-03 178 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。