0

それぞれ 2 行ずつペアになっているログ エントリがあります。最初の行を解析して数値を抽出し、5000 より大きいかどうかを確認する必要があります。この数値が 5000 より大きい場合は、2 行目を返す必要があり、これも解析して ID を取得します。

すべての情報を grep して解析する方法を知っています。特定の値よりも小さい場合、grepに無視させる方法がわかりません。awk/sed などの他の手段で代用できる場合は、grep を使用することにコミットしていないことに注意してください。

生データ(例をわかりやすくするために 2 行で区切られています)。

私のgrepのターゲットは、「クレジットが抽出された=」に続く数字5001です。これが5000を超える場合、2行目から数字「12345」を返したい---------------- ----------

2012-03-16T23:26:12.082358 0x214d000 DEBUG ClientExtractAttachmentsPlayerMailTask for envelope 22334455 finished: credits extracted = 5001, items extracted count = 0, status = 0. [Mail.heomega.mail.Mail](PlayerMailTasks.cpp:OnExtractAttachmentsResponse:944)    
2012-03-16T23:26:12.082384 0x214d000 DEBUG Mail Cache found cached mailbox for: 12345 [Mail.heomega.mail.Mail](MailCache.cpp:GetCachedMailbox:772)

スニピット--------------------------

-- コンマ ノイズなしで、抽出されたクレジットの数を見つけます。

grep "credits extracted = " fileName.log | awk '{print $12}' | awk -F',' '{print $1}'

-- 抽出されたクレジットの値に関係なく、2 行目の ID を見つけます。

grep -A1 "credits extracted = " fileName.log | grep "cached mailbox for" | awk -F, '{print $1}' | awk '{print $10}'

-- 取得する必要があるロジックを象徴する「if」ステートメント:

v_CredExtr=5001; v_ID=12345; if [ $v_Cred -gt 5000 ]; then echo $v_ID; fi;
4

1 に答える 1

1

私が信じている単一のAWKフィルターですべてを行うことができます:

#!/usr/bin/awk -f

/credits extracted =/ {
    credits = substr($12, 1, length($12) - 1) + 0
    if (credits > 5000)
        show_id = 1
    next
}

show_id == 1 {
    print $10
    show_id = 0
}

明らかに、すべての AWK スクリプトをスクリプト内のシェル文字列に (複数行でも) 詰め込むことができます。わかりやすくするために、ここでは独自のスクリプトで示しました。

PS: 動作したらお知らせください ;-)

于 2012-04-04T22:25:16.063 に答える