Command Line Bash
Examples of using Bash on the command line
Compare two unsorted lists
# Looks for all lines in `second-file.txt`, which don't match
# any line in `first-file.txt`.
grep -Fxv -f first-file.txt second-file.txt
Loop over an array of ints
for i in {1,2,3}; do echo ${i}; done
for i in {1,2,3}; do echo "$i"; done
Loop over a range of ints
for i in {1..10}; do echo ${i}; done
for i in {1..10}; do echo "$i"; done
Loop over an array of strings
for s in a b c d e; do echo "$s"; done
Run the last command with substituion
Substitute the first occurence
^foo^bar
Substitute all occurences
!!:gs/foo/bar/
#
# !! - reruns the last command. You can also use !-2 to run two commands ago, !echo to run the last command that starts with echo
#
# :gs says to do a global (all instances) search/replace. If you wanted to just do replace the first instance, you would use ':s'
#
# Finally, /foo/bar/ says to replace foo with bar
Run command on an interval
Every 1 seconds
while sleep 1; do [cmd]; done
while sleep 1; do echo "Hello"; echo "World"; done
while true; do clear; ./runScript.sh; sleep 1; done
Every 1 milliseconds
while sleep 0.1; do [cmd]; done
while sleep 0.1; do echo "Hello"; done
Run command on interval with incrementing variable
Every 1 seconds
i=1; while true; do echo "out - $i"; ((i++)); sleep 1; done
While loop with a multi-line string
Use a Here String to effectively create a for loop with multiline data
while read i
do
echo "test$i"
done <<< 'a
b
c'
AWK
Print the 5th column
echo "This is a string made of columns" | awk '{print $5}'
Print the 5th column, with quotation marks, using printf
echo "This is a string made of columns" | awk '{printf("\"%s\"", $5);}'
Print all columns after, and including, the 5th column
echo "This is a string made of columns" | awk '{ s = ""; for (i = 5; i <= NF; i++) s = s $i " "; print s }'
Change the field seperator
echo "This\is\a\string\with\a\different\seperator" | awk -F'\' '{print $4}'
Pad filename with zeros
Change spaces to "-" and pad the number at the end with 4 zeros
echo "This is a file name 3" | awk '{printf "%s-%s-%s-%s-%s-%05d", $1, $2, $3, $4, $5, $6}'
Grep
Command | Description |
---|---|
make run | grep --line-buffered -i "thing1\|thing2" |
Grep a stream of data for thing1 or thing2 , case-insensitively |