Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Parsing and pushing

by Anonymous Monk
on Sep 19, 2006 at 15:14 UTC ( #573748=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello all,

I need some serious help although I'm sure for most of you this is easy, I'm ready to kill somebody!
I need to write a very efficient peice of code that takes the following SNMP trap as an input from the command line:

%CATD_I_060, SNMPTRAP: -c public 954 165.148.211.199 wblvh001.telkom.c +o.za 6 10 00:00:00 16 OID: 1.3.6.1.4.1.954.1.1.1.1.1.7557342 .iso.org +.dod.internet.private.enterprises.954.1.1.1.1.1.7557342 VALUE: I OID: + 1.3.6.1.4.1.954.1.1.1.1.2.7557342 .iso.org.dod.internet.private.ente +rprises.954.1.1.1.1.2.7557342 VALUE: 7557342 OID: 1.3.6.1.4.1.954 +.1.1.1.1.3.7557342 .iso.org.dod.internet.private.enterprises.954.1.1. +1.1.3.7557342 VALUE: tcenshpat1 OID: 1.3.6.1.4.1.954.1.1.1. +1.4.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.4.7 +557342 VALUE: TEST_FILE_NAME OID: 1.3.6.1.4.1.954.1.1 +.1.1.5.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1. +5.7557342 VALUE: 3030303036 OID: 1.3.6.1.4.1.954.1.1.1.1.6.7557342 .i +so.org.dod.internet.private.enterprises.954.1.1.1.1.6.7557342 VALUE: +V OID: 1.3.6.1.4.1.954.1.1.1.1.7.7557342 .iso.org.dod.internet.privat +e.enterprises.954.1.1.1.1.7.7557342 VALUE: Not_Noticed OID: 1.3.6 +.1.4.1.954.1.1.1.1.8.7557342 .iso.org.dod.internet.private.enterprise +s.954.1.1.1.1.8.7557342 VALUE: 3230303630393130323335353132 OID: 1.3. +6.1.4.1.954.1.1.1.1.9.7557342 .iso.org.dod.internet.private.enterpris +es.954.1.1.1.1.9.7557342 VALUE: OID: 1.3.6.1.4.1.954.1.1.1.1 +.10.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.10. +7557342 VALUE: OID: 1.3.6.1.4.1.954.1.1.1.1.11.7557342 + .iso.org.dod.internet.private.enterprises.954.1.1.1.1.11.7557342 VAL +UE: CTMERRJOBNAMECTMERRTest job for unicenter OID: 1.3.6.1.4.1.954.1. +1.1.1.12.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1. +1.12.7557342 VALUE: OID: 1.3.6.1.4.1.954.1.1.1.1.13. +7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.13.7557 +342 VALUE: TEST_GROUP OID: 1.3.6.1.4.1.954.1.1.1.1.14.75573 +42 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.14.7557342 V +ALUE: TEST_APPLICATION OID: 1.3.6.1.4.1.954.1.1.1.1.15.7557342 .i +so.org.dod.internet.private.enterprises.954.1.1.1.1.15.7557342 VALUE: + TEST_JOB_NAME OID +: 1.3.6.1.4.1.954.1.1.1.1.16.7557342 .iso.org.dod.internet.private.en +terprises.954.1.1.1.1.16.7557342 VALUE: tcenshpat1

The script then needs to push each value, (i.e. everything between 'VALUE:' and the next 'OID:') into a seperate variable.

I know I'm asking a lot but I really need help. I have a very basic knowledge and not enough time.

Please help me with some pointers.

Replies are listed 'Best First'.
Re: Parsing and pushing
by bobf (Monsignor) on Sep 19, 2006 at 15:33 UTC

    This should get you started. I'm not familiar with SNMP trap format so there may be edge cases, and it could likely be written better.

    use warnings; use strict; my $data = '%CATD_I_060, SNMPTRAP: -c public 954 165.148.211.199 wblvh +001.telkom.co.za 6 10 00:00:00 16 OID: 1.3.6.1.4.1.954.1.1.1.1.1.7557 +342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.1.7557342 V +ALUE: I OID: 1.3.6.1.4.1.954.1.1.1.1.2.7557342 .iso.org.dod.internet. +private.enterprises.954.1.1.1.1.2.7557342 VALUE: 7557342 OID: 1.3 +.6.1.4.1.954.1.1.1.1.3.7557342 .iso.org.dod.internet.private.enterpri +ses.954.1.1.1.1.3.7557342 VALUE: tcenshpat1 OID: 1.3.6.1.4. +1.954.1.1.1.1.4.7557342 .iso.org.dod.internet.private.enterprises.954 +.1.1.1.1.4.7557342 VALUE: TEST_FILE_NAME OID: 1.3.6.1 +.4.1.954.1.1.1.1.5.7557342 .iso.org.dod.internet.private.enterprises. +954.1.1.1.1.5.7557342 VALUE: 3030303036 OID: 1.3.6.1.4.1.954.1.1.1.1. +6.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.6.755 +7342 VALUE: V OID: 1.3.6.1.4.1.954.1.1.1.1.7.7557342 .iso.org.dod.int +ernet.private.enterprises.954.1.1.1.1.7.7557342 VALUE: Not_Noticed + OID: 1.3.6.1.4.1.954.1.1.1.1.8.7557342 .iso.org.dod.internet.privat +e.enterprises.954.1.1.1.1.8.7557342 VALUE: 32303036303931303233353531 +32 OID: 1.3.6.1.4.1.954.1.1.1.1.9.7557342 .iso.org.dod.internet.priva +te.enterprises.954.1.1.1.1.9.7557342 VALUE: OID: 1.3.6.1.4.1 +.954.1.1.1.1.10.7557342 .iso.org.dod.internet.private.enterprises.954 +.1.1.1.1.10.7557342 VALUE: OID: 1.3.6.1.4.1.954.1.1.1. +1.11.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.11 +.7557342 VALUE: CTMERRJOBNAMECTMERRTest job for unicenter OID: 1.3.6. +1.4.1.954.1.1.1.1.12.7557342 .iso.org.dod.internet.private.enterprise +s.954.1.1.1.1.12.7557342 VALUE: OID: 1.3.6.1.4.1.954 +.1.1.1.1.13.7557342 .iso.org.dod.internet.private.enterprises.954.1.1 +.1.1.13.7557342 VALUE: TEST_GROUP OID: 1.3.6.1.4.1.954.1.1. +1.1.14.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1. +14.7557342 VALUE: TEST_APPLICATION OID: 1.3.6.1.4.1.954.1.1.1.1.1 +5.7557342 .iso.org.dod.internet.private.enterprises.954.1.1.1.1.15.75 +57342 VALUE: TEST_JOB_NAME + OID: 1.3.6.1.4.1.954.1.1.1.1.16.7557342 .iso.org.dod.interne +t.private.enterprises.954.1.1.1.1.16.7557342 VALUE: tcenshpat1'; my @matches = $data =~ m/VALUE: (.+?) OID/g; print "$_\n" for @matches;

    Output:

    I 7557342 tcenshpat1 TEST_FILE_NAME 3030303036 V Not_Noticed 3230303630393130323335353132 CTMERRJOBNAMECTMERRTest job for unicenter TEST_GROUP TEST_APPLICATION TEST_JOB_NAME

    I used an array to hold the matches (I hope this qualifies as a "separate variable" in your OP). See perlre for information on regular expressions. You can get the command line parameters from @ARGV (see perlvar).

      Thanks so much!!!!!!

      It's working, I had the @ARGV stuff but not much else.

      Thanks again!
Re: Parsing and pushing
by borisz (Canon) on Sep 19, 2006 at 15:31 UTC
    # your SNMP data must be in $_ my @d = /\bVALUE:(.*?)OID:/g;
    Boris
Re: Parsing and pushing
by caelifer (Scribe) on Sep 19, 2006 at 17:35 UTC
    I'm sure you would like to preserve OIDs as well. Thus I think a perl hash would be a better data structure for the task, i.e. assuming your SNMP string is in $_
    my %oids = map { $1 => $2 if (m/^: (.+?) VALUE: (.+)/) } do { my @a = split /OID/; shift @a; @a }; use Data::Dumper qw(Dumper); print Dumper(\%oids);
    The result looks as following:
    $VAR1 = { '1.3.6.1.4.1.954.1.1.1.1.6.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.6.7557342' => 'V ', '1.3.6.1.4.1.954.1.1.1.1.5.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.5.7557342' => '3030303036 ', '1.3.6.1.4.1.954.1.1.1.1.14.7557342 .iso.org.dod.internet.pr +ivate.enterprises.954.1.1.1.1.14.7557342' => 'TEST_APPLICATION ', '1.3.6.1.4.1.954.1.1.1.1.16.7557342 .iso.org.dod.internet.pr +ivate.enterprises.954.1.1.1.1.16.7557342' => 'tcenshpat1', '1.3.6.1.4.1.954.1.1.1.1.3.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.3.7557342' => 'tcenshpat1 ', '1.3.6.1.4.1.954.1.1.1.1.13.7557342 .iso.org.dod.internet.pr +ivate.enterprises.954.1.1.1.1.13.7557342' => 'TEST_GROUP ', '1.3.6.1.4.1.954.1.1.1.1.4.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.4.7557342' => 'TEST_FILE_NAME + ', '1.3.6.1.4.1.954.1.1.1.1.7.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.7.7557342' => 'Not_Noticed ', '1.3.6.1.4.1.954.1.1.1.1.9.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.9.7557342' => ' ', '1.3.6.1.4.1.954.1.1.1.1.8.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.8.7557342' => '3230303630393130323335353 +132 ', '1.3.6.1.4.1.954.1.1.1.1.11.7557342 .iso.org.dod.internet.pr +ivate.enterprises.954.1.1.1.1.11.7557342' => 'CTMERRJOBNAMECTMERRTest + job for unicenter ', '1.3.6.1.4.1.954.1.1.1.1.1.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.1.7557342' => 'I ', '1.3.6.1.4.1.954.1.1.1.1.10.7557342 .iso.org.dod.internet.pr +ivate.enterprises.954.1.1.1.1.10.7557342' => ' ', '1.3.6.1.4.1.954.1.1.1.1.12.7557342 .iso.org.dod.internet.pr +ivate.enterprises.954.1.1.1.1.12.7557342' => ' ', '1.3.6.1.4.1.954.1.1.1.1.15.7557342 .iso.org.dod.internet.pr +ivate.enterprises.954.1.1.1.1.15.7557342' => 'TEST_JOB_NAME + ', '1.3.6.1.4.1.954.1.1.1.1.2.7557342 .iso.org.dod.internet.pri +vate.enterprises.954.1.1.1.1.2.7557342' => '7557342 ' };

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://573748]
Approved by wazzuteke
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (2)
As of 2021-10-28 22:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My first memorable Perl project was:







    Results (96 votes). Check out past polls.

    Notices?