2016-12-19 6 views
0

CentOSサーバーのコレクタ名に基づいてxmlファイルからすべてのFCP名を抽出する必要があります CPMタグ内の行数は不明です bash、どのような解決策でも問題ありません。父の葉の文字列の検索に基づいてXMLから特定の文字列を検索して表示する

例:入力ファイル

<CPM display_name="XYZ" collector="202a" > 
    <FCP name="a1" second_name="b2"/> 
    <FCP name="a3" second_name="b232323"/> 
    <FCP name="a2" second_name="b445"/> 
    </CMP> 
    <CPM display_name="XYZ" collector="204a" > 
    <FCP name="z1" second_name="b232323232"/> 
    <FCP name="s3" second_name="b23232323"/> 
    <FCP name="t2" second_name="b4453223"/> 
    </CMP> 
    <CPM display_name="XYZ" collector="202a" > 
    <FCP name="a11" second_name="basdasdasdasd2"/> 
    </CMP> 

.... 500以上の行の長いファイル。

の予想される出力

collector="202a" 
name="a1" 
name="a2" 
name="a3" 
name="a11" 

collector="204a" 
name="z1" 
name="s3" 
name="t2 

matchと。

+2

あなたは何を試してみましたか?何がうまくいかなかったのですか? – karakfa

+0

XMLを処理するために、行指向のツールを使用しないでください。代わりに 'xsltproc'のようなものを使用してください。 –

+0

開始タグと終了タグが異なるのはなぜですか? 「CPM」と「CMP」? – Inian

答えて

2

gawkソリューション、substrRSTARTどのような援助を感謝し、RLENGTHあなたがgrep -o動作をエミュレートすることができ、かつA[length(A)+1]=Nエミュレート・アレイ・プッシュ動作:

awk ' 
    match($0, /collector="[^"]*"/){ 
     collector=substr($0, RSTART, RLENGTH) 
    } 
    match($0,/[ ]name="[^"]*"/) { 
     d[collector][length(d[collector])+1]=substr($0, RSTART+1, RLENGTH) 
    } 
    END{ 
     for(k in d){ 
      print(k) 
      for (i in d[k]) print d[k][i] 
      print "" 
     } 
    }' file 

編集:おかげで、エド・モートン

awk ' 
    match($0, /\<collector="[^"]*"/, a){ collector=a[0] } 
    match($0, /\<name="[^"]*"/, a){ d[collector][length(d[collector])+1]=a[0] } 
    END{ 
     for(k in d){ 
      print(k) 
      for (i in d[k]) print d[k][i] 
      print "" 
     } 
    }' file 

あなたが得る、

collector="202a" 
name="a1" 
name="a3" 
name="a2" 
name="a11" 

collector="204a" 
name="z1" 
name="s3" 
name="t2" 

ボーナス:gawkソリューション、sedgrepsorttr機能

grep -oE '\b(collector|name)="[^"]*"' file | 
sed ':a;N;$!ba;s/\nname/ name/g' | 
sort -k1 | 
sed ':a;$!N;/^\([^ ]*[ ]\).*\n\1/s/\n/ /;ta;P;D' | 
sed 's/[ ]collector="[^"]*"//g' | 
tr ' ' '\n' 

あなたが得る、

collector="202a" 
name="a11" 
name="a1" 
name="a3" 
name="a2" 
collector="204a" 
name="z1" 
name="s3" 
name="t2" 
関連する問題