Extract string from XML | Unix Linux Forums | Shell Programming and Scripting

  Go Back    


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

Extract string from XML

Shell Programming and Scripting


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 02-11-2013
mohtashims mohtashims is offline
Registered User
 
Join Date: Jun 2011
Last Activity: 24 July 2014, 9:27 AM EDT
Posts: 356
Thanks: 81
Thanked 0 Times in 0 Posts
Scissors Extract string from XML

Hi,

I wish to grep for the first instance of <listen-address> value between the first <server></server> tag in an xml file.

Sample xml:




Code:
.........
    <timeout-seconds>1500</timeout-seconds>
  </jta>
  <server>
    <name>Adminserver_DEV</name>
    <listen-address>myadminhost</listen-address>
  </server>
  <server>
    <name>managed_core</name>
<listen-address>secondadminhost</listen-address>
    <ssl>
      <enabled>false</enabled>
......

Desired Result: myadminhost

If<listen-address></listen-address> is blank or not present in the first <server></server> tag then the desired result should be the hostname of the server excuting the script.

Thank you.!!
Sponsored Links
    #2  
Old 02-11-2013
pamu pamu is offline
Registered User
 
Join Date: Mar 2012
Last Activity: 1 July 2014, 5:40 AM EDT
Posts: 1,649
Thanks: 58
Thanked 478 Times in 474 Posts
Try


Code:
 
awk -F "[<>]" '/listen-address/ && $3{print $3;exit}' file

Sponsored Links
    #3  
Old 02-11-2013
Shaishav Shah Shaishav Shah is offline
Registered User
 
Join Date: Dec 2012
Last Activity: 21 January 2014, 6:53 AM EST
Posts: 21
Thanks: 0
Thanked 0 Times in 0 Posts
First Occurance :


Code:
sed -n -e 's/.*<listen-address>\(.*\)<\/listen-address>.*/\1/p' "Your_file.xml" | head -1

Nth Occurance :


Code:
sed -n -e 's/.*<listen-address>\(.*\)<\/listen-address>.*/\1/p' "Your_file.xml" | head -n | tail -1

    #4  
Old 02-12-2013
RudiC RudiC is offline Forum Advisor  
Registered User
 
Join Date: Jul 2012
Last Activity: 30 July 2014, 4:55 PM EDT
Location: Aachen, Germany
Posts: 3,936
Thanks: 63
Thanked 936 Times in 888 Posts
Try this to print the listen-address in exactly the first <server>...</server> tag, or the hostname if missing/empty:
Code:
awk     'BEGIN {"hostname" | getline HN}
         /<\/server>/ {exit}
         /<server>/   {s=1}
         /<listen-address>/&& s {gsub (/<.?listen-address>| */, "")
                                 LA = $0
                                }
         END            {print LA?LA:HN
                        }
        ' file
myadminhost

The Following User Says Thank You to RudiC For This Useful Post:
mohtashims (02-15-2013)
Sponsored Links
    #5  
Old 02-15-2013
mohtashims mohtashims is offline
Registered User
 
Join Date: Jun 2011
Last Activity: 24 July 2014, 9:27 AM EDT
Posts: 356
Thanks: 81
Thanked 0 Times in 0 Posts
Quote:
Originally Posted by RudiC View Post
Try this to print the listen-address in exactly the first <server>...</server> tag, or the hostname if missing/empty:
Code:
awk     'BEGIN {"hostname" | getline HN}
         /<\/server>/ {exit}
         /<server>/   {s=1}
         /<listen-address>/&& s {gsub (/<.?listen-address>| */, "")
                                 LA = $0
                                }
         END            {print LA?LA:HN
                        }
        ' file
myadminhost

This is more close to my request as it considers the first <server> tag only. However,

1. I would like read the result in a variable (myhost) and

2. for another tag <listen-port> if missing in the first <server> tag then would like to assign "7001" to "myport" variable.
Sponsored Links
    #6  
Old 02-15-2013
panyam panyam is offline Forum Advisor  
Registered User
 
Join Date: Sep 2008
Last Activity: 24 July 2014, 3:48 AM EDT
Posts: 1,156
Thanks: 20
Thanked 104 Times in 99 Posts
Something like this:


Code:
 awk -F"[<->]" ' BEGIN { myh="";myp="7001" }
 /<\/server>/ { exit } 
 /<server>/ { s = 1 ; }
 s && /<listen-address>/ {  myh=$3; }  
 /<listen-port>/ {  myp=$3 ;}
 END { print "host:"myh"\t port->"myp }' sample

Sponsored Links
    #7  
Old 02-15-2013
mohtashims mohtashims is offline
Registered User
 
Join Date: Jun 2011
Last Activity: 24 July 2014, 9:27 AM EDT
Posts: 356
Thanks: 81
Thanked 0 Times in 0 Posts
Quote:
Originally Posted by panyam View Post
Something like this:


Code:
 awk -F"[<->]" ' BEGIN { myh="";myp="7001" }
 /<\/server>/ { exit } 
 /<server>/ { s = 1 ; }
 s && /<listen-address>/ {  myh=$3; }  
 /<listen-port>/ {  myp=$3 ;}
 END { print "host:"myh"\t port->"myp }' sample

But will this populate the hostname command if <listen-address> tag is not found ?
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
XML - Split And Extract String between Chars unme Shell Programming and Scripting 2 12-19-2012 04:43 AM
Extract Multivalue from XML manas_ranjan Shell Programming and Scripting 4 01-09-2012 06:16 AM
Extract value from XML manas_ranjan Shell Programming and Scripting 9 01-08-2012 01:23 AM
to extract string from main string and string comparison vivek d r Shell Programming and Scripting 2 11-16-2011 07:17 AM
Grep a string from input file and delete next three lines including the line contains string in xml greet_sed Shell Programming and Scripting 4 09-28-2011 05:18 AM



All times are GMT -4. The time now is 03:23 AM.