2016-05-02 37 views
2

你好,我有一個包含數百行的文本文件。這是一個示例。awk在shell中打印數組的一部分

Array 1 - JVMAZURE,/www/deploy/DEV/JVMAZURE/ReceiveResponseFromAzureDEV,com.azure.ReceiveResponseFromAzure 

JVM - JVMAZURE 
Node - com.azure.ReceiveResponseFromAzure 
Jar - /www/deploy/DEV/JVMAZURE/ReceiveResponseFromAzureDEV 
AXIOM.SVAP.IN 
LOG.XML.INPUT 
SERVADMIN.ERROR 
SERVADMIN.INPUT 
TIMEOUT.IN 
--------------------------------------------------------------------------------------------- 

Array 2 - JVMAZURE,/www/deploy/DEV/JVMAZURE/ReceiveResponse,com.azure.RecivedResponse 

JVM - JVMAZURE 
Node - com.azure.RecivedResponse 
Jar - /www/deploy/DEV/JVMAZURE/ReceiveResponseDEV 
AXIOM.SVAP.IN 
EXCEPTION.QUEUE 
SERVADMIN.ERROR 
SERVADMIN.INPUT 
--------------------------------------------------------------------------------------------- 

Array 3 - JVMAZURE1,/www/deploy/DEV/JVMAZURE1/SendMessageToAzureCloudDEV,com.azure.SendMessageToAzureCloud 

JVM - JVMAZURE1 
Node - com.azure.SendMessageToAzureCloud 
Jar - /www/deploy/DEV/JVMAZURE1/SendMessageToAzureCloudDEV 
AZURE.SVAP.IN 
LOG.XML.INPUT 
AXIOM.SERVADMIN.OUTPUT 
SERVADMIN.ERROR 
SB.OUT 
TIMEOUT.IN 
--------------------------------------------------------------------------------------------- 

Array 4 - JVMAZURE2,/www/deploy/DEV/JVMAZURE2/SendMessageFromAzureCloudDEV,com.azure.SendMessageFromAzureCloud 

JVM - JVMAZURE2 
Node - com.azure.SendMessageFromAzureCloud 
Jar - /www/deploy/DEV/JVMAZURE2/SendMessageFromAzureCloudDEV 
AZURE.SVAP.IN 
SERVADMIN.ERROR 
TIMEOUT.IN 
--------------------------------------------------------------------------------------------- 

我試圖到grep或AWK的罐下方的線/模式和要打印的JVM,節點和線我正在尋找。

所以,如果我尋找AXIOM.SVAP.IN,我所要的輸出是

JVMAZURE,com.azure.ReceiveResponseFromAzure,AXIOM.SVAP.IN 
JVMAZURE,com.azure.RecivedResponse,AXIOM.SVAP.IN 

,或者如果我在尋找SERVADMIN.ERROR我想要的輸出爲

JVMAZURE,com.azure.ReceiveResponseFromAzure,SERVADMIN.ERROR 
    JVMAZURE,com.azure.RecivedResponse,SERVADMIN.ERROR 
    JVMAZURE1,com.azure.SendMessageToAzureCloud,SERVADMIN.ERROR 
    JVMAZURE2,com.azure.SendMessageFromAzureCloud,SERVADMIN.ERROR 

我有試過awk,但沒有得到任何一致的結果。

cat AZURE.txt|awk -v OFS=, -v r="^'|'$" '/SERVADMIN.ERROR/ { p=$NF; gsub(r,"",p) } /EG/ { e=$NF } /Flow/ {f=$NF; gsub(r,"",f); print e,f,p }'

是yiedling我

JVMAZURE,com.azure.ReceiveResponseFromAzure, 
JVMAZURE,com.azure.RecivedResponse,SERVADMIN.ERROR 
JVMAZURE1,com.azure.SendMessageToAzureCloud,SERVADMIN.ERROR 
JVMAZURE2,com.azure.SendMessageFromAzureCloud,SERVADMIN.ERROR 

並與線相同的結果/模式改變,如果我搜索AXIOM.SVAP.IN

回答

2

當你已經在你輸入的名稱 - >值對是最好創建一個數組(下面的f[])來保存該關係,然後您可以通過其名稱訪問這些值:

$ cat tst.awk 
BEGIN { FS=" - "; OFS="," } 
(Jar in f) && ($0 == tgt) { print f["JVM"], f["Node"], $0 } 
{ f[$1] = $2; prev = $1 } 
/^-+$/ { delete f } 

$ awk -v tgt='AXIOM.SVAP.IN' -f tst.awk file 
JVMAZURE,com.azure.ReceiveResponseFromAzure,AXIOM.SVAP.IN 
JVMAZURE,com.azure.RecivedResponse,AXIOM.SVAP.IN 

$ awk -v tgt='SERVADMIN.ERROR' -f tst.awk file 
JVMAZURE,com.azure.ReceiveResponseFromAzure,SERVADMIN.ERROR 
JVMAZURE,com.azure.RecivedResponse,SERVADMIN.ERROR 
JVMAZURE1,com.azure.SendMessageToAzureCloud,SERVADMIN.ERROR 
JVMAZURE2,com.azure.SendMessageFromAzureCloud,SERVADMIN.ERROR 
+0

這隻適用於AXIOM.SVAP.IN。如果我將模式設置爲SERVADMIN.ERROR,它會給我一個空白。另外,有沒有一種方法可以在單行中完成此操作。 – user3164754

+0

我編輯了我的答案,以顯示解決方案,解決您的需求的一個可能的解釋(整個字符串匹配)。不要使用'pattern'這個詞,因爲它是不明確的 - 總是說你想要字符串還是正則表達式匹配,以及如果你想匹配整行(或單詞或其他)或部分行(或...)甚至跨行。 –