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
# 8  
Old 06-09-2017
Small correction to Don Cragun's fine proposal: in the sprintf command, replace "pat" by "pattern" to get the desired result.


Use this for the last occurrence of the pattern in file:
Code:
awk '
match ($0, /"Coolant Temp"/)    {TMP = substr ($0, RSTART, RLENGTH)
                                 gsub (/^.*=|"|> *$/, "")
                                 split ($0, UN)
                                 getline
                                 gsub (/<[^>]*>/, "")
                                 OUT = sprintf ("{%s %.1f %c}", TMP, UN[1] * $0, UN[2]) 
                                }
END                             {print OUT
                                }
' file


Last edited by RudiC; 06-09-2017 at 05:23 AM..
These 2 Users Gave Thanks to RudiC For This Post:
# 9  
Old 06-09-2017
Hi RudiC,
I should know better than to try to make code easier to read after it has been tested. Smilie

My post #7 has now been updated as you suggested.

Thanks,
Don
This User Gave Thanks to Don Cragun For This Post:
# 10  
Old 06-09-2017
Nice examples. I took this and made a command I could put into the clipboard and paste into a telnet window. Because I want to select-cut the result into the clipboard I'm wrapping the output onto as few lines as possible.

Code:
sh << 'PASTE'
xml_token () {
 variable=$(awk -F'"' -v pattern="$1" '
   $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
   }' $2)
 if [ $(( ${#buff} + ${#variable} )) -ge $twidth ]; then
  echo $buff; buff=$variable
   else
  buff+=$variable
   fi
}
twidth=`tput cols`
xml_token 'Coolant Temp' ~me/cooling.xml
xml_token 'Cabinet Temp' ~me/cooling.xml
echo $buff
'PASTE'

The Output using the example file is:
Code:
{"Coolant Temp" 30.7 C}{"Cabinet Temp" 36.0 C}

I was thinking about the possibility of making the search pattern string contain a list, as in:
Code:
xml_token '/Coolant Temp/ || /Cabinet Temp/' ~me/cooling.xml

I could make the list of search patterns as many as I needed, certainly more than 2. More like a dozen or so search strings (or patterns as they are here). My attempts have failed, ideas?

Last edited by harleyvrodred; 06-10-2017 at 11:18 AM.. Reason: add output script produces
# 11  
Old 06-10-2017
I don't understand. Are you saying that you want to search for a bunch of patterns and return the last element in the XML file that matched any one of those patterns? So, if we look at the last couple of entries in your sample:
Code:
                  <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>

and you decide to search for Cabinet Temp and Electronics PID Control Value, you want the output to be:
Code:
{"Electronics PID Control Value" 0 }

Note that the 0 comes from multiplying 1667 times the string "-" and the space at the end is because there is no second value after a space in unit="-" like there was in your earlier example with unit="0.1 C".

If we had a clear definition of what you're trying to do, we might be able to help you get there. But, with your current description, I'm not able to guess at the output you hope to achieve.
# 12  
Old 06-10-2017
In the case you mentioned, I'd prefer to see
Code:
{"Electronics PID Control Value" 1667 -}

I tried adding a few more entries to the example, namely Cabinet Temp - would also have the same fields as Coolant Temp. The real-life file has many Temp related entries that I'm interested in. I could use what is here now and use the xml_token function individually with multiple calls for each one, getting the last entry each. I was wondering if there would be a way to use a search string with multiple entries at the same time so it would return the last entry of each.

I know the subset that I’m interested in.

Another approach might be to take each <parameter> name and return the last instance of each. This help?

I'm data mining. Pulling data from site machines for analysis. There is too much to pull it all. I'm just choosing and picking

Last edited by harleyvrodred; 06-10-2017 at 12:55 AM..
# 13  
Old 06-10-2017
Quote:
Originally Posted by harleyvrodred
I tried adding a few more entries to the example, namely Cabinet Temp - would also have the same fields as Coolant Temp. The real-life file has many Temp related entries that I'm interested in. I could use what is here now and use the xml_token function individually with multiple calls for each one, getting the last entry each. I was wondering if there would be a way to use a search string with multiple entries at the same time so it would return the last entry of each.

I know the subset that I'm interested in.

Another approach might be to take each <parameter> name and return the last instance of each. This help?

I'm data mining. Pulling data from site machines for analysis
We are very glad you know the subset of entries you're interested in. But my crystal ball isn't showing me what is inside your head. What would help would be for us to know the subset of entries you're interested in. Or, if you want the code to determine which entries it should extract, explain to us how you would determine that an entry is interesting by describing what you see on the first line of that <parameter>...</parameter> XML tag that makes it interesting. (Is it that the last word inside the 1st pair of double-quotes is Temp? Is it that string between the 2nd pair of double-quotes is 0.1 C? If it isn't one of these, what is it?)

After you describe the logic that determines which entries are interesting, please show us the exact output that you want your script to produce given the sample you provided in post #4 in this thread. Or post new data in a new post (with CODE tags) and show us the exact output (also in CODE tags) you're hoping to produce from that input with the list of interesting tag values or the logic that you described to determine which tags are interesting.
# 14  
Old 06-10-2017
Quote:
Originally Posted by harleyvrodred
In the case you mentioned, I'd prefer to see
Code:
{"Electronics PID Control Value" 1667 -}

I tried adding a few more entries to the example, namely Cabinet Temp - would also have the same fields as Coolant Temp. The real-life file has many Temp related entries that I'm interested in. I could use what is here now and use the xml_token function individually with multiple calls for each one, getting the last entry each. I was wondering if there would be a way to use a search string with multiple entries at the same time so it would return the last entry of each.

I know the subset that I'm interested in.

Another approach might be to take each <parameter> name and return the last instance of each. This help?

I'm data mining. Pulling data from site machines for analysis. There is too much to pull it all. I'm just choosing and picking
Run as perl example.pl harleyvrodred.example
Code:
my %tmp;
my %parameters;
while(<>){
  if(/<parameter name/../<\/parameter/){
    /(name)="(\w[^"]+)/ and $tmp{$1} = $2;
    /(unit)="([^"]+)/ and $tmp{$1} = $2;
    /(value)[^>]+>(\d+)</ and $tmp{$1} = $2;

    if(/<\/parameter/) {
      $parameters{$tmp{'name'}} = {'unit' => $tmp{'unit'}, 'value' => $tmp{'value'}};
      undef %tmp;
    }
  }
}
for my $entry (keys %parameters) {
  my @param = @{${parameters}{$entry}}{qw(value unit)};
  print qq/{"$entry" @param}\n/;
}

Output:
Code:
{"Electronics PID Control Value" 1667 -}
{"Coolant Temp" 307 0.1 C}
{"Cabinet Temp" 360 0.1 C}
{"Actual Air Velocity" 869 fpm}

This User Gave Thanks to Aia 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