Thursday, August 18, 2016

Sed one-liners

I may occasionally publish small notes on clever commands I learn about.  Putting it here helps me store knowledge that my shoddy personal data management practices might otherwise lose...  One such note is a one-line sed command to print out the Linux interface(s) which handles the default route:
sed -n 's/\(^[^\t]*\)\t00000000.*/\1/p' /proc/net/route
An explanation, from left to right: Don't print each line (-n), prepare for a substitution ('s/), look for a string of non-tab characters at the beginning of the line (^[^\t]*) while saving the results (the \( and \) parts surrounding that), followed by a single tab and a string of eight 0s (\t00000000), followed by anything to gobble up the rest of the line (.*), then substitute it all with the non-tabs string saved earlier (/\1/), and print it (p').  The eight 0s represent the default route of 0.0.0.0/0.

To be really specific the eight 0s specify a route for a network of undetermined size starting at 0.0.0.0.  For the true default route, I should also check for a mask of 00000000, as OpenVPN sometimes adds two net routes (0.0.0.0/1 and 128.0.0.0/1) to avoid the need to replace the existing default route.  This command will find anything starting at 0.0.0.0 as a default route, which may or may not be what you want...  In reality, since 0.0.0.0/8 is reserved, if a route starts at zero, it's pretty defaulty anyway..

Labels: , ,

1 Comments:

Blogger Pete said...

To make it more obtuse, one can substitute the curly-bracket count of 0s instead of a string of eight 0s. In other words:

sed -n 's/\(^[^\t]*\)\t0\{8\}.*/\1/p' /proc/net/route

That saves a whopping two characters in the regex and makes it look even more like black magic.

February 10, 2017 at 6:45 AM  

Post a Comment

Subscribe to Post Comments [Atom]

<< Home