2016-05-02 17 views
2

こんにちは私は数百行のテキストファイルを持っています。ここにサンプルがあります。awkはシェルの配列の一部を出力します

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

くれ

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

そしてラインと同じ結果をyiedlingさ/パターンは、私が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というパターンがあれば、それは空白になります。また、私はこれを1行で行うことができる方法はありますか? – user3164754

+0

私の答えを編集して、要件の可能な解釈を解決するソリューションを表示しました(全行で文字列が一致します)。 'pattern'という言葉をあいまいにしないでください。文字列や正規表現のマッチが必要な場合や、行全体(または単語や何か)や部分行(または...)、あるいは行全体にマッチしたい場合は、 –

関連する問題