The following are some concise bash programming skills which we may need in our daily programming work.
1. Check status of command execution
The usual way:
echo abcdee | grep -q abcd if [ $? -eq 0 ]; then echo "Found" else echo "Not found" fi |
Concise way:
if echo abcdee | grep -q abc; then echo "Found" else echo "Not found" fi |
Of course you can remove if...else with following code
[Sun Nov 04 05:58 AM] [kodango@devops] ~/workspace $ echo abcdee | grep -q abc && echo "Found" || echo "Not found" Found
2. Redirect standard out and standard error to /dev/null
The usual way:
grep"abc" test.txt 1>/dev/null 2>&1
The wrong way:
grep"abc" test.txt 2>&11>/dev/null
The concise way:
grep"abc" test.txt &>/dev/null
3. Use of awk
Take an actual example. Get Xen DomU's ID.
The usual way:
sudo xm li |grep vm_name |awk'{print $2}'
The concise way:
sudo xm li |awk'/vm_name/{print $2}'
4. Concatenate all lines of a file with comma(,)
Assume file contents are
[Sat Nov 03 10:04 PM] [kodango@devops] ~/workspace $ cat /tmp/test.txt 1 2 3
Using sed command:
[Sat Nov 03 10:14 PM] [kodango@devops] ~/workspace $ sed ':a;$!N;s/\n/,/;ta' /tmp/test.txt 1,2,3 |
The concise way:
[Sat Nov 03 10:04 PM] [kodango@devops] ~/workspace $ paste -sd, /tmp/test.txt 1,2,3
5. Filter duplicated line
Assume file contents are:
[Sat Nov 03 10:16 PM] [kodango@devops] ~/workspace $ sort /tmp/test.txt 1 1 2 3
The usual way:
[Sat Nov 03 10:16 PM] [kodango@devops] ~/workspace $ sort /tmp/test.txt | uniq 1 2 3 |
The concise way:
[Sat Nov 03 10:16 PM] [kodango@devops] ~/workspace $ sort /tmp/test.txt -u 1 2 3
6. grep to search a word
Assume each line of a file contains an IP address. For example:
[Sat Nov 03 10:20 PM] [kodango@devops] ~/workspace $ cat /tmp/ip.list 10.0.0.1 10.0.0.12 10.0.0.123
Using grep to find the IP 10.0.0.1, the usual way:
[Sat Nov 03 10:22 PM] [kodango@devops] ~/workspace $ grep '10.0.0.1\>' /tmp/ip.list 10.0.0.1
The concise way(Actually this way is not necessary more concise, just want to explain that -w is useful)
[Sat Nov 03 10:23 PM] [kodango@devops] ~/workspace $ grep -w '10.0.0.1' /tmp/ip.list 10.0.0.1 |
7. Use of $1,$2...
Assume we just want to use $2,$3, not $1, the usual way:
shift
echo"$@"
The concise way:
echo"${@:2}"
8. Default value of a parameter
If we don't provide a value for one one parameter, we may give it a default value, we can do it like:
arg=$1 if [ -z "$arg" ]; then arg=0 fi |
The concise way:
arg=${1:-0}
9. Use of - in bash
If we want to search whether a string contains -i, we may use:
[Sat Nov 03 10:45 PM] [kodango@devops] ~/workspace $ echo 'abc-i' | grep "-i" Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information. [Sat Nov 03 10:45 PM] [kodango@devops] ~/workspace $ echo 'abc-i' | grep "\-i" abc-i |
The concise way:
[Sat Nov 03 10:45 PM] [kodango@devops] ~/workspace $ echo 'abc-i' | grep -- -i abc-i
10. Assign formatted output of printf to an variable
If we want to convert a decimal number to its hex format, the usual way:
[Sat Nov 03 10:55 PM] [kodango@devops] ~/workspace $ var=$(printf '%%%02x' 111) |
The concise way:
[Sat Nov 03 10:54 PM] [kodango@devops] ~/workspace $ printf -v var '%%%02x' 111 |
Here is the help of printf
[Sat Nov 03 10:53 PM] [kodango@devops] ~/workspace $ help printf | grep -A 1 -B 1 -- -v printf: printf [-v var] format [arguments] Formats and prints ARGUMENTS under control of the FORMAT. -- Options: -v var assign the output to shell variable VAR rather than display it on the standard output
11. Print some lines of a file
Print the first line:
head-1 test.txt
Print the second line:
sed-n'2p' test.txt
Print 2nd to 5th line
sed -n '2,5p' test.txt |
Print the ;ast second line
$ tail-2 test.txt |head-1
$ tac test.txt |sed-n'2p'
12. Use let and (( )) to do arithmatic calculation
Do ++ operation,the usual way:
a=1
a=`expr a + 1`
The concise way:
a=1 let a++ let a+=2 |
13. Get real filename of a softlink
You may do it like :
[Sat Nov 03 11:12 PM] [kodango@devops] ~/workspace $ ls -l /usr/bin/python | awk -F'->' '{print $2}' | tr -d ' ' /usr/bin/python2
If you know a command named readlink. Then
[Sat Nov 03 11:13 PM] [kodango@devops] ~/workspace $ readlink /usr/bin/python /usr/bin/python2
14. Get ASCII code of a character
[Sat Nov 03 11:14 PM] [kodango@devops] ~/workspace $ printf '%02x' "'+" 2b [Sat Nov 03 11:30 PM] [kodango@devops] ~/workspace $ echo -n '+' | od -tx1 -An | tr -d ' ' 2b |
15. Clear contents of a file
The usual way:
echo""> test.txt
The concise way:
> test.txt
|
More to come...