String parsing help across multiple UNIX platforms


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting String parsing help across multiple UNIX platforms
# 1  
Old 06-08-2017
String parsing help across multiple UNIX platforms

Need to parse XML like strings from a file.

Using `egrep -A 1 "Panel Temp" "$2" | tail -2` I get the following string:

Code:
<parameter name="Panel Temp" unit="0.1 C"> <value size="1" starttime="06-08-2017 09:36:56.968">95</value>

I want to output:
Code:
{"Panel Temp" 9.5 C}

The 9.5 C is the value of 9 * unit of 0.1 C

I need something that'll work from a shell script on old and new systems. Particularly from IRIX 6.5...Linux 2.4 to Linix 2.6+ kernel based systems.
Korn ksh is the default shell on IRIX and is probably the most limiting factor, i.e. ksh features that'll work on old and new.

Any help appreciated

Moderator's Comments:
Mod Comment edit by bakunin: please use CODE-tags (for data and terminal output too). Thank you.

Last edited by bakunin; 06-08-2017 at 03:56 PM..
# 2  
Old 06-08-2017
Quote:
Originally Posted by harleyvrodred
Need to parse XML like strings from a file.
As often stated: one can do that, but be aware that in a strict sense you can't do it by regular exprerssions. For instance, in XML it is not guaranteed that tags are on the same line. They could be on different lines, in different order, etc.. Therefore any regexp-based solution short of a real XML-parser will make implicit assumptions about the format of the file which could or could not be correct.

Quote:
Originally Posted by harleyvrodred
I get the following string:

Code:
<parameter name="Panel Temp" unit="0.1 C"> <value size="1" starttime="06-08-2017 09:36:56.968">95</value>

I want to output:
Code:
{"Panel Temp" 9.5 C}

The 9.5 C is the value of 9 * unit of 0.1 C
OK, the part "9 * 0.1" is perhaps a typo and should (i suppose) read "95 * 0.1". I also understand the format of the string you cut out which containsthe relevant tags. But the command producing this string looks fishy. Can you please post a part of your input file (a few lines surrounding the part you want to cut out and parse), because i think this cutting could be done more easily.

Quote:
Originally Posted by harleyvrodred
Korn ksh is the default shell on IRIX and is probably the most limiting factor, i.e. ksh features that'll work on old and new.
As it is i don't think so: ksh comes in two variants, ksh88 and ksh93 and ksh88 is a strict subset of what ksh93 can do. Find out what IRIX uses, but i think writing for ksh88 should put you on the safe side.

Linux, though, is a different matter, depending on what distribution you use. SuSE 11 for instance, had a real AT&T ksh93 when you installed it and called ksh on the command line. SuSE 12, though, dropped the AT&T version from the repository completely and if you invoke ksh you get some "mksh" (which is a not-compatible clone with most ksh-features missing but some bash-features included), but it won't tell you so. I learned that a few weeks ago, when i gave a script i wrote on RHEL (which again has a real ksh when you invoke ksh) to a colleague from the Linux team and we wondered why it didn't work. So be prepared for some surprises.

I hope this helps.

bakunin
# 3  
Old 06-08-2017
Hi, harleyvrodred.

Welcome to the forum.
Quote:
Originally Posted by harleyvrodred
...I need something that'll work from a shell script on old and new systems. ...
I'd be inclined to look at perl.

Best wishes ... cheers, drl
# 4  
Old 06-08-2017
Example file

Code:
<?xml version="1.0" encoding="UTF-8"?>                                                                                                                          
                                                                                                                                                                
<log cabinet="403541" MLN="9999" USN="0001538397" timeStamp="Mon May 22 21:02:53 2017" timeZone="MST-MDT">                                                  
   <message type="parametricLog" time="Mon May 22 21:02:53 2017" source="Unknown">                                                                              
      <text />                                                                                                                                                  
      <detail>                                                                                                                                                  
         <parametricdata>                                                                                                                                       
            <data>                                                                                                                                              
               <config>                                                                                                                                         
                  <property name="SW Rev">122.33_V01</property>                                                                                          
               </config>                                                                                                                                        
               <group name="Cooling Cabinet">                                                                                                                   
                  <parameter name="Coolant Temp"  unit="0.1 C">                                                                                                 
                     <value size="1"  starttime="06-08-2017 13:40:52.563">293</value>                                                                           
                  </parameter>                                                                                                                                  
                  <parameter name="Electronics PID Control Value"  unit="-">                                                                                    
                     <value size="1"  starttime="06-08-2017 13:41:42.612">1641</value>                                                                          
                  </parameter>                                                                                                                                  
                  <parameter name="Coolant Temp"  unit="0.1 C">                                                                                                 
                     <value size="1"  starttime="06-08-2017 13:41:52.525">304</value>                                                                           
                  </parameter>                                                                                                                                  
                  <parameter name="Actual Air Velocity"  unit="fpm">                                                                                            
                     <value size="1"  starttime="06-08-2017 13:41:57.728">877</value>                                                                           
                  </parameter>                                                                                                                                  
                  <parameter name="Electronics PID Control Value"  unit="-">                                                                                    
                     <value size="1"  starttime="06-08-2017 13:42:42.573">658</value>                                                                           
                  </parameter>                                                                                                                                  
                  <parameter name="Actual Air Velocity"  unit="fpm">                                                                                            
                     <value size="1"  starttime="06-08-2017 13:42:57.751">869</value>  
                  </parameter>  
                  <parameter name="Cabinet Temp"  unit="0.1 C">                                                                                                                  
                     <value size="1"  starttime="06-08-2017 13:42:59.751">310</value>                                                                                                                                                                                                                                                                                                                              
                  </parameter>                                                                                                                                  
                  <parameter name="Electronics PID Control Value"  unit="-">                                                                                    
                     <value size="1"  starttime="06-08-2017 13:43:42.555">1229</value>                                                                          
                  </parameter>                                                                                                                                  
                  <parameter name="Coolant Temp"  unit="0.1 C">                                                                                                 
                     <value size="1"  starttime="06-08-2017 13:44:02.457">293</value>                                                                           
                  </parameter>                                                                                                                                  
                  <parameter name="Electronics PID Control Value"  unit="-">                                                                                    
                     <value size="1"  starttime="06-08-2017 13:44:42.586">1545</value>                                                                          
                  </parameter>                                                                                                                                  
                  <parameter name="Coolant Temp"  unit="0.1 C">                                                                                                 
                     <value size="1"  starttime="06-08-2017 13:45:02.455">307</value>                                                                           
                  </parameter>                                                                                                                                  
                  <parameter name="Electronics PID Control Value"  unit="-">                                                                                    
                     <value size="1"  starttime="06-08-2017 13:45:42.621">819</value>                                                                           
                  </parameter>
                  <parameter name="Cabinet Temp"  unit="0.1 C">                                                                                                                  
                     <value size="1"  starttime="06-08-2017 13:46:29.751">360</value>                                                                                                                                                                                                                                                                                                                              
                  </parameter>                                                                                                                                                                                                                                                                    
                  <parameter name="Electronics PID Control Value"  unit="-">                                                                                    
                     <value size="1"  starttime="06-08-2017 13:46:42.593">1667</value>                                                                          
                  </parameter>                                                                                                                                  
               </group>                                                                                                                                         
            </data>                                                                                                                                             
         </parametricdata>                                                                                                                                      
      </detail>                                                                                                                                                 
   </message>                                                                                                                                                   
</log>

---------- Post updated at 04:23 PM ---------- Previous update was at 04:17 PM ----------

I'm looking to get the latest values for the parameters

Last edited by harleyvrodred; 06-09-2017 at 11:00 PM..
# 5  
Old 06-08-2017
A bit difficult to look for "Panel Temp" if there's none in the input file.
OK, looking for "Coolant" in lieu, try
Code:
awk '
match ($0, /"Coolant Temp"/)    {printf "{%s", substr ($0, RSTART, RLENGTH)
                                 gsub (/^.*=|"|> *$/, "")
                                 split ($0, UN)
                                 getline
                                 gsub (/<[^>]*>/, "")
                                 print " "UN[1] * $0, UN[2] "}" 
                                }
' file
{"Coolant Temp" 29.3 C}
{"Coolant Temp" 30.4 C}
{"Coolant Temp" 29.3 C}
{"Coolant Temp" 30.7 C}

This User Gave Thanks to RudiC For This Post:
# 6  
Old 06-09-2017
Apologize for the inconsistencies...

This does indeed find every instance and print them out. Nice job!

What I need is for it to find the last instance and return that last one in a string variable so I can pass it onto the next step.

Do you have such an eloquent example of how this might be accomplished as well?

Much appreciated!
# 7  
Old 06-09-2017
Quote:
Originally Posted by harleyvrodred
Apologize for the inconsistencies…

This does indeed find every instance and print them out. Nice job!

What I need is for it to find the last instance and return that last one in a string variable so I can pass it onto the next step.

Do you have such an eloquent example of how this might be accomplished as well?

Much appreciated!
Without knowing what shell you're using, we can only guess at how the output of a command should be assigned to a shell variable. And, without knowing what operating system you're using, we have to make several other wild assumption that may not work in your environment, but the following seems to do what you seem to what on the MacOS system I'm using when using a Korn shell:
Code:
#!/bin/ksh
variable=$(awk -F'"' -v pattern='Coolant Temp' '
$2 == pattern {
	split($4, t, / /)
	getline
	split($0, m, /[<>]/)
	o = sprintf("{%s %.1f %s}", FS pattern FS, t[1] * m[3], t[2])
}
END {	print o
}' file)

printf 'Last value extracted from file was: %s\n' "$variable"

The command syntax in this script should work with other shells that perform basic command substitutions as required by the POSIX standards (such as bash). If you want to try this on a Solaris/SunOS system, you'll need to change awk to /usr/xpg4/bin/awk or nawk.

The above is a slight variation on the code RudiC suggested that only prints the last occurrence of the data pattern found in the input file,, save the result in a shell variable, and prints the contents of that shell variable before the script exits.

If a file named file contains the sample contents you provided in post #4 in this thread, the output produced by running the above script is:
Code:
Last value extracted from file was: {"Coolant Temp" 30.7 C}


Last edited by Don Cragun; 06-09-2017 at 05:34 AM.. Reason: Fix typo pointed out by RudiC: s/FS pat FS/FS pattern FS/
This User Gave Thanks to Don Cragun For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. 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

2. Shell Programming and Scripting

Specific string parsing in Linux/UNIX

Hi, I have a string which can be completely unstructred. I am looking to parse out values within that String. Here is an example <Random Strings> String1=<some number a> String2=<some number b> String3=<some number c> Satish=<some number d> String4=<some number e> I only want to parse out... (1 Reply)
Discussion started by: satishrao
1 Replies

3. Shell Programming and Scripting

Multichecks across all unix platforms

Can somebody refer me following multicheck to perform across most of unix platform like AIX, HP-UX, solaris, Linux. CPU utilization above X% Check IO above X% Swap usage check above X% Memory utilization above X% ... (3 Replies)
Discussion started by: sendtoshailesh
3 Replies

4. Shell Programming and Scripting

string parsing using UNIX

I got multple sql files.such as >>vi abc.sql select A.SITENAME, NULL NULL A.CREATE_DTM NULL A.MODIFY_DTM NULL FROM ${STG_RET_ITEM} A INNER JOIN ${STG_INC_COMP} B ON (A.CUSTID=B.CUSTID) LEFT OUTER JOIN ( select C.SITEID,SITESTATUS,MIN_EFF_DT,CURR_ST_DT,MAX_IN_DT,MAX_ACT_DT from... (4 Replies)
Discussion started by: ali123
4 Replies

5. Programming

How do I find the MAC address in C on different UNIX platforms?

I need to find the MAC address of the ethernet cards on the host machine from the C language. I have found a way to do this on Linux using socket(), ioctl() and the ifreq structure. But this does not seem to work on AIX, HP/UX and probably the others I need (Solaris, SCO, Alpha etc). Is there a... (7 Replies)
Discussion started by: Pug
7 Replies

6. Shell Programming and Scripting

Logfile parsing with variable, multiple criterias among multiple lines

Hi all I've been working on a bash script parsing through debug/trace files and extracting all lines that relate to some search string. So far, it works pretty well. However, I am challenged by one requirement that is still open. What I want to do: 1) parse through a file and identify all... (3 Replies)
Discussion started by: reminder
3 Replies

7. UNIX and Linux Applications

Platforms using Unix

Hi ;) Which hardware platforms/machine types use the Operating System Unix? A list of all would be appreaciated Thx Megadrink :cool: (2 Replies)
Discussion started by: Megadrink
2 Replies

8. UNIX for Dummies Questions & Answers

Unix Platforms

Hi. Where can i learn, Which Unix platform specific for what? Properties? (1 Reply)
Discussion started by: Enrgy
1 Replies

9. Shell Programming and Scripting

Parsing of file for Report Generation (String parsing and splitting)

Hey guys, I have this file generated by me... i want to create some HTML output from it. The problem is that i am really confused about how do I go about reading the file. The file is in the following format: TID1 Name1 ATime=xx AResult=yyy AExpected=yyy BTime=xx BResult=yyy... (8 Replies)
Discussion started by: umar.shaikh
8 Replies

10. UNIX for Advanced & Expert Users

Patch Management over mixed unix platforms

Does anyone know of any tools that manage the rollout of patches across multiple types of Unix platform ( eg Solaris, Aix etc ). I am looking for something that does a similiar job to SMS or WSUS in the Windows world (3 Replies)
Discussion started by: jimthompson
3 Replies
Login or Register to Ask a Question