Introduction
Linux is becoming more and more prominent in the networking industry. Many of us come from a mixed background and have varying levels of knowledge of Linux. I’ve been around Linux for a long time but really never got beyond the very most basic stuff. Looking back, I wish I had spent some more time learning Sed, Awk, regex, and Bash etc. I was doing some labs over at NRE Labs (great labs), and wanted to highlight some of the things I learned.
Appending To a File With Cat
Sometimes you want to append something quickly to a file or send several lines of text to a Linux command. That can be done using “here documents“.
First, look at this small configuration:
daniel@devasc:~/DevAsc$ cat config.txt interface GigabitEthernet0/1 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/2 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/3 switchport mode access switchport access vlan 10 !
Now we want to append another interface to the end of this file. We can do that using cat:
daniel@devasc:~/DevAsc$ cat <<EOT >> config.txt > interface GigabitEthernet0/4 > switchport mode access > switchport access vlan 10 > ! > EOT
After the cat
command, the <<EOT
is a label that means that we want to add things (append), as indicated by the >>
pointing to config.txt
, until we see EOT
.
This is what the file looks like now:
daniel@devasc:~/DevAsc$ cat config.txt interface GigabitEthernet0/1 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/2 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/3 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/4 switchport mode access switchport access vlan 10 !
This saved us from opening an editor and doing the change there. Perhaps not a huge time saver, but yet somewhat more convenient.
Replacing Text With Sed
Sed is very useful when you want to search for a pattern in a file and replace it with something else. We have our existing configuration file:
daniel@devasc:~/DevAsc$ cat config.txt interface GigabitEthernet0/1 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/2 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/3 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/4 switchport mode access switchport access vlan 10 !
Now we have another device where the interface naming is slightly different. Instead of GigabitEthernet0/1
, the name would be GigabitEthernet1/0/1
. Sed can help us edit our file. First we need to understand what pattern to replace. We want to replace 0/
with 1/0/
. We will use Sed to do this.
daniel@devasc:~/DevAsc$ sed 's/0\//1\/0\//g' config2.txt interface GigabitEthernet1/0/1 switchport mode access switchport access vlan 10 ! interface GigabitEthernet1/0/2 switchport mode access switchport access vlan 10 ! interface GigabitEthernet1/0/3 switchport mode access switchport access vlan 10 ! interface GigabitEthernet1/0/4 switchport mode access switchport access vlan 10 !
This looks good! So now let’s explain what’s going on.
We run Sed with s
for substitute. The first /
is where the string starts that we want to replace. Because we want to replace 0/
, and / is a special character, we need to escape it with a \
first, ending up with /0\/
.
Then there is another /
, indicating the start of the string that should replace 0/
. Once again, we need to escape the /
, so we end up with /1\/0\/
.
Finally, the final /
ends the string that we are using to replace the previous string. We also supply g
, for global, to replace all occurences.
Note that we haven’t actually edited the file yet:
daniel@devasc:~/DevAsc$ cat config2.txt interface GigabitEthernet0/1 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/2 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/3 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/4 switchport mode access switchport access vlan 10 !
This was a testrun to see if our regex worked out. If we want to actually change the file, we need to use the -i
flag:
daniel@devasc:~/DevAsc$ sed -i 's/0\//1\/0\//g' config2.txt daniel@devasc:~/DevAsc$ cat config2.txt interface GigabitEthernet1/0/1 switchport mode access switchport access vlan 10 ! interface GigabitEthernet1/0/2 switchport mode access switchport access vlan 10 ! interface GigabitEthernet1/0/3 switchport mode access switchport access vlan 10 ! interface GigabitEthernet1/0/4 switchport mode access switchport access vlan 10 !
Suppressing Output From Scripts
There are times when you want to run a script and have no output at all. Linux has standard output (stdout
) and standard error (stderr
) where stdout is 1
and stderr is 2
. These are actually file descriptors but that’s beyond the scope of this post.
For example, using echo
, this is output to stdout
:
daniel@devasc:~/DevAsc$ echo "hello world" hello world
When you try to do something raising an error, such as trying to copy a file that is non-existant, that is output to stderr
:
daniel@devasc:~/DevAsc$ cp config3.txt config4.txt cp: cannot stat 'config3.txt': No such file or directory
Now, using an example from NRE Labs, you want to run this script silently:
git checkout master > /dev/null 2>&1 git merge change-124 master > /dev/null 2>&1 git checkout change-123 > /dev/null 2>&1
This script is running Git to merge a change, but it’s doing it silently. Let’s explain how this works.
The >
indicates that stdout
should be redirected to /dev/null
, basically into oblivion. Note that when we don’t put a file descriptor, stdout
is assumed, it could have written explicitly as 1>
.
Then we have the 2>&1
part where we are redirecting 2
, that is stderr
, to the same place as 1
(stdout), as referenced by &1
, namely /dev/null
.
The effect is that both 1
and 2
are sent to /dev/null
and the script is run silently.
Summary
A basic knowledge of Linux is useful in almost any IT role. Not everyone, including myself, have a strong background in Linux. In this post we learned some useful commands to edit files, replace text, and run scripts silently. See you in the next post.
Yet another useful post. Well-done
Thanks!