2017-04-19 26 views
0

我試圖讓我的日誌文件中的最後X分鐘日誌,然後搜索搜索字符串,如果一個例外出現在這些日誌獲得最後X分鐘登錄,並在文件中

目前,如果我有固定分鐘間隔和固定字符串我能夠在下面的載人

sed -n "/^$(date --date='10 minutes ago' '+%Y-%m-%d %H:%M')/,\$p" filename| grep m1 'ErrorCode="javax.naming.NameNotFoundException"' 

我的日誌,才達到和獲得的結果看起來像

2017-04-19 10:01:35,047 529025829 ERROR [server.YCPSchedulableTrigger] 
(Timer-0:) Exception sending message... 
    2017-04-19 10:01:35,048 529025830 ERROR [server.YCPSchedulableTrigger] 
(Timer-0:) [1492596095048]Error_description_not_available 2017-04-19 10:01:35,049 529025831 ERRORDTL [server.YCPSchedulableTrigger] (Timer-0:) 
[1492596095048]<?xml version="1.0" encoding="UTF-8"?> <Errors> 

     <Error ErrorCode="javax.naming.NameNotFoundException" 

      ErrorDescription="Error_description_not_available" ErrorRelatedMoreInfo=""> 

我的問題是,字符串和所需時n爲傳遞作爲參數的bash腳本,當我運行

sed -n "/^$(date --date='$logTracebackInterval minutes ago' '+%Y-%m-%d %H:%M')/,\$p" $file| grep -m1 "'$searchString'" 

我得到一個錯誤

invalid date `$logTracebackInterval minutes ago' 

哪,我是真的不懂,因爲$logTracebackInterval是單引號,而不是解決

我也試過

sed -n `/^date --date='$logTracebackInterval minutes ago' '+%Y-%m-%d %H:%M'/`,\$p $file| grep -m1 "'$searchString'" 

這不會給我任何錯誤但也沒有給我任何結果

任何幫助,非常感謝

+0

如果它沒有成爲一個內膽,你可以用兩行來避免複雜的引用:'datestart = $(date --date =「$ logTracebackInterval minutes ago」'+%Y-%m-%d%H:%M')'後面跟着sed -n「/^$ {datestart} /,\ $ p」' –

+0

@MarkPlotnik,我知道這是解析變量的問題,但是可以在一行中做到這一點,這將是最好的 –

回答

1

變量替換由單引號抑制。例如:

five=5 
echo $(date -d '$five minutes ago') 
date: invalid date ‘$five minutes ago’ 

你需要這樣說:

echo $(date -d "$five minutes ago") 

具體是這樣的:

sed "/$(date -d "$five minutes ago")/p" file 
+0

我知道這個變量不是在一個單引號內引用的,只是沒有'''在'''內'',因爲我覺得中間部分不會被正確執行,那麼我知道這很容易。非常感謝 –

0

的sed可以用grep(M1)的結果也

sed "/^$(date --date="10 minutes ago" '+%Y-%m-%d %H:%M')/,\$p!d" -e ' /ErrorCode="javax.naming.NameNotFoundException"/!d" -e 'q' "${file} 

但是如果t這裏是你的確切日期沒有行

AWK在這種情況下一個更好的工具

awk -v T="$(date --date="10 minutes ago" '+%Y-%m-%d %H:%M')" ' 
    # catch date and hour (could be better but enough for the need) 
    BEGIN { split(T, aT);d=aT[1];h=aT[2]} 

    # hoppefully, date format is string comparable order in your log 
    # ignore earlier line 
    $1$2 < d t { next } 

    # exit after first occurance print 
    /ErrorCode="javax.naming.NameNotFoundException"/ { print; exit } 
    ' "${file}" 

的單行版本

awk -v T="$(date --date="10 minutes ago" '+%Y-%m-%d %H:%M')" 'BEGIN{split(T,aT);d=aT[1];h=aT[2]};$1$2<d t{next};/ErrorCode="javax.naming.NameNotFoundException"/{print;exit}' "${file}" 
+0

我正在使用的sed命令給了我過去10分鐘間隔的日誌,而不是確切的一分鐘。無論如何,我只是想要一種方法來解決變量,因爲除了該命令工作正常,我搜索的文件已被修改爲僅10分鐘的時間間隔。 –

相關問題