Linux 使用awk-pattern+;算术条件

Linux 使用awk-pattern+;算术条件,linux,shell,awk,Linux,Shell,Awk,我正在尝试使用awk命令执行多个搜索,以从日志文件中获取符合以下2个条件的记录: 模式执行时间 最后一列,即执行时间>5000毫秒 我尝试并使用了下面的命令,但它并没有给我正确的输出,不确定是否可以使用相同的方式 我只是在学习awk,所以任何帮助都将不胜感激 awk -F ':' '/EXEC_TIME/&&$15>="5000"{print $2,$15}' TransactionInfoLogs.log MP170420.0548.T00003[SERV] 9065

我正在尝试使用awk命令执行多个搜索,以从日志文件中获取符合以下2个条件的记录:

  • 模式执行时间
  • 最后一列,即执行时间>5000毫秒
  • 我尝试并使用了下面的命令,但它并没有给我正确的输出,不确定是否可以使用相同的方式

    我只是在学习awk,所以任何帮助都将不胜感激

    awk -F ':' '/EXEC_TIME/&&$15>="5000"{print $2,$15}' TransactionInfoLogs.log
    
    MP170420.0548.T00003[SERV] 9065 ms
    OC170420.0655.T00001[SERV] 708 ms
    
    下面是示例日志文件:

    [TXN_ID]:MP170420.0548.T00003[SERV][SERV]:BLKSRVREQ[MSISDN]:8028359017[SV_CHRG_ID]:37152[RESP_CODE]:200[START]:Thu Apr 20 12:44:23 WAT 2017 [END]:Thu Apr 20 12:44:23 WAT 2017[EXEC_TIME]:9065 ms
    [TXNID]:XX170420.1244.C01465[TYPE]:SERVICE_CHARGE_PAYER_PAYEE[AMT]:0[PR_MSISDN]:8028359017[PR_MFS]:101[PR_W_TYPE]:12[PR_PREBAL]:0[PR_BAL]:0[PY_MSISDN]:IND03[PY_MFS]:101[PY_W_TYPE]:null[PY_PRE
    BAL]:2782239[PY_BAL]:2782239
    [2017-04-20 12:44:29,552][http-bio-172.24.87.5-7890-exec-7365]- 
    [TXN_ID]:XX170420.1244.C01467[SERV]:null[MSISDN]:8080967233[RESP_CODE]:00066[START]:Thu Apr 20 12:44:29 WAT 2017 [END]:Thu Apr 20 12:44:29 WAT 2017[EXEC_TIME]:9 ms
    [2017-04-20 12:44:36,634][http-bio-172.24.87.5-7890-exec-7364]- 
    [TXN_ID]:OC170420.0655.T00001[SERV]:null[MSISDN]:7016532415[RESP_CODE]:00066[START]:Thu Apr 20 12:44:36 WAT 2017 [END]:Thu Apr 20 12:44:36 WAT 2017[EXEC_TIME]:708 ms
    [2017-04-20 12:44:45,820][http-bio-172.24.87.5-7890-exec-7359]- 
    [TXN_ID]:XX170420.1244.C01471[SERV]:null[MSISDN]:8026136275[RESP_CODE]:00066[START]:Thu Apr 20 12:44:45 WAT 2017 [END]:Thu Apr 20 12:44:45 WAT 2017[EXEC_TIME]:39 ms
    [2017-04-20 12:44:46,010][http-bio-172.24.87.5-7890-exec-7366]- 
    [TXN_ID]:XX170420.1244.C01473[SERV]:BLKSRVREQ[MSISDN]:8127459541[SV_CHRG_ID]:37152[RESP_CODE]:200[START]:Thu Apr 20 12:44:45 WAT 2017 [END]:Thu Apr 20 12:44:46 WAT 2017[EXEC_TIME]:221 ms
    [TXNID]:XX170420.1244.C01473[TYPE]:SERVICE_CHARGE_PAYER_PAYEE[AMT]:0[PR_MSISDN]:8127459541[PR_MFS]:101[PR_W_TYPE]:12[PR_PREBAL]:0[PR_BAL]:0[PY_MSISDN]:IND03[PY_MFS]:101[PY_W_TYPE]:null[PY_PRE
    BAL]:2853870[PY_BAL]:2853870
    [2017-04-20 12:44:49,989][http-bio-172.24.87.5-7890-exec-7371]- 
    [TXN_ID]:XX170420.1244.C01475[SERV]:BLKSRVREQ[MSISDN]:8089138902[SV_CHRG_ID]:37152[RESP_CODE]:200[START]:Thu Apr 20 12:44:49 WAT 2017 [END]:Thu Apr 20 12:44:49 WAT 2017[EXEC_TIME]:57 ms
    [TXNID]:XX170420.1244.C01475[TYPE]:SERVICE_CHARGE_PAYER_PAYEE[AMT]:0[PR_MSISDN]:8089138902[PR_MFS]:101[PR_W_TYPE]:12[PR_PREBAL]:0[PR_BAL]:0[PY_MSISDN]:IND03[PY_MFS]:101[PY_W_TYPE]:null[PY_PRE
    BAL]:3071459[PY_BAL]:3071459
    

    每当您在输入文件中有名称->值映射时,最好首先创建该映射的数组(
    n2v[]
    如下),然后您只需根据每个字段的名称而不是位置引用它,例如:

    $ cat tst.awk
    {
        delete n2v
        while ( match($0,/\[[^]]+]:/) ) {
            if ( name != "" ) {
                value = substr($0,1,RSTART-1)
                sub(/\[.*/,"",value)
                n2v[name] = value
            }
            name = substr($0,RSTART+1,RLENGTH-3)
            $0 = substr($0,RSTART+RLENGTH)
        }
        value = $0
        n2v[name] = value
    
        for (name in n2v) {
            value = n2v[name]
            print name, "->", value
        }
    }
    
    $ head -1 file | awk -f tst.awk
    EXEC_TIME -> 9065 ms
    START -> Thu Apr 20 12:44:23 WAT 2017
    RESP_CODE -> 200
    SV_CHRG_ID -> 37152
    TXN_ID -> MP170420.0548.T00003
    END -> Thu Apr 20 12:44:23 WAT 2017
    MSISDN -> 8028359017
    SERV -> BLKSRVREQ
    
    然后,您可以调整上述内容以执行任何您想要的操作:

    $ cat tst.awk
    {
        delete n2v
        while ( match($0,/\[[^]]+]:/) ) {
            if ( name != "" ) {
                value = substr($0,1,RSTART-1)
                sub(/\[.*/,"",value)
                n2v[name] = value
            }
            name = substr($0,RSTART+1,RLENGTH-3)
            $0 = substr($0,RSTART+RLENGTH)
        }
        value = $0
        n2v[name] = value
    }
    
    n2v["EXEC_TIME"]+0 > 5000 { print n2v["TXN_ID"], n2v["EXEC_TIME"] }
    
    $ awk -f tst.awk file
    MP170420.0548.T00003 9065 ms
    

    您可以使用
    print$2,$NF
    打印所需的内容,而不是计算字段数
    NF
    =字段数,因此,使用前导的
    $
    字符,使用
    $NF
    将打印行中最后一个字段的值。您还可以对
    NF
    返回的数字进行“计算”,例如,打印从第三个字段到最后一个字段,即
    $(NF-3)
    。祝你好运。不要只是说
    没有给我正确的输出
    ,就这么说吧。向我们展示正确的/预期的输出,并解释您获得的输出是如何不正确的。您可能对Perl感兴趣:
    Perl-F':'-ne'/(?5000&&print“$F[1]和$&”“file
    @sheller:谢谢,这是一个有用的提示。@埃德蒙顿:注意,请原谅,这是我的第一篇帖子。非常感谢你的回答。它的效果很好
    [2335145@txn01txn_日志]$awk-f/tmp/tst.awk TransactionFologs.log MP170424.0007.A45538 9749 ms XX170424.0050.A39964 9871 ms