Multiple command execution inside awk command during xml parsing


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Multiple command execution inside awk command during xml parsing
# 1  
Old 02-08-2013
Multiple command execution inside awk command during xml parsing

below is the output xml string from some other command and i will be parsing it using awk
Code:
cat /tmp/alerts.xml
 
 <Alert id="10102" name="APP-DS-ds_ha-140018-componentFailure-S" alertDefinitionId="13982" resourceId="11427" ctime="1359453507621" fixed="false" reason="If Event/Log Level(ANY) and matching substring &quot;failed on server&quot;     Log: 10.19.123.197: 0:25:48.04, 1.3.6.1.4.1.1453.4.9.1.3.0.1, The service has failed on this server and caused an HA failover to occur., CLR OCCAS failed on server 10.19.123.197, failure, 2013-01-29,04:58:27.6,--5:0, CLEAR, 10.19.123.197, failure, 2013-01-29,04:58:27.6,--5:0, CLEAR, The service has"/>
.
.
.
etc ect

which i will be parsing using below command

Code:
awk -F'[=|"|<|>|,]' '{for(i=1;i<=NF;i++){
 if($i=="Alert id") {
  if(id!="")
        if(dt!=""){ printf "ID=%d\nNAME=%s\nFIXED=%s\nDATE=%s\nAlDefID=%d\n\n", id,nm,fx,dt,alDFid; }
  id=($i=="Alert id")?$(i+2):id; }
  nm=($i==" name")?$(i+2):nm;
  fx=($i==" fixed")?$(i+2):fx;
  dt=($i~/^ [0-9]+-/)?$i" "$(i+1):dt;
  alDFid=($i==" alertDefinitionId")?$(i+2):alDFid;
 }
}END{
 if(dt!=""){
 printf "ID=%d\nNAME=%s\nFIXED=%s\nDATE=%s\nAlDefID=%d\n\n", id,nm,fx,dt,alDFid;
}
}' /tmp/alerts.xml

output will be as below

Code:
ID=10102
NAME=APP-DS-ds_ha-140018-componentFailure-S
FIXED=false
DATE= 2013-01-29 04:58:27.6
AlDefID=13982
.
.
.etc etc many entries will be there

what i want to achieve is
>in the awk command i want to implement a check for date, first i will parse the date obtained from the query to only date and no time stamp and also system date
Code:
myDate=$( date --date="$DATE"  +%Y%m%d )
sysDate=$( date +%Y%m%d )

and if this date is older than system date then dont print from awk
Code:
if [[ $myDate -eq $sysDate ]] ;then 
   print
else
   skip all
fi

>also i need to perform one more operation
Code:
sh /opt/hqe/hqapi1-client-5.0.0/bin/hqapi.sh  alertdefinition list --id=13982 --host=localhost --port=7443 --user=hqadmin --password=hqadmin --secure=true | grep priority | awk -F'priority=' '{print $2}' | cut -d'"' -f2

whose output will be
Code:
3

PS: i am not good at parsing xml so i did some my own awk and cut to get priority value from xml :-)

the above output is nothing but the priority obtained from that id and display it on console immediately.

--------------
so final output will be

Code:
ID=10102
NAME=APP-DS-ds_ha-140018-componentFailure-S
FIXED=false
DATE= 2013-01-29 04:58:27.6
AlDefID=13982
priority=3.
.
.etc etc many entries will be there

what i want to do is, use this hqapi.sh command inside mail xml parsing AWK command for each iteration and print priority then and there,
i tried using the hqapi command in quotes `` inside awk but it dint work.
any help on this will be deeply appreciated. thanks


PS:also if i succeed in all the above, is there any way i could use echo commands in awk so that i can put check in awk for printing priority in words say 1-lOW,2-MED,3HIGH in colour code using
Code:
echo -e "\e[1;31mHIGH\e[0m"

so the output
Code:
priority=HIGH

---------- Post updated at 09:37 PM ---------- Previous update was at 07:46 PM ----------

so far i implemented below stuff...

Code:
sh /opt/hqe/hqapi1-client-5.0.0/bin/hqapi.sh  alert list --host=localhost --port=7443 --user=hqadmin --password=hqadmin --secure=true >/tmp/alerts.xml
 
awk -F'[=|"|<|>|,]' '{for(i=1;i<=NF;i++){
 if($i=="Alert id") {
  if(id!="")
        if(dt!=""){
cmd="date  +%Y%m%d"
cmd | getline sysDate
print sysDate
close(cmd)
cmd2="date --date=dt  +%Y%m%d"
cmd2 | getline myDate
print myDate
close(cmd2)
cmd3="sh /opt/hqe/hqapi1-client-5.0.0/bin/hqapi.sh  alertdefinition list --id=13671  --host=localhost --port=7443 --user=hqadmin --password=hqadmin --secure=true | grep priority | awk -F'priority=' '{print $2}' | cut -d'"' -f2 "
cmd3 | getline priority
print priority
close(cmd3)
 
 printf "ID=%d\nNAME=%s\nFIXED=%s\nDATE=%s\nAlDefID=%d\n\n", id,nm,fx,dt,alDFid; }
  id=($i=="Alert id")?$(i+2):id; }
  nm=($i==" name")?$(i+2):nm;
  fx=($i==" fixed")?$(i+2):fx;
  dt=($i~/^ [0-9]+-/)?$i" "$(i+1):dt;
  alDFid=($i==" alertDefinitionId")?$(i+2):alDFid;
 }
}END{
 if(dt!=""){
 printf "ID=%d\nNAME=%s\nFIXED=%s\nDATE=%s\nAlDefID=%d\n\n", id,nm,fx,dt,alDFid;
}
}' /tmp/alerts.xml


Additions are :
Code:
cmd="date  +%Y%m%d"
cmd | getline sysDate
print sysDate
close(cmd)
cmd2="date --date=dt  +%Y%m%d"
cmd2 | getline myDate
print myDate
close(cmd2)
cmd3="sh /opt/hqe/hqapi1-client-5.0.0/bin/hqapi.sh  alertdefinition list --id=13671  --host=localhost --port=7443 --user=hqadmin --password=hqadmin --secure=true | grep priority | awk -F'priority=' '{print $2}' | cut -d'"' -f2 "
cmd3 | getline priority
print priority
close(cmd3)

stuck at the place where i need to parse date present in 'dt' variable.. its not considering dt even if i put $ behind it. its throwin error as
Code:
 
date: invalid date `dt'

and for running the script , the cmd3 is not able to process it, its showing as
Code:
awk: cmd. line:14: cmd3="sh /opt/hqe/hqapi1-client-5.0.0/bin/hqapi.sh  alertdefinition list --id=13671  --host=localhost --port=7443 --user=hqadmin --password=hqadmin --secure=true | grep priority | awk -Fpriority= {print
awk: cmd. line:14:      ^ unterminated string


Can anyone help me to proceed further!!!!.. i see no one has replied to this.. the awk command looks complex but its actually simple...

Last edited by vivek d r; 02-08-2013 at 11:31 AM..
# 2  
Old 02-08-2013
JAVA, PERL and C++ have true XML parsers. Awk can handle some xml layouts but might get tangled in others just as valid. Tools like XPath, XQuery, XSLT and JAX can script XML solutions. XQuery - Wikipedia, the free encyclopedia Java XML - Wikipedia, the free encyclopedia
# 3  
Old 02-11-2013
:-( dint help.
i just need the solution for running a script inside awk and storing the output in a variable and also using date variable inside awk for comparison. Is it possible?
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

awk trouble inside another command

I tried running this. dsh -w server1 'lsof /audit | awk '{ print $2 }'' It did not like above so I tried to escape the single parenthesis at the end. dsh -w server1 'lsof /audit | awk '{ print $2 }\'' It then hung so I changed up the parenthesis to this. This worked. dsh -w server1... (6 Replies)
Discussion started by: cokedude
6 Replies

2. Shell Programming and Scripting

Parsing OSX UNIX command results which print in multiple lines

from the CLI on a Mac, if you type networksetup -listallnetworkservices then you get results in a multi-line paragraph that look something like this: networksetup -listallnetworkservices An asterisk (*) denotes that a network service is disabled. Wi-Fi Display Ethernet Bluetooth DUN... (7 Replies)
Discussion started by: hungryd
7 Replies

3. Shell Programming and Scripting

Parsing XML using command line

Hi Experts, How do I parse a XML with below contents <saw:user name="mbussey@xyz.com" /> <saw:user name="kimmy.chan@pqr.com" /> <saw:user name="chudgins@gmail.com" /> and retrieve below output ? mbussey@xyz.com kimmy.chan@pqr.com chudgins@gmail.com ... (17 Replies)
Discussion started by: pauldx
17 Replies

4. Shell Programming and Scripting

Execution Problem with awk command

Hi All, I am trying to find a word from a file in loop. while read i; do DB_Name=$i awk '{for(i=1;i<=NF;i++)if($i~/$DB_Name/)print $(i)}' $BTEQ_NAME > $DB_Name_TableList.txt done <Param.txt here Param.txt contents data as ODS_TARGT_RECV FIN_TARGT... (7 Replies)
Discussion started by: Shilpi Gupta
7 Replies

5. Shell Programming and Scripting

Grep command inside awk

Hi, I would like to use grep command inside awk. Here is my requirement below : file.txt col1 col2 col3 col 4 col 5 wrxwrx 124 jun 3 Sensex.EMEA wrxwrx 120 jun 4 Emex.US wrxwrx 130 feb 3 passion.AUS wrxwrx 145 feb 9 lession.AUS wrxwrx 130 feb 5 pass.US wrxwrx 130 feb 8... (5 Replies)
Discussion started by: Balasankar
5 Replies

6. Shell Programming and Scripting

Help in using date command inside awk

Hi All, bash-3.2$ autorep -J BOX_NAME% -l0 | grep BOX_NAME| awk -f awkScript.awk sh: -c: line 0: unexpected EOF while looking for matching `"' sh: -c: line 1: syntax error: unexpected end of file BOX_NAME SU 06/21/2013 03:44:03 06/21/2013 07:46:37 0 #My awkfile { ... (3 Replies)
Discussion started by: ddspark
3 Replies

7. Shell Programming and Scripting

Parallel execution of command inside file

Hi all, I have the requirement to generate the file containing following command eval /path/ dsjob -logdetail projectname JOBNAME /path/ 1. The file contains the above command say about 150 times i,e only the JOBNAME changes in every command 2. The commands must be written in such a way... (2 Replies)
Discussion started by: sanjay mn
2 Replies

8. Shell Programming and Scripting

Multiple command execution

I want to open more than 2 files(f1,f2). commands for opening those files are stored in one file (f3). command to execute the file (f3). (3 Replies)
Discussion started by: Mahendravarma
3 Replies

9. Shell Programming and Scripting

Execution problems using awk command.

Hi All, I have the following requirement. In a directory i get files from external source. I at regular intervals check that directory for any incoming files. The file name is underscore delimited. Such as: aaa_bbb_ccc_ddd_eee_fff.dat I am using awk and and splitting the file name. ... (4 Replies)
Discussion started by: satishpv_2002
4 Replies

10. Shell Programming and Scripting

Execution of awk command in a variable

Hi All, I have a awk command that is stored in a variable. the value of the variable cmd is: (mean output of echo $cmd is: ) awk -F";" '{print $1}' Now I want to execute this command. How can I do that???? Quick Reply will be appreciated. Regards, Amit (2 Replies)
Discussion started by: patelamit009
2 Replies
Login or Register to Ask a Question