2016-05-02 32 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'这个词,因为它是不明确的 - 总是说你想要字符串还是正则表达式匹配,以及如果你想匹配整行(或单词或其他)或部分行(或...)甚至跨行。 –