IOS shell processing, variables and router-ids


IOS 15.1(4)M brought some nice cool new stuff with it. With it was shell processing, which opens up a plethora of linux commands.

Enabling shell processing on Cisco IOS

To enable shell processing we use the command:
R17(config)#shell processing full
R17(config)#
This then allows us to use lot's of new commands. To see the new commands type in "man":
R17#man
((              evaluate a numeric test expression
IOS.sh          The IOS shell
[[              evaluate a logical test expression
cat             output data from a pipe or file to the terminal
compatibility   compatibility information on IOS.sh
control         control constructs in IOS.sh
cut             edit piped output
echo            echo arguments to the terminal
expressions     usage of expressions in IOS.sh
false           return false in while or if expressions, and set the result
fetch           return values from the configuration database
for             IOS.sh for loops
functions       IOS.sh function facility
grep            search for regular expressions in piped output or files
head            print the first lines in the input
if-else         IOS.sh if command
interface       print interfaces that match the argument
let             evaluate a numeric expression, and set the result
man             print information for builtins
more            page piped output to the terminal
nl              number the lines in the input
null            ignore the input
printf          output formatted data to the terminal
quoting         IOS.sh quoting facility
read            read input into variables
scripting       how to script the IOS CLI
set_oper        set operational values
sleep           pause execution of the terminal
sort            sort the input
tail            print the tail of the input
true            return true in while or if expressions, and set the result
uname           print system information
variables       usage of variables in IOS.sh
wc              count lines, words, and chars
while           iterate while an expression is TRUE

R17#

Using grep to limit output

Now that we have enabled shell processing, we can use "grep":
R17#sh run int lo0 | grep 'address'
 ip address 123.17.17.17 255.255.255.255

R17#
This gives us the ip address.

Using cut to get an IP address

We can then use "cut" to return just the numbers:
R17#sh run int lo0 | grep 'address' | cut -c 13-24
123.17.17.17

R17#
This can be useful, as we can turn this command into a variable.

Why would we do this? Well, for certain things, such as setting router-ids for routing protocols, we would usually hard-code this to be the loopback interface's IP address. When switching from one router to the next it's easy to forget what the IP address is. You can always use "do sh run int lo0", but then it's easy to lose the flow, having it set as a variable makes life much easier.

Creating a variable in IOS shell

To create a variable we use the command "variable=variableoutput":
R17#varMyLo0=`sh run int lo0 | grep 'address' | cut -c 13-24`
Here, we create a variable called "varMyLo0". The backticks set the output of the command as the actual variable (the IP address).

Using a variable to set a router-id

We can then use this variable when configuring the device:
R17(config)#router bgp 100
R17(config-router)#bgp router-id $varMyLo0
R17(config-router)#do sh run | sec bgp
router bgp 100
 bgp router-id 123.17.17.17
 bgp log-neighbor-changes
R17(config-router)#exit
If we do this again, just to prove it works, for OSPF, we can see that OSPF is not running, we can create the OSPF process, and, again, use the variable to set the router ID:
R17#sh run | sec router ospf
R17#conf t
R17(config)#router ospf 100
R17(config-router)#router-id $varMyLo0
R17(config-router)#end
R17#sh run | sec router ospf
router ospf 100
 router-id 123.17.17.17
R17#
So, now, you don't need to keep looking at the "sh run int lo0" to remind yourself of the IP address, and type it in manually, or copy and paste it.

If the IP address is shorter (say 123.1.1.1) then the cut would be shorter (cut -c 13-21).

This could save some time during the exam!

If you have any good shell processing tips, then feel free to comment with them!

CCIE #49337, author of CCNA and Beyond, BGP for Cisco Networks, MPLS for Cisco Networks, VPNs and NAT for Cisco Networks.

Related Posts

Previous
Next Post »

2 comments

comments
JAYDEEP
2 August 2015 at 09:41 delete

Hey this is very interreseting and useful feature, however I am unable to see any more documentation on this rather than hardware support only on 6500, can you let me know further on this jaydeep_makwana@yahoo.com

Reply
avatar
2 October 2015 at 07:38 delete

I find it more streamlined to use cut with field delimiters of white space. Example below:

conf t
shell processing full
end
L0=`sh run int l0 | grep address | cut -d ' ' -f 4`
echo $L0

Reply
avatar