2016-10-18 6 views
0

Ich habe folgendes in der Datei input.txt.Awk, um eine Zeichenfolge mit den Trennzeichen

<node> 
<id>1</id> 
<name>ServerA</name> 
<type>Other</type> 
</node> 
<node> 
<id>2</id> 
<name>ServerB</name> 
<type>Other</type> 
</node> 

Jetzt muss ich folgende Ausgabe bekommen.Nur das Namensfeld.

ServerA ServerB

+0

Das sieht wie XML aus. Warum versuchst du das mit awk zu verarbeiten? Und warum ist diese Frage mit "grep" markiert? – melpomene

+0

Ja, das ist eine XML-Datei. Ich habe die Hostnamen-Details im Namensfeld. Ich muss diese lokal extrahieren. – user3834663

Antwort

0
grep 'Server' input.txt | awk -F'[<>]' '{print $3}' ORS=' ' 
0

Wenn das XML ist, dann sollte das Dokument unter einem Wurzelknoten sein, wie nodes.

<nodes> 
    <node> 
    <id>1</id> 
    <name>ServerA</name> 
    <type>Other</type> 
    </node> 
    <node> 
    <id>2</id> 
    <name>ServerB</name> 
    <type>Other</type> 
    </node> 
</nodes> 

Danach können Sie entweder xmllint oder Perl verwenden. Ich mag die xmllint-Lösung nicht, weil es so schwierig ist, das Ergebnis zu formatieren; Deshalb gebe ich auch eine Perl-Antwort.

$ xmllint --xpath '/nodes/node/name/text()' input.txt                        
ServerAServerB 
$ perl -MXML::Simple -E "say foreach keys(XMLin('file.txt')->{node})"                
ServerA 
ServerB 
0

sed alternative

$ sed -nr '/^<name>/s/<[^>]+>//gp' file 

ServerA 
ServerB 
0

Basierend auf user3660575 Post.

awk -v ORS=' ' -F'[<>]' '/Server/{print $3}END{printf "\n"}' file 
ServerA ServerB 
Verwandte Themen