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

This then allows us to use lot’s of new commands. To see the new commands type in “man”:

((              evaluate a numeric test expression          The IOS shell
[[              evaluate a logical test expression
cat             output data from a pipe or file to the terminal
compatibility   compatibility information on
control         control constructs in
cut             edit piped output
echo            echo arguments to the terminal
expressions     usage of expressions in
false           return false in while or if expressions, and set the result
fetch           return values from the configuration database
for    for loops
functions function facility
grep            search for regular expressions in piped output or files
head            print the first lines in the input
if-else 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 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
wc              count lines, words, and chars
while           iterate while an expression is TRUE


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


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


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
 bgp log-neighbor-changes

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#sh run | sec router ospf
router ospf 100

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 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!


  1. JAYDEEP August 2, 2015
  2. Unknown October 2, 2015