2017-04-20 52 views
1

我想使用awk命令来执行多个搜索到从那里它匹配以下两个条件,一个日志文件读取记录:多使用搜索AWK - 模式+算术条件

  1. 模式 - EXEC_TIME
  2. 最后列即EXEC_TIME> 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 
+0

,而不是指望字段的数量,你可以使用'打印$ 2,$ NF'打印你所需要的。 'NF' = Number_of_Fields,所以,使用前导'$'字符,使用'$ NF'将打印行上最后一个字段的值。你也可以对由'NF'返回的数字进行“数学运算”,例如,打印第三个到最后一个字段,即'$(NF-3)'。祝你好运。 – shellter

+2

不要只是说'不要给我正确的输出'并且保留它。 **向我们展示正确的/期望的输出,并解释你得到的输出是“不正确”的。 –

+0

您可能会对使用** Perl **:'perl -F':'-ne'/(?<= \ [EXEC_TIME \]:)\ d +/&& $&> 5000 && print“$ F [1]和$&“'文件' –

回答

1

只要你有输入文件名称 - >值映射关系,这是一个好主意,首先创建一个映射数组(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 
+1

非常感谢您的回答。它的工作原理就像魅力 '[2335145 @ txn01 txn_logs] $ awk的-f /tmp/tst.awk TransactionInfoLogs.log MP170424.0007.A45538 9749毫秒 XX170424.0050.A39964 9871 ms' – theavi