2017-04-19 6 views
0

ファイルに文字列を検索入手分間隔と私は、次の有人最後のX分は、ログインして、私は私のログファイルに最後のX分のログを取得し、検索しようとして

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

マイログに結果をachiveして取得することができる午前固定文字列は

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=""> 

私の問題のように見えるでその文字列とduratio Nはbashスクリプトにパラメータとして渡されると、私は

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

を実行したときに、私は、私は本当に$logTracebackIntervalは、単一引用符で囲まれているので、理解し、解決していないエラー

invalid date `$logTracebackInterval minutes ago' 

を取得

私も試しました

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

これは私に何かエラーを与えませんだけでなく、どんな結果に私に

を与えるものではありませんすべてのヘルプは本当に

+0

ではありませんが、 'datestart = $(date --date =" $ logTracebackInterval minutes "'+%Y-%m-%d%H%M')'とそれに続く '' sed ''という2つの行で複雑な引用を避けることができます。 –

+0

@MarkPlotnik、私はそれが変数を解決することに問題があると理解していますが、それは一番良いと思われる1行で行うことが可能です –

答えて

1

変数置換は、単一引用符によって抑制されて認識されます。例:具体的には、のようなもの

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

:sedを

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

私は変数が一重引用符で囲まれていないことを知っていましたが、中央の部分が正しく実行されないと感じたので、 '' '' '' ''を試しませんでした。ありがとうございました –

0

は(M1)あなたの結果も

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

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

あなたのような何かを言う必要があります

しかし、これは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分間隔でのみ変更されていたので、変数を解決する方法が必要でした。 –

関連する問題