0

我有每条成对两行的日志条目。我必须解析第一行以提取一个数字以知道它是否大于 5000。如果这个数字大于 5000,那么我需要返回第二行,这也将被解析以检索一个 ID。

我知道如何 grep 所有信息并解析它。如果它们小于特定值,我不知道如何让 grep 忽略它们。请注意,如果可以替代 awk/sed 等其他方式,我不承诺使用 grep。

原始数据(两行分开,例如清晰)。

我的 grep 的目标是“提取的积分 =”之后的数字 5001,如果超过 5000,那么我想从第二行返回数字“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}'

-- 无论提取的 credits 的值是多少,查找第二行的 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 脚本填充到脚本内的 shell 字符串中,甚至是多行。为了清楚起见,我在它自己的脚本中展示了它。

PS:请在工作时通知;-)

于 2012-04-04T22:25:16.063 回答