BASH

Go immediately to $EDITOR

ctrl-x, e

Most commonly used commands

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

Delete files that are not extension


rm !(*.foo|*.bar|*.baz)

Find, delete empty directories


find . -type d -empty -exec rmdir {} \;

Show your shell from a port


script -qf | tee >(nc -kl 5000) >(nc -kl 5001) >(nc -kl 5002)

Replace filename spaces with underscores


# util-linux-ng
rename " " _ *

Search for Unicode use in a tree


.. todo I think this could be done with one 'find' command, no need to loop...

for FILE in $(find . -type f) ; do echo File: ${FILE}; perl -ane '{ if(m/[[:^ascii:]]/) {print  } } ' ${FILE}; done

"Press any key to continue"


read -sn 1 -p "Press any key to continue..."

Conditional Expressions


code desc
-a file file exists
-d file file exists and is a directory
-r file file exists and is readable
-w file file exists and is writeable
-x file file exists and is executable
-z string true if length of string is zero

Process Substitution

A temporary named pipe

diff <(grep lines file1) <(grep lines file2)
thing --output >(gzip > output.txt.gz)

Syntax cheatsheet

fun () { echo "totes a function"; exit 1 ; } #Don't forget trailing colon if one line

case expression in
       pattern1 )
       	statements ;;
       pattern2 )
       	statements ;;
       ...
esac

# for VARIABLE in 1 2 3 4 5
for VARIABLE in {1..5}
do
       	command1
       	command2
       	commandN
done

set

https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

flag desc
-e exit if a pipeline returns non-zero
-o pipefail return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status
-o posix match POSIX standard behaviour (https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html#Bash-POSIX-Mode)
-n read commands but do not execute (used for checking syntax)
-u treat unset variables and parameters as an error when performing parameter expansion
-x print trace of commands as they are executed
-C prevent output redirection using ‘>’, ‘>&’, and ‘<>’ from overwriting existing files

Using regex for variable testing


if [[ $HOSTNAME =~ host[0-9].example.com ]]; then
    echo "yay"
fi

Temporary directory/file


mktemp -d

Show the functions declared in the shell

declare -F
# on ancient shells:
typeset -F

Use heredocs

cat <<EOM > file.out
blah
blah
EOM

Quit without saving history

unset HISFILE && exit

Regex change over files returned from grep


macOS

grep -l ... | xargs -I% sed -i".bkp" -e "s/old/new/" %

I/O Redirection


description
&> Redirect both stderr and stdout
1> Redirect stdout
2> Redirect stderr
2>&1 Redirect stderr to stdout