2016-05-02 13 views
2

Hallo Ich habe eine Textdatei mit Hunderten von Zeilen. Hier ist ein Beispiel.awk zum Drucken Teil eines Arrays in der 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 
--------------------------------------------------------------------------------------------- 

Ich versuche, für die Linien/Muster unter dem Jar grep oder awk und versuchen, die JVM, Knoten und diese Zeile ich suche zu drucken.

Also, wenn ich für AXIOM.SVAP.IN bin auf der Suche, möchte ich die Ausgabe

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

sein oder wenn ich für SERVADMIN.ERROR Suche bin möchte ich die Ausgabe

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

ich habe zu sein versucht, awk aber habe keine konsistenten Ergebnisse.

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 }'

ist yiedling mich

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

Und das gleiche Ergebnis mit der Linie/geändert Muster, wenn ich für AXIOM.SVAP.IN

Antwort

2

suchen Wann immer Sie haben Namen-> Wert-Paare in Ihrer Eingabe ist es Am besten erstellen Sie ein Array (f[] unten), um diese Beziehung zu halten, und dann können Sie einfach auf die Werte mit ihren Namen zugreifen:

$ 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

Dies funktioniert nur für AXIOM.SVAP.IN. Wenn ich das Muster als SERVADMIN.ERROR habe, gibt es mir ein Leerzeichen. Gibt es auch eine Möglichkeit, dies in einer einzigen Zeile zu tun. – user3164754

+0

Ich habe meine Antwort bearbeitet, um eine Lösung zu zeigen, die eine mögliche Interpretation Ihrer Anforderungen anspricht (String passt zu ganzen Zeilen). Verwende nie das Wort 'pattern', da es mehrdeutig ist - sage immer, ob du Streich- oder Regexp-Treffer möchtest und ob Übereinstimmungen in ganzen Zeilen (oder Wörtern oder was auch immer) oder Teilzeilen (oder ...) oder sogar in Zeilen vorhanden sein sollen. –