2017-04-20 39 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