Vasyl Stepulo
Vasyl Stepulo

Reputation: 1603

Extracting snmpdump values (with an exact MIB) from a shell script

I have a a some SNMP dump:

  1.3.6.1.2.1.1.2.0|5|1.3.6.1.4.1.9.1.1178
  1.3.6.1.2.1.1.3.0|7|1881685367
  1.3.6.1.2.1.1.4.0|6|""
  1.3.6.1.2.1.1.5.0|6|"hgfdhg-4365.gfhfg.dfg.com"
  1.3.6.1.2.1.1.6.0|6|""
  1.3.6.1.2.1.1.7.0|2|6
  1.3.6.1.2.1.1.8.0|7|0
  1.3.6.1.2.1.1.9.1.2.1|5|1.3.6.1.4.1.9.7.129
  1.3.6.1.2.1.1.9.1.2.2|5|1.3.6.1.4.1.9.7.115

And need to grep all data in first string after 1.3.6.1.2.1.1.2.0|5|, but not include this start of the string in grep itself. So, I must receive 1.3.6.1.4.1.9.1.1178 in grep. I've tried to use regex:

  \b1.3.6.1.2.1.1.2.0\|5\|\s*([^\n\r]*)

But without any success. If a regular expression, or grep, is in fact the right tool, can you help me find the right regex? Otherwise, what tools should I consider instead?

Upvotes: 1

Views: 234

Answers (2)

Charles Duffy
Charles Duffy

Reputation: 295500

An alternate way to do this is in native shell, without any regexes at all. Consider:

prefix='1.3.6.1.2.1.1.2.0|5|'
while read -r line; do
  [[ $line = "$prefix"* ]] && printf '%s\n' "${line#$prefix}"
done

If your original string is piped into the while read loop, the output is precisely 1.3.6.1.4.1.9.1.1178.

Upvotes: 0

Aaron
Aaron

Reputation: 24812

With GNU grep +PCRE support, you can use Perl's \K flag to discard part of the matched string :

grep -Po "1\.3\.6\.1\.2\.1\.1\.2\.0\|5\|\K.*"

-P enables Perl's regex mode and -o switches output to matched parts rather than whole lines.

I had to escape the characters that have special meaning in Perl regexs, but this can be avoided as 123 suggests, by enclosing the characters to interpret literally between \Q and \E :

grep -Po "\Q1.3.6.1.2.1.1.2.0|5|\E\K.*"

I would usually solve this with sed as follows :

sed -n 's/1\.3\.6\.1\.2\.1\.1\.2\.0|5|\(.*\)/\1/p'

The -n flag disables implicit output and the search and replace command will remove the searched prefix from the line, leaving the relevant part to be printed.

The characters that have special meaning in GNU Basic Regular Expressions (BRE) must be escaped, which in this case is only .. Also note that the grouping tokens are \( and \) rather than the usual ( and ).

Upvotes: 3

Related Questions