Linux Commands

From TheBeard Science Project Wiki
Jump to: navigation, search

Updated 8/2/2020

exit #TO PREVENT EXECUTION OF THIS FILE

su <user> - switch user
	-c 'command' - execute a command as user
	-l - setup environment like user instead of keeping your own 
gksudo - use for graphical applications
	-u <user> - do command as user
	-k - preserve environment variables
	-D <text> - name of program to display
	-m <text> - replace whole message with text
	-p - print password to stdout
man <command> - searches manual
	-k <keyword> - search man for keyword
; - separate multiple commands
# comment
: - produces no output. Can be used as a "non-value" like:
	while :;do something forever;done
: '<comments with new-line characters>' - allows multiple-line comments
shift + page up or down - scroll
-- - signifies end of command and beginning of arguments (or last argument)
ctrl + c - kill process (SIGINT)
ctrl + \ - kill and core dump (SIGQUIT)
ctrl + z - suspend process (SIGTSTP)
ctrl + t - send SIGINFO
ctrl + u - clear a line
ctrl + l - clear terminal
ctrl + alt + f1 - bypass gui
ctrl + alt + f7 - return to gui
ctrl + d - logout (in GUI) or EOF in terminal
esc + . - insert all parameters from last command
ctrl + alt + e - expand all string expansions and show it before executing it
ctrl + r - search command history
tab - auto-complete
hold shift during boot to get grub menu
put commands in .bashrc in home dir to run command at login
gconf-editor - "registry" for Gnome
	use to remove desktop folders from fedora. go to /apps/nautilus/desktop.
dconf-editor - similar to gconf-editor
alacarte - graphical gnome menu editor
cheese - webcam program
webcamoid - better webcam program
find <location> -name <file> - look for file
	-iname - case insensitive (use instead of -name)
	-type <type> - d=directory, f=file, l=link, b=block, c=character
	-maxdepth <#> - number of directories down to look
	-regex <pattern> - look for pattern (matches whole file path, not just name)
	-iregex - case insensitive regex
find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n - list directories and the number of files they contain
find /u1/database/prod/arch -type f -mtime +3 -exec rm {} \; - find files that are older than 3 days and remove them
locate - search
	-c - count instead of output
	-i - ignore case (not case sensitive)
	-r - regex
eog - graphical image/picture viewer
VBoxManage - virtual box manager
	modifyhd --compact <file.vdi> - compact a dynamically expanding disk
	list runningvms
	list vms
	startvm --type headless "VM Name"
pwd - print working directory
ls - alternative to dir
	-a - show hidden
	-l - more info
	-R - recursive
	-Q - enclose entries in double quotes
	-d - list only directories
	-h - human readable file size
	-t - sort by most recent modification date
	-r - reverse order (reverse alphabetical, or reverse mod time if used with -t)
	-1 - list in one column
	-i - list inodes
	-f1 - can list directory with too many files
pushd - remember current directory (need to do "pushd ." the first time you use it per session)
popd - navigate to remembered directory
file <file> - list file info
	-i - shows filetype and charset
stat <format> <file> - list file info (format if optional)
	%a - permissions in octal
	%s - size
getfacl <file/dir> - get ACL and umask info
setfacl -d <file/dir> - set ACL for default umask
	-m <perm> - add ACL (ie. u::rwx [can do o::- to remove])
hachoir-metadata - show metadata of file
mv <file> <destination> - move/rename
	<file> <newfile> - can be used to change name of file
	-n - no clobber (do no overwrite file if it already exists)
	-u - update: only move if source is newer than destination
	-f - force
cp - copy
	-r - recursive
	-f - force
	-i - interactive
	-l - link
	-n - no clobber (do no overwrite file if it already exists)
	-u - update: only copy if source is newer than destination
	-p - preserve permissions
	-s - symbolic link
rm - remove/delete
	-r - recursive
	-f - force
	-i - interactive
rmdir - delete directory (must be empty)
mkdir - make directory
	-p - create parents (of dir1 does not exist, running mkdir -p dir1/dir2 will create it)
ln -s <file> [<link name>] <dir> - make a symbolic link of a file in this dir
tar <options> <archive.ext> <backupstuff> - archiving tool (combine)
	-p - preserve permissions
	-z - use gzip compression
	-j - use bzip2 (add .bzip2 ext)
	-c - create
	-x - extract
	-f - file to create/extract (must be last option as in -pjcf)
echo - print something
	-e - interpret escape characters (ie. \\, \n, \r, \b, \t, \xHH; see more under "escape characters" in this file)
	-n - no trailing noe-line character
	echo 'message' | smbclient -M windows_box - Send popup to windows machine (off by default in XP sp2)
	echo "error" >&2 - send "error" with rest of error output
	echo $(( 100+(`od -An -N2 -i /dev/random` )%(1000-100+1) )) - random # between 100-1000
less - view text file
	-i - ignore case in searches
	PageUp or Ctrl+b - page up
	PageDown or Ctrl+f - page down
	g - top of page
	G - bottom of page
	/<pattern> - search for pattern
more - old line-by-line file reader
cat - print contents of text file
	-n - print with line numbers
	-b - number non-blank lines
	-v - show non-printable characters
	- - take from standard input (ie. echo "hello" | cat -)
tac - print lines in reverse order (similar to cat)
read - read user input (ie. 'read answer' puts user input into $answer, also 'read a b c' takes first 3 words, be careful because $c will contain any additional input, so you can do 'answer a b c x' if you only want 3 words so that $x will contain any junk input)

strings <file> - print any ascii characters in a binary file
<command> > <filename> - writes output of command to file
<command> >> <filename> - appends output of command to file
<command> < <filename> - sends contents of file to command
<command1> | <command2> - feed output of com1 into com2
<command1> |& <command2> - feed stderr and stdout of com1 into com2
|tee <file> - puts output into file and echos
1> <place> - redirect standard output
2> <place> - redirect standard error
2>&1 - redirect error to same place as output after output has been redirected
&> <place> - redirect both stdout and stderr
command < infile > outfile - combinations of redirects
command <(command2) - output of command2 is treated like a file descriptor for command
command >(command2) - output from command that would normally go to a file is redirected to command2
exec 3<>/file - set file as place to redirect 3
	echo hi >&3 - redirect
	3<&-;3>&- - disables
set -o xtrace;exec &>/file - set commands to echo before executing, and redirect all output to file. Good way to log everything you do.
sort -d - sort by alphanumeric
	-u - sort and remove duplicates/repeats/doubles
uniq - show or omit repeat lines (lines must be sorted first)
	-c - count number of occurrences
	-d - only print duplicate lines
	-u - only print unique lines
	-cd - count duplicate lines
	-cu - count unique lines
	-i - ignore case
diff <file1> <file2> - difference between files
	-y - side-by-side output
	--suppress-common-lines - does what it says
basename <string> - strip/trim/cut filename in full pathname (ie. /dir/file --> file)
dirname <string> - strip/trim/cut pathname(ie. /dir/file --> /dir)
head - print the head of the input
	-N - where N is the number of lines
	-cN - where N is the number of characters
	-c-N - where N is the number of characters to cut off at the end
tail - print the tail of the input
	-N - where N is the number of lines (ie. "tail -2")
	-n +N - print all except the last N-1 lines (so to print all lines except the first: "-n +2") 
	-cN - where N is the number of characters
	-c+N - where N is the number of characters to cut off at the beginning
	-f <filename> - continuously watch the bottom of a file. Good for monitoring log files or nohup files.
cut - cut text. Pipe or specify filename (|cut -cN where N represents bytes, or cut -cN file.txt).
	by default, cut will output bytes specified.
	--complement - will output all except specified bytes.
	-cN,M,O - list of bytes
	-cN-M - range of bytes
	-dC -fN - delimiter character C, pull field N (cut -d: -f1 /etc/passwd will give you usernames)
fold - wrap each input line to fit in specified width
	-w N - wrap with a screen width of N columns
	-s - wrap on spaces
aspell - spell checker. Can be used like "cat file.txt|aspell list"

grep specific line: <output> | head -2 | tail -1 | grep <string>
	-r - recursive
	-B<#> -A<#> - display # number of lines before and after pattern
	-E - extended regex
	-e - enter multiple expressions like: -e "EXP1" -e "EXP2"
	-G - basic regex
	-P - perl regex
	-v - show non-matching lines
	-i - ingore case
	-c - count lines instead of output
	-n - include line numbers in output
	-l - list files that contain matching lines
	-L - list files that do not contain matching lines
	-o - print only matching string
	-q - no output
	-s - no error messages
egrep - uses regex. same as grep -E
fgrep - does not use regex
pgrep - grep process tree
grep -i "$1" <<+ - uses everything between the +'s as input.
thing1
thing2
+

sed 's/hello/goodbye/g' - replace
    's/hello/goodbye/g;s/hi/bye/g' - multiple statements (delimited by a ';')
    's/hello/goodbye/n' - replace the nth occurrence
	'/string/ s/hello/goodbye/g' - search first for line that matches 'string' then replace within that line
	'/string1/,/string2/p' - search all lines between tags string1 and string2, then print them
	'/^\s*\?string1/' - match string1 with zero or more spaces before it
	'/^\s*$/d' - delete empty lines
	'/./,$\!d' - delete empty lines at beginning of stream (ie. at top of file)
	NOTE: Non-standard versions of sed may require [[:space:]] instead of \s for whitespace.
	sed -i 's/apple/banana/g' file.txt - replace string in a file  "in place" (changes the file). Use '-i.bak" to save a backup of the original with a .bak extension.
	cat file | sed -n '/string1/,$p' | sed '/string2/,$d' - print all lines between string1 and string2
	(including string1, excluding string2)

awk -F, '{print $3}' file.csv - print 3rd column in comma-delimited file

od -t x1 -w 32 <file-or-output> - display ascii in hex(1byte) width of 32bytes (16 default)
hd, hexdump, xd, xxd - other common hex dump programs
ghex - good graphical hex editor
nl - count line numbers (ie. cat file|nl)

tr - translate (pipe output to tr)
	tr '123' 'abc' - turn 1>a 2>b 3>c in a file (pipe from cat)
	tr '[A-Z]' '[a-z]' - uppercase to lowercase
	tr -d '[0-9]' - delete
	tr -cd '[0-9]' - delete all except these characters
	tr -d '[:print:]\r\n\t' - delete non-printable characters
wc - count length of something
	-c - bytes
	-m - characters
	-l - lines
	-L - length of longest line
	-w - words
exit 0 - exit with normal status
exit 1 - exit with error status
true - produce 0
false - produce 1

dmesg - bootup message dump
last - login log
who - who is currently logged on
w - who is currently logged on and more
finger <user name> - user info
	will show the contents of .plan, .project, and .pgpkey files in home folder
id <user> - user details
users - list of users currently logged on
date - the date
  +%s - epoch time
  +%Y%m%d%H%M%S - Year Month Day Hour Minute Second
  +%Y-%m-%d_%H:%M:%S - character delimited
  +"$Y %m" - quoted to allow space
  +%T - same as %H%M%S
  +%r - 12 hour time
  +%u - day of week
  d=`date +"%F %s"`;dt=`echo $d|awk '{print $1}'`;ep=`echo $d|awk '{print $2}'` - get date and epoch in one date command
cal - display calendar
  -3 - show 3 months (previous, current, next)
  -y - show whole year
dpkg-reconfigure tzdata - set timezone
info - info on things
help - find info for bash built-in commands
free -m - memory info in MB
lshw - list hardware
lspci [-d <vendor>:<device>:<class>] - PCI bus/device info (/proc/bus/pci/*/* and /sys/bus/pci/devices/pci0000::00/*)
	-v, -vv, -vvv - verbose output levels
	-m - display in different format
	-n, -nn - display vendor/device codes (required to use -d option)
	-t - display a tree view of the PCI bus
	-k - display kernel drivers used by each device
	-x, -xxx, -xxxx - hex dump of PCI configurations (displays little-endian, so every 2 bytes are reversed)
	-d <vendor>:<device> - choose which device to query (use -n to get vendor/device codes)
	-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]] - tell it what device to query
setpci - query and configure PCI devices
	-v - verbose
	--dumpregs - dump all config space registers (including human friendly names)
	-O <param>=<value> - set a parameter of the device (-O is capital "O", not zero)
	-d <vendor>:<device> - tell it what device to query/configure (use "lspci -n" to get vendor/device codes)
	-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]] - tell it what device to query/configure
	-O help - list known parameters that can be configured with "-O <param>=<value>" (-O is capital "O", not zero)
lsusb - list USB devices
ipcs -a - list IPC ramdisk usage. Ramdisk is mounted at /run. (IPC: Inter-Process Communication)
lscpu - list CPU info
nm-tool - network device report
df -h - disk space (human readable)
du - file sizes
	-c - print total at the end (pipe to tail -1 to only see total)
	-h - human readable
mount -t <type> -o <option,option...> //server/share /mnt/mountpoint
	-t - type
		cifs - better choice than smbfs
		nfs
	-o - options
		ro - read-only
		rw - read/write
		dev - interpret special devices on filesystem
		nodev - do not interpret devices
		noperm - sometimes fixes permissions problems
		exec - allow execute
		noexec - do not allow execute
		loop - allows an image file to be mounted
		group - allow normal users to mount filesystem if they are in the same group as the device
		owner - allow normal user to mount if they are the owner of the device
		user - allows the ordinary mounting user to mount/unmount the fs
		users - allows all ordinary users to mount/unmount the fs
		remount - attempt to remount
		suid - set uid
		nosuid - do not set uid
		uid=<name or #> - set uid
		guid=<name or #> - set guid
		guest - allow guest access
		username=<name> = username for filesystem
		password=<pass> - password
		credentials=<file> - give credentials file instead of username and password
			format:	username=<name>
					password=<pass>
umount /mnt/mountpoint - unmount the share
showmount <host> - shows hosts with shares or shows shares on <host>
	-a - show all
fuser - identify processes using files or sockets (always use verbose "-v")
	-vm <mount/device> - identify processes using a mount
losetup <target> <source> - setup a loop device, can map a partition from a disk image
	-o <offset> - offset of partition from file (fdisk: sector size * start)
	-d <devfile> - detach loop device (-D to detach all)
	-l - list all attached loop devices
	-r - attach as read-only device
	-f - find next unused loop device
	<target> - usually /dev/loop0 (or 1, 2, etc.)
	<source> - the source file (ie. disk.img)
	Note: after setting up the loop device, you can install a fs on it and mount it
shred -u <file/directory> - securely delete files
srm - securely delete files (part of package "secure-delete")
sfill - securely overwrite empty space. use tune2fs to free up reserved space. (part of package "secure-delete")
sswap - securely overwrite swap partition (part of package "secure-delete")
sdmem - securely overwrite free ram (part of package "secure-delete")
chkrootkit - rootkit scanner
rkhunter - rootkit scanner
clamav - anti-virus
lynis - vulnerability scanner
debsecan - vulnerability scanner
tiger - vulnerability scanner
yasat - audit tool
bleachbit - disk/cache cleaning, drive wiping, etc.
acct - process and login accounting (audit tool)
	accton <filename> - start accounting and log to filename
	accton off - turn accounting off
	dump-acct <filename> - read an accounting file in human readable format
dvdbackup - great dvd ripping on the command line
steghide - steganography tool. hides/embeds data into other data.
ffmpeg -i <input.file> <output.file> - extract audio from video. Extension of output file determines output format.
gtk-recordmydesktop - desktop recorder
kazam - desktop recorder
growisofs -dvd-compat -Z /dev/dvd=/path/to/image.iso - burn image to DVD
convert file1.png file2.txt outfile.pdf - convert several different file formats to pdf pages
fdisk <device> - manipulate partition table (ie. fdisk /dev/sdb; can also provide filename) 
	-l - list disks (pipe to grep "^Disk" for sleekness)
	echo -e "n\np\n1\n\n\n\nw\n" | fdisk <devname> - automatically create partition
sync - write changes to disk (do 'cat /proc/meminfo|grep Dirty' to watch progress)
dd if=inputfile of=outputfile bs=4M count=4 seek=2 conv=notrunc,noerror
	bs - block size
	count - copy only N blocks
	seek - skip N blocks at start of output (where you are writing to)
	skip - skip N blocks at start of input (where you are reading from)
	notrunc - do not truncate
	noerror - no halt on error
	status=progress - display progress as dd runs
	kill -USR1 $(pgrep ^dd) - send USR1 signal to dd to get output of its progress (run this from another terminal or with dd running in the background)
ddrescue <source> <destination> [<logfile>] - dd for damaged drives (from package "gddrescue")
	-r <n-retries> - number or retries per block
	-v - verbose
fsck <device> - check UNMOUNTED filesystem
hdparm <option> <device> - hard disk information
	-t - benchmark transfer rate
	-C - Check the state of a device
	-g - show disk geometry
	-y - Force the drive into standby (spin down)
	-f - Sync and flush buffer cache
	-F - Flush the on-drive write cache
	-S[0-240] - Set disk timeout (spin down). Number is in seconds times 5. (eg. -S120 is 10 minutes)
iotop -botqqq - I/O monitoring of disk read/write. If you want to write the output to a log file, place the file in a ram disk (tmpfs) to prevent disk usage.
	-b - batch (continuously log)
	-o - only show active I/O
	-t - timestamp
	-qqq - quiet. No header or summary info.
iostat -m -p <dev1>,<dev2>,... - show I/O statistics
tune2fs <option> <device> - manipulate filesystem
	-m <#> - change % of reserves blocks on partition (set to 0 to maximize storage space)
	-l  - show extensive filesystem info
	-j - add journal
	-L <label>
wipefs <device> - wipe filesystem signature. Alone, it shows a table of offsets of signatures on device.
	-o <0x#> - offset of signature to delete
	-a - erase all signatures
	-n - dry run
addpart <device> <#> <start> <length> - add a partition (ie. addpart /dev/sdb 1 0 2048)
	start - start point
	length - length in 512 byte blocks
	!still don't know how to write table to disk!
delpart <device> <#> - delete partition (ie. delpart /dev/sdb 1)
mkfs <device> - make a file system
	-m <#> - % of reserves blocks on partition (set to 0 to maximize storage space)
	-t <type> - ext2, ext3, ext4, msdos, vfat
	-L <label>
	-j - create journal
	-c - check for bad blocks before write
	-q - quiet
blkid - list file systems
lsblk - list file systems in a tree format
mkswap <file> <bytes> - make the file into a swap file. follow it with 'sync' command to finalize.
mkswap <device file> - make a partition into swap space. Partition but be "Linux swap / Solaris" type.
swapon <file> - initialize the swap file. To make permanent, add swap to fstab (/dev/sda2 swap swap defaults 0 0).
badblocks -s /dev/sda - test main drive for bad blocks
ntfsprogs - a collection of ntfs tools for working with and fixing ntfs.
ntfsfix <device> - one of the tools in ntfsprogs. very useful.

dmidecode - view ALL hardware info
uname -a - kernel/system info
hostname - show hostname of system
hostname <name> - temporarily change hostname to <name>
	-f - show fqdn of system
arch - system architecture
route - manage routing table
route add -net 0.0.0.0 netmask 0.0.0.0 gw <gtwy-addr> - set default gateway
route del <route> - deletes route
routel - route with nicer output (more verbose)
routef - flush routing table
ldd <file> - show library dependencies of a program file
vbetest - test screen resolution
	add 512 to number in bracket and put as vga=XXX to set res at boot
chntpw - change password for windows xp
calibre-bin - e-book converter

mknod <name> <type> <major> <minor> - make new device file
	example: mknod /dev/new b 1 0
	-m XXX - permissions
lsmod - list modules
modinfo <module> - information about module
rmmod <module> - remove module
insmod <module> - insert module
modprobe <module> - manipulate modules
	-r - remove
	-f - force
synclient - manage touchpad mouse settings
	synclient MaxTapTime=0 - disable touchpad clicks. default: 180

ifconfig - network info
ifconfig <interface> <address> netmask <mask> - set static ip
ifconfig <interface> hw ether <mac addr> - spoof mac address
ifconfig <interface> <com> - configure interface
	up
	down
	promisc - enable promiscuous mode
	-promisc - disable promiscuous mode
iwconfig <interface> <options> - wireless interface configuration
	mode monitor - enable monitor mode
	mode managed - disable monitor mode
	mode ad-hoc - enable ad-hoc
	mode master - act as access point
	mode repeater - act as repeater
	mode secondary - act as master/repeater
nmcli - Redhat (CentOS)
	nmcli d - brief stats
nmtui - Network Manager terminal UI.
hciconfig - bluetooth interface configuration
nmap - port scanner
nmap -A <host> - scan all the things
nmap -sn <network> - get only MAC addresses and IPs for all hosts
netstat - network info
	-s - statistics
	-l - listening ports and services
	-r - routing table
	-i - interfaces
	-p - show pids
	-t - tcp
	-u - udp
	-a - all
lsof - list open files
	-i - list processes that are listening on the network
	Example output:
	less      19396       root    4r      REG             253,17           16    1001045 /root/list.txt
	You may be able to use this to recover deleted files.
	Notice the 2nd column (PID), and the 4th column (FileDescriptor [without the "r"])
	If the file is still open by a process, you can run: cp /proc/<PID>/fd/<FD> ~/recovered_file.txt
	Example: cp /proc/19396/fd/4 ~/list.txt
nslookup <hostname/addr> - dns lookup
dig <hostname> - dns lookup
dig -x <addr> - reverse name lookup
tracepath - equivalent to traceroute or tracert
dhclient -4 <interface> - set interface to dhcp (ip4)
whois <hostname/addr> - domain info
wget <options> <url> - download into working dir
	-r - recursive
	-l <#> - depth for recursion
	-H - span hosts for recursion
	-np - no parent directories
	-nd - no directories
	-k - convert links for local viewing
	-A <list> - accept
	-R <list> - reject
	-b - run in background
	-i <file> - download from list of URLs
	-m - mirror. use for downloading whole site
	-p - page requirements. use for downloading whole page
	-o <file> - log file
	--user-agent=<text> - mask wget as a browser
		to mask as firefox: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3"
curl <url> - make http requests
	--connect-timeout <seconds>
	-m <seconds> - max time for whole operation
	-i - include http header in output
	-I - retrieve header only
	-x <host:port> - proxy
	-s - silent
	--socks4a <host:port> - socks4a proxy
	-o <filename> - output file
	-O - output to file with same name as remote file
tsocks <command> - ports command through proxy
	tor uses socks4a
	use with tor - under /etc/tsocks.conf change lines to:
		server = 127.0.0.1
		server_type = 4
		server_port = 9050
html2text - converts/parses html into text
dos2unix - convert DOS line delimiters (\r\n) to UNIX line delimiters (\n)
unix2dos - convert UNIX line delimiters (\n) to DOS line delimiters (\r\n)
unix2mac - convert UNIX line delimiters (\n) to Mac line delimiters (\r)
mac2unix - convert Mac line delimiters (\r) to UNIX line delimiters (\n)
minicom - use to configure routers via com/serial port.
nc <host> <port> - create tcp/udp connection (also called netcat)
	ports can be specified as range x-y
	-l - listen
	-k - keep listening (must be used with -l)
	-4 - ipv4
	-6 - ipv6
	-u - use udp
	-w <#> - timeout in seconds
	-n - no dns or service lookups
	-x <address> <port> - proxy
	-X - proxy protocol
		4 - socks4
		5 - socks5
		connect - http
	-s - source address
	-p - source port
	-z - scan host if port is open (only works if a service is listening on the host)

write <username> - write a message to someone logged on
mesg y - allow messages
mesg n - deny messages
vim - text editor
	i - insert mode
	r - replace mode
	o - add new line under cursor and enter insert mode
	esc - command mode
	k j h l - up, down, left, right
	yy - yank current line (nyy - yank n lines including current line)
	p - put line (after current line)
	u - undo
	U - undo line
	ctrl+r - redo
	x - delete
	dd - delete line (and save to clipboard; similar to cut)
	J - delete newline at end of current line
	~ (shift+grave) - toggle upper/lower case
	G - go to last line
	1G - go to first line
	<n><x> - do x n number of times (ie. 100dd, 20x, 50yy)
	:q - quit
	:q! - force quit
	:w - save
	:wq! - save and quit (force)
	:w !sudo tee % - magic way to save the file as root after the file was opened without root privileges
	:set number - line numbers (set nu)
	:set nonumber - no line numbers (set nonu)
	:set mouse=a - enable mouse
	:syntax on/off - enable/disable syntax highlighting
	:set ignorecase - case insensitive searches (set ic)
	:set noignorecase - case sensitive searches (set noic)
	:set smartcase - enable smartcase searches
	:set nosmartcase - enable smartcase searches
	:s/string1/string2/g - search and replace a single instance on a single line
	:%s/string1/string2/gc - search and replace (%s=search all lines, g=replace, c=ask for confirmation)
bvi - binary vi editor (hex editor)

nuitka --portable script.py - python compiler. Compiles a Linux executable from script.py 
shc - Linux shell script compiler. Converts a shell script into C code, then compiles into binary.
	-r - Relaxed security. Make binary portable to other systems.
	-T - allow stack tracing (ie. strace, ptrace, etc.)
	-v - verbose
	-f <filename> - the filename of the script to compile

apt-get update - update package lists
apt-get upgrade - install latest package versions
apt-get install <package> - install a package
apt-get install -f - fix missing packages
apt-get source <package> - download source code
apt-get download <package> - download the package binaries
apt-get remove <package> - removes a package
apt-get purge <package> - removes a package and its all configs
apt-get clean - clears the local cache
apt-get autoclean - intelligently clear the cache of "useless" stuff only
apt-get autoremove - uninstall packages that are no longer necessary
	-y, --yes - assume yes
	--force-yes - more dangerous
	--reinstall - reinstall a package
apt-cache search <regex> - search package names and descriptions
apt-cache show <package> - show info about package (including dependencies)
apt-cache depends <package> - show dependencies (and alternatives)
apt-cache rdepends <package> - reverse dependencies (packages that depend on this one)
	-f, --full - show full package info in search results
apt-mark hold <package> - hold a package; prevent automatic updating
apt-mark unhold <package> - remove a package hold
apt-mark auto <package> - mark a package as automatically installed
apt-mark manual <package> - mark a package as manually installed
apt-mark showhold - show a list of holds
apt-mark showauto - show a list of automatically installed packages
apt-mark showmanual - show a list of manually installed packages
apt-config dump - show all apt configurations
dpkg - debian package manager
	-l - view all packages installed
	-i <file> - install deb file
	-I <file> - info about file, including dependencies.
	-r <package> - remove package
	-P <package> - purge package
	-C - audit. search for partially installed packages.
	--configure <package> - configure a package
	--force-all - force the operation
dpkg-query -W - view all packages installed (full package name)
do-release-upgrade - upgrade distro (debian)
export DEBIAN_FRONTEND=noninteractive - disable confirmations during apt-get install

rpm - red hat package manager
	-i - install
	-U - update
	-e - erase/uninstall 
	-qa - list packages in Red Hat
	-ql <package> - list files owned by package
	-qi <package> - more info on package
	-qf <file> - which package a file belongs to
	--initdb - initialize database
yum - package installer for Red Hat
yum check-update - list packages with available updates
yum clean all - cleans packages
yum search <word> - searches repositories
yumdownloader - downloads, not installs, rpm packages
	--destdir <dir>
	--source
	--resolve - download dependencies as well
yum-utils - package contains several yum tools, including yumdownloader

./configure && make && make install - install form source, first cd into directory
createrepo <dir> - make a software repository

ps - active processes
	-e - all processes
	-f - full info
	-l - even more info
	aux - a good long-list format
pstree -r - process tree
pgrep -l <string> - grep process tree
pmap -x <pid> - show how a process is using memory
top - system monitor
	z - toggle colors
	Z - change color mapping
 	B - toggle bold
	b - toggle bold/reverse
	<,> - change sort field
	x - toggle highlight sort field
	y - toggle highlight running processes
	c - toggle full command names
	k - kill process
	r - renice. change NI value to alter priority
	d or s - set update interval
	W - write config file
	h - help
	q - quit
	l,t,m - toggle summaries at top
	1 - toggle CPU display
	I - irix/solaris mode
	i - idle processes
	f - change fields
	o - change display filter (FIELD=STRING)
	F or O - sort field
	R - reverse sort
	H - toggle threads
	S - toggle cumulative time
	u - show specific user only
	n or # - set max tasks displayed
atop - another tool for monitoring system activity
mpstat - CPU usage (performance, system status)
iostat - display disk/drive stats
	-m - display in Megabytes
	-p <hd1,hd2,...> - display only these devices
ioping <dev> - a ping-like tool for block devices
jobs -l - active jobs
jobs -p - jobs by process #
bg <job#> - starts a paused job and runs in background
fg <job#> - brings job to foreground
<command> & - run in background
ctrl+z - pauses job
kill <pid> - kill process ID
	%<#> - kill job number
	-N - where N is a number that represents a signal (ie. -9 is SIGKILL)
	-s <signal> - send specified signal to process (ie. TERM)
	-<signal> - short form of -s <signal>
	-USR1 - user-defined signal 1. dd responds by printing its progress!
killall <process name> - kill process by name (extremely dangerous! Don't run without a parameter!)
	-I - ignore case
	-i - interactive
	-r - regex
	-u <user> - kill all processes for user. command name is optional
xkill - xfce4 tool to kill and unresponsive program. Create a launcher in the panel and put 'xkill' as the command.

for x in 'jobs -p';do kill -9 $x;done - kill all jobs

coproc [NAME] command [redirections - spawn a "co-process" or asynchronous subshell (like ruunning 'command &') and establish a 2-way pipe between parent and child shells.
	NAME - an array variable created in the parent and child shells.
	NAME[0] - standard output of command (child shell)
	NAME[1] - standard input of command (child shell)
	NAME_PID - process ID of child shell
	wait - the wait command can be used to wait for coprocess to finish
	exit status of coproc is always 0, check status of command instead

parallel <command> - run in parallel
	Example: find . -type f -name '*.mp4' | parallel gzip - zip many mp4 files in parallel
	Installed with package 'parallel' (Debian), not from package 'moreutils' (it's different).
	
WHITESPACE PROBLEM - $IFS is used to determine field separator. It usually includes all whitespace, so to process line by line, do this:
	s=$IFS
	IFS=`echo -en "\n\b"`
	for x in $whatever;do something;done
	IFS=$s
	# A shorter way, but not yet POSIX compliant: IFS=$'\n\b'
	# The \b is necessary to prevent \n from being removed.
	# Using IFS=$'\n' method might actually work without the \b.

history - list of previous commands
	-c - clear current history
fc -l - list of previous commands
fc -s <#> - re-execute command
!! - previous command
!<#> - execute command # from history
!command - execute most recent 'command'
!string - execute most recent command that starts with 'string' (ie. !c)
!$ - last word of previous line (ie. mkdir test;cd !$ #creates/navigates to test)
!^ - the first argument of previous line (second word, ie. $1)
!* - all the arguments of previous line (i.e $*)
!:2 - the second argument of previous line (can be any number)
!# - the current command line. (ie. 'ls hello !#' expands to 'ls hello ls hello')
!#^ - first argument of current command (also try $, :1, etc.) 
^string1^string2 - execute last command and replace string1 with string2
!!:s/string1/string2/ - execute last command and replace string1 with string2
!!:gs/string1/string2/ - execute last command and replace ALL INSTANCES of string1 with string2
esc + . - insert last parameter from last command

adduser <options> <user> - add a user
	-m - make a home directory
	-d <path> - home directory
	-s <path> - shell
	-p <pass> - password
	-g <group> - primary group
	-G <groups> - secondary groups (comma separated list)
	(example) useradd -m fred
usermod <options> <user> - modify user or add it to a group
	-d <path> - home directory
	-s <path> - shell
	-p <pass> - password
	-g <group> - primary group
	-G <groups> - secondary groups (comma separated list)
	(example) usermod -G admin bob
userdel -r <user> - delete user, home folder, and mail spool
groupadd <name> - add new group
restorecon /dir - restores selinux labels. use on dirs like /var if you move them.
fixfiles relabel /dir - same as restorecon. worked before.

wmctrl -r <WINDOW_ID> -e <POSTION/DIMENSIONS> - move/resize window
	-r :ACTIVE: ... - use the :ACTIVE: keyword to select the active window
	-e g,x,y,w,h - window position and dimensions as follows
		g - gravity (just set this to 0)
		x - x positon of window origin (top-left)
		y - y positon of window origin (top-left)
		w - width of window
		h - height of window
	-b <ACTION>,<PROPERTY>,... - add/remove window properties
		wmctrl -r :ACTIVE: -b add,maximized_vert,maximized_horz - maximize window
		wmctrl -r :ACTIVE: -b remove,maximized_horz
	-lG - list window geometry information
xdotool <ACTION> <WINDOW_ID> <PARAMS> - automate windows, mouse, and keys. Can create macro scripts.
	xdotool getactivewindow - get the active window ID
	xdotool windowmove $(xdotool getactivewindow) 0 0 - move to top-left of screen
	xdotool windowmove $(xdotool getactivewindow) 100% 100% - maximize window
	xdotool windowsize $(xdotool getactivewindow) 50% 100% - half width
	xdotool getwindowgeometry $(xdotool getactivewindow)
	Other actions available: key, keydown, keyup, type, mousemove, click, etc.
xdpyinfo - show display/screen information
xprop - show display, screen, and window information. Running without arguments lets you select a window with the mouse.
	xprop -id <WINDOW_ID> - get info about window

chmod <perms> <file> - set a file's permissions
	-R - recursive
	apply to:
	u - user
	g - group
	o - other
	a - all
	permissions:
	r - read
	w - write
	x - execute
	s - SetUID (suid) AND SetGID (sgid)
	t - Sticky Bit. Files in a directory with the sticky bit set can only be deleted or renamed by the root user or the owner of the directory.
	examples:
	u+rwx
	g-w
	o=rx
	+s
	u=rwx,g=rx,o=rx (can be comma separated)
	octal permissions:
	rwx rwx rwx
	111 101 101
	  7   5   5
	if four octal digits are used, the first digit is:
	0 - no special permissions
	1 - sticky bit (do not allow rename or delete, but will allow write if file has +w)
	2 - set group ID (other can run as group)
	4 - set user ID (other can run as user)
	example:
	chmod 6755 file (setuid and setgid, looks like: rwsr-sr-x)
	if it shows capital 'S' it means it has setid, but not execute permissions (useless)
	chmod 1777 file (sticky bit, looks like: rwxrwxrwt)
	if it shows capital 'S' it means it has sticky, but not execute permissions
chown - change ownership if files/directories
	-R - recursive
	examples:
	chown -R user:group /this/folder
	chown user file
	chown :group file (only change group)
add user to sudoers file:
	echo '<user> ALL=(ALL) ALL' >> /etc/sudoers
	You should use 'visudo' to edit /etc/sudoers instead
passwd <user> - set password
	-d - delete password
	-e - expire password
	-l - lock password
	-u - unlock password
	-S - status of password
update-grub - updates grub config
shutdown <option> <time> <message>
	-h - hault
	-r - reboot
	-P - poweroff
	-c - cancel
	time
		now - shutsdown now
		n - shuts down in n minutes
		n:00 - shuts down at n o'clock
		
telinit <#> - change runlevel
init <#> - change runlevel
runlevels:
	0 halt
	1 1user text
	2 multiuser text
	3 multiuser text, network
	4 user defined
	5 multiuser with x
	6 reboot

service <opt> <daemon> <command> - manage daemon
	start
	stop
	restart
	status
	--status-all

chkconfig <opt> <daemon> <command> - make daemon run on startup
	on
	off
	--list
	--level <#s> - specify runlevels command pertains to (ie --level 35 for 3 and 5)
	--add <name> - add as service
	--del <name> - delete as service
	place this at beginning of file to make usable with chkconfig (most are optional):
		### BEGIN INIT INFO
		# Provides: name
		# Required-start: parent-name
		# Default-start: runlevels (0 1 2)
		# Default-stop: runlevels (0 1 2)
		# Description: description
		### END INIT INFO

systemctl <opt> <command> <daemon> - manage daemons in systemd
	start
	stop
	reload
	restart
	status
	enable
	disable
	mask - extreme disable (makes it impossible to start the service; use with caution)
	unmask - remove the mask

journalctl -f - follow the systemd event log

systemd-analyze blame - look at individual service boot times

update-rc.d <opt> <daemon> <command> [S|1|2|3|4|5] - old init service control
	-n - dry-run
	-f - force
	defaults - enable the daemon with default startup configurations
	enable
	disable
	<runlevels> - specify runlevels to enable/disable for (ie "23" will specify runlevels 2 and 3)

read - pause and wait for input

to make a function (2 different ways):
	function_name(){
		commands
	}
	function function_name {
		commands
	}

declare -f function - prints out the code behind 'function'

to carry a function over to a subshell (ie. just doing bash -c "function" doesn't work):
	bash -c "$(declare -f function); function" 

to make a function read from standard input (stdin) so that you can pipe something to a function:
	function(){
		read stdinput
		echo "This was piped in from stdin: " $stdinput
	}

to catch errors:
	if 'command';then
		echo SUCCESS
	else
		echo ERROR
	fi 2>/dev/null

to create exit condition and capture ctrl+c:
	# run if user hits control-c
	exit_f(){
		<commands>
	}
	
	# trap keyboard interrupt (control-c)
	trap exit_f SIGINT
	
	# can also trap exit of any kind
	trap exit_f EXIT

	SIGNALS:
		SIGHUP    1  Hangup (POSIX)
		SIGINT    2  Terminal interrupt (ANSI) - CTRL+C
		SIGQUIT   3  Terminal quit (POSIX)
		SIGILL    4  Illegal instruction (ANSI)
		SIGTRAP   5  Trace trap (POSIX)
		SIGIOT    6  IOT Trap (4.2 BSD)
		SIGBUS    7  BUS error (4.2 BSD)
		SIGFPE    8  Floating point exception (ANSI)
		SIGKILL   9  Kill(can't be caught or ignored) (POSIX)
		SIGUSR1   10 User defined signal 1 (POSIX)
		SIGSEGV   11 Invalid memory segment access (ANSI)
		SIGUSR2   12 User defined signal 2 (POSIX)
		SIGPIPE   13 Write on a pipe with no reader, Broken pipe (POSIX)
		SIGALRM   14 Alarm clock (POSIX)
		SIGTERM   15 Termination (ANSI)
		SIGSTKFLT 16 Stack fault
		SIGCHLD   17 Child process has stopped or exited, changed (POSIX)
		SIGCONTv  18 Continue executing, if stopped (POSIX)
		SIGSTOP   19 Stop executing(can't be caught or ignored) (POSIX)
		SIGTSTP   20 Terminal stop signal (POSIX) - CTRL+Z
		SIGTTIN   21 Background process trying to read, from TTY (POSIX)
		SIGTTOU   22 Background process trying to write, to TTY (POSIX)
		SIGURG    23 Urgent condition on socket (4.2 BSD)
		SIGXCPU   24 CPU limit exceeded (4.2 BSD)
		SIGXFSZ   25 File size limit exceeded (4.2 BSD)
		SIGVTALRM 26 Virtual alarm clock (4.2 BSD)
		SIGPROF   27 Profiling alarm clock (4.2 BSD)
		SIGWINCH  28 Window size change (4.3 BSD, Sun)
		SIGIO     29 I/O now possible (4.2 BSD)
		SIGPWR    30 Power failure restart (System V)
		EXIT      -- Exit signal of any kind

if <!> [ <!> <?> yada yada ] - tests
	-e - if exist
	-f - if file
	-d - if directory
	-r - if readable
	-w - if writable
	-x - if executable
	-b - if block device
	-c - if character device (tty)
	-p - if pipe
	-s - if exist with size greater that 0
	-L - if symbolic link (also -h)
	-S - if socket
	-O - if you are owner
	-G - if you are in group
	-N - if modified since last read
	-z - if zero length
	-n - if non-zero length
	! - negation (also tests if command produces error)
	
if <!> [ <!> expr1 <?> expr2 ] - combining expressions
	file1 -nt file2 - if newer than
	file1 -ot file2 - if older than
	file1 -ef file2 - if both links to same file
	expr1 -a expr1 - boolean AND
	expr1 -o expr1 - boolean OR
	! - negation (also tests if command produces error)

if [ $test1 ];then
	do 1
elif [ $test2 ];then
	do 2
else
	do 3
fi

|| - or
&& - and
!  - not

simplified if statement (good for switching debug mode on/off):
	a=true
	$a && echo "This will echo"
	a=false
	$a && echo "This will not"

	debug=false
	$debug && echo "This only echoes if debug mode is ON"
	$debug || echo "This only echoes if debug mode is OFF"

()    - sub-shell
{ a;} - run command 'a' in current shell (first space and ';' are necessary)
$()   - command substitutions
(())  - arithmetic, "let", used when it contains an 'equals' sign
$(()) - arithmetic expansion, no 'equals' sign enclosed
[]    - test
[[]]  - test with string comparison
[[ $str =~ $regex ]] - string compare regex
!(not-this) - anything but this, invert
	example: ls -d !(Downloads) - list everything EXCEPT Downloads

for item in $LIST;do
	echo $item
done

for (( i=0; i<5; i++ ));do
	echo $i
done

# Prompts the user with a numbered selection menu
# PS3 is the prompt, REPLY is the number selected by the user
# you can do nested select statements
# break exits the current nested select
# you can do 'break n' where n is the number of times you want to break
# selection menu doesn't display again if you go back to it, so put it in a loop
#
PS3="Choose a snack: "
select food in apple banana pear;do
	echo "$REPLY - $food"
	break
done

parallel processing; wait for sub-shells:
	wait - do not continue until all sub-shells complete
	Example: ( (sleep 2;echo p1) & (sleep 1;echo p2) & wait ); echo DONE
	Note: putting everything in a sub-shell suppresses job output.

$0      - Filename of script
$1      - Positional parameter #1
$2 - $9 - Positional parameters #2 - #9
${10}   - Positional parameter #10
$#      - Number of positional parameters
$*      - All the positional parameters (as a single word) *
$@      - All the positional parameters (as separate strings)
${#*}   - Number of positional parameters
${#@}   - Number of positional parameters
$?      - Return value or exit status
$$      - Process ID (PID) of script
$-      - Flags passed to script (using set)
$_      - Last argument of previous command
$!      - Process ID (PID) of last job run in background

wildcards:
	* - anything
	? - any single character
	[abc] - single character matching a, b, or c
	[a-e] - single character matching a, b, c, d, or e
	[!a-e] - single character NOT matching a, b, c, d, or e

let a+=b  - add
let a-=b  - subtract
let a*=b  - multiply
let a/=b  - divide
let a**b  - exponent (a to the b)
let a%b   - modulo
let a++   - increment
let a--   - decrement
let a<<b  - bitwise shift left
let a>>b  - bitwise shift right
let a&b   - bitwise AND
let a|b   - bitwise OR
let a^b   - bitwise XOR
let a&&b  - logical AND: returns true if a AND b
let a||b  - logical OR: returns true if a OR b
let a?b:c - conditional: if a then b else c
Most of these expressions can also be used in arithmetic brackets (())

# Bitwise operations
printf "0x%x\n" $(( 0x01 << 1 )) - left bit shift 
printf "0x%x\n" $(( 0x01 >> 1 )) - right bit shift
printf "0x%02x\n" $(( 0x0a << 1 )) - pad with zeros (2 digits)
printf "0x%d\n" $(( 0x0a << 1 )) - print in decimal

expr - resolve math and string expressions. doesn't work with float numbers.
	expr ARG1 < ARG2 - outputs 0 if false, and 1 if true
	expr ARG1 \< ARG2 - sometimes you need to escape the operator to avoid conflict with shell operators, including parentheses
	+, -, *, /, % - math operators
	<, >, =, !=, <=, >=, |, & - other operators
	expr match STRING REGEXP - string matching
	expr substr STRING POS LENGTH - substring, POS counted from 1
	expr index STRING CHARS - find CHARS in STRING
	( EXPRESSION ) - parenthetical expression
bc - Precise calculator. Works with floats.
	-l - use full precision
	echo "2/5*(3.14*8)-2" | bc -l | sed 's/0*$//g' - trim trailing zeros
	bc -l <<< "2/5*(3.14*8)-2"

while (("$#"));do - cycle parameters through $1 until none left
	<commands>
	shift
done

continue - put in loop to return to top of loop

case $string1 in
	strA | srtB )
		commands;;
	srtC | strD )
		commands;;
	*)
		commands;;
esac

echo "This is the best way to accept user input."
echo -n "Do you agree? [y,N] ";read ans
if [[ ${ans,,} =~ y.* ]];then
  echo "Then you are wise."
else
  echo "I see..."
fi

echo "You can also use a 'case' rather than an 'if' for user input."
echo -n "Do you see? ";read ans
case $ans in
	[yY]|[yY][Ee][Ss])
		echo "Then you are insightful.";;
	*)
		echo "I see...";;
esac
# you can use "shopt -s nocaseglob" to make case insensitive ("shopt -u nocaseglob" to unset)
# you can also do ${ans,,} for all lowercase, or ${ans^^} for all uppercase

put commands in .bashrc in home dir to run command at login
. <file> OR source <file> - run script such as '.bashrc' as part of current process
bash -x <script> - execute script in debug mode
source <file> - execute file in shell environment (ie. .bashrc)
reset - reset shell defaults

complete <parameters> <command> - configures shell auto-complete terms (complete command need to be sourced in the shell)
	complete (with no parameters) - displays all existing auto-complete terms
	complete -W "word list hello world" command - add the wordlist to the command
	complete -A directory command - add the directory listing action to the command
	complete -A file command - add the file listing action to the command
	complete -A hostname command - add the hostname listing action, takes listing from a file defined by $HOSTFILE variable
	complete -A service command - add the service listing action to the command
	complete -C command2 command - executes command2 in subshell and displays output
	complete -F function command - executes function, from the function's perspective: $1=command, $2=word_being_completed, $3=preceding_word, function should put listing in variable $COMPREPLY
	complete -P prefix command - added to beginning of each completion listed
	complete -S suffix command - added to end of each completion listed
		-o <option>
			bashdefault - perform the default Bash completion if no matches
			default - use default filename completion if no matches
			dirnames - directory name completion if no matches
			filenames - file name completion if no matches
			noquote - do not quote filenames
			nosort - do not alphabetically sort listing
			nospace - do not append spaces to end of lines
	/etc/bash_completion.d - you can place completion scripts in here, and they will be sourced when an new bash shell is executed.
	
	Example of a completion script with multi-level word lists:
	
		have vb &&
		_vb_complete()
		{
		  local cur prev

		  COMPREPLY=()
		  cur=${COMP_WORDS[COMP_CWORD]}
		  prev=${COMP_WORDS[COMP_CWORD-1]}

		  if [ $COMP_CWORD -eq 1 ]; then
			COMPREPLY=( $(compgen -W "list listall start stop halt" -- $cur) )
		  elif [ $COMP_CWORD -eq 2 ]; then
			case "$prev" in
			  "list"|"listall")
				COMPREPLY=( $(compgen -W "long short" -- $cur) )
				;;
			  "start"|"stop"|"halt")
				COMPREPLY=( $(compgen -W "force" -- $cur) )
				;;
			  *)
				;;
			esac
		  fi

		  return 0
		} &&
		complete -F _vb_complete vb

set - set command
	-x - set debug mode inside the script (xtrace on)
	+x - unset debug mode (xtrace off)
	-v - verbose on
	+v - verbose off
	-e - place at beginning of script to always exit upon error (then use ||true for commands that are allowed to err)
	+e - temporarily bypass set -e
	-C - enable noclobber
	+C - disable noclobber
	-H - enable histexpand (i. "!" notation)
	+H - disable histexpand (i. "!" notation)
	-f - disable pathname expansion, like using asterisk '*' (noglob on)
	+f - enable pathname expansion, like using asterisk '*' (noglob off)
	-o <option> - enable option name (ie. -o noclobber)
	+o <option> - disable option name (ie. +o noclobber)
	-o history - enable command history
	+o history - disable command history
	-o pipefail - enable fail on piped commands 
	+o pipefail - disable fail on piped commands
	-u - do not allow the use of undeclared variables
	+u - allow the use of undeclared variables
	completion-ignore-case on - tab completion ignores case
	set <option_name> - another way to set things
	unset <option_name> - another way to unset things

	useful examples for set:
		set -e; set -o pipefail

setterm -powersave off -blank 0 - make the X Window not blank the screen
setterm -reset - go back to default settings
setterm -msg off - disable printing kernel messages to console
shopt - shell options
	-s <opt> - set the option
	-u <opt> - unset the option
	-s nocaseglob - make the shell case insensitive
tty - print the device file of the current tty
stty - terminal parameters
	-a - list all parameters
	<param> "<value" - set a param value
	<(-)param> - enable/disable a param (ie. ofdel enables, -ofdel disables)
infocmp <term> - get info about terminal (terminfo, termcap)
showkey -a - enter keys to get their dec/oct/hex value as seen by the terminal (must be root).
terminator - multiple terminals in one window, customizable
tmux - multiplexed terminals in one terminal  
	ctrl+b - run a command (type the command after)
		? - list key bindings
		c - create new window
		arrow keys - move between panes
		0 to 9 - select a window
		n - next window
		p - previous window
		o - next pane
		" - split pane top/bottom
		% - split pane left/right
		x - kill the current pane
		& - kill the current window
		[ - enter copy mode
		] - paste most recent buffer
		= - paste from buffer of choice
		r - force redraw of screen
		: - enter tmux command prompt
		alt+<1-5> - select a layout preset
		space - next layout preset
alias <com alias>='<com>' - make alias command
\command - run a command ignoring aliases
which -a - all instances of executable in PATH locations

{1..10} {A..Z} {a..z} - ranges
{10..100..5}% - range 10-100 in units of 5 with "%" after each one (ie. 10% 15% 20% ...)
{000..999} - range with leading zeros
bash{e{s,d}} - yields "bashes bashed"
bash{,e{s,d}} - yields "bash bashes bashed"
${var:-value} - make var default to value if not set or empty (temporary; doesn't save the value)
${var-value} - make var default to value if only not set (empty doesn't count)
${var:=value} - set var default to value if not set (saves the value)
${var:+message} - if var is set, print message. if var is not set, print nothing
${var:?message} - if var is set, print var. if var is not set, print error with message
SCRIPT=$(readlink -f $0) - the script that is running
SCRIPTPATH="dirname $SCRIPT" - the dir of the script
${#var} - number of characters in var
${var#pattern} - removes shortest possible match from the left
${var##pattern} - removes longest possible match from the left
${var%pattern} - removes shortest possible match from the right
${var%%pattern} - removes longest possible match from the right
${var%?} - ? is single character wild card. To cut 3 characters from the right, use: ${x%???}
examples:
	get file extension ${FILE##*.} file.txt -> txt
	get file name from path ${FILEPATH##*.} /dir/file.txt -> file.txt
	remove file extension ${FILE%.*} file.txt -> file
	get directory name from path ${FILEPATH##*.} /dir/file.txt -> /dir
${var/pattern/string} - substitute pattern with string
${var//pattern/string} - substitute pattern with string (greedy)
${var//pattern/string} - substitute pattern with string (greedy)
${var/#pattern/string} - substitute pattern with string (start at left edge)
${var/%pattern/string} - substitute pattern with string (start at right edge)
${var,} - make first character lowercase
${var,,} - make var all lowercase
${var^} - make first character uppercase
${var^^} - make var all uppercase
${var~} - reverse case of first character in var
${var~~} - reverse case of var
${var,pattern} - lowercase first character if matches pattern
${var,,pattern} - lowercase any character if matches pattern
${var^pattern} - uppercase first character if matches pattern
${var^^pattern} - uppercase any character if matches pattern
${var~pattern} - reverse first character if matches pattern
${var~~pattern} - reverse any character if matches pattern
${var:n:m} - substring of var from character n to m (starting at 0; ${var:0:3} = first 3 chars)
${var::m} - blank implies 0 (ie. ${var::4} is the same as ${var:0:4})
${var:n} - cut off n characters from beginning (n=2; hello -> llo)
${var: -n} - cut off all but n characters from end (n=2; hello -> lo)
${var:n: -m} - cut off m characters from end of string starting at n (n=0,m=2; hello -> hel)
${!var} - indirection: if content of var is another variable name, then print the content of other variable
	(ie a=b; b=c; echo ${a} #echoes "b"; echo ${!a} #echoes "c")
	can also display variable names like: echo ${!BASH*} #echoes name of all vars that begin with BASH

x**y - y is exponent of x
% - remainder ie. $((15%7))
$((<base>#<value>)) - define a number's base
$((2#<value>)) - define binary number
$((8#<value>)) - define octal number
$((10#<value>)) - define decimal number
$((0x<hex>)) - define hex number
export <var>=<value> - set environment variable
declare <option> <var> OR <var=value> - set attributes for a variable (don't use $)
	-a - array
	-f - function name
	-i - integer
	-r - readable
	-x - make global variable
	+<?> - removes attribute
number=$RANDOM ; let "number %= 500" - chooses random number =< 500
	while (( $number < 100 )) - sets a floor of 100
	set range to 2 to generate binary (true/false). using let "number >>= 14" gives better random distribution
	$((RANDOM%range)) - random # up to "range"
string{1,2,3} - expands to: string1 string2 string3
string{01..03} - expands to: string01 string02 string03
cp file.txt{,.old} - expands to: cp file.txt file.txt.old

placing the name of a variable into another variable:
	two=2
	num=two
	echo ${!num} #echoes '2'

formatting 2 digit numbers:
	i=2
	printf "%02d" $i #echoes '02' 

CHAR="[:graph:]";cat /dev/urandom|tr -cd $CHAR|head -c 8 #creates random 8 character password.

array:
	list="a b c" - not an array, treated as whole string
	array=(a b c) - array, treated as set of items
	array=($list) - turn variable into array
	${array[2]} - choose item 2 (starting at 0), chooses c in this example
	${array[@]} - all items in array form
	${array[*]} - all items in
	${array[0]:n:m} - string splice (ie. x=(foo bar);echo ${x[1]:0}#echoes "bar";echo ${x[1]:1}#echoes "ar")
		syntax - ${array[#]:begin:number} (ie x=(hello);echo {x[0]:0:3}#echoes "hel")
		${array[0]:3:2} - specific characters (:3:2 starts at character 3 then goes 2 characters (including 1st) from there, displaying characters 3 and 4.) this can be used to show a range of items. (${list[*]:0:3} #echoes first 3 characters)
		(ie x=(foo bar);echo ${x[1]:0:1}#echoes "b";echo ${x[1]:1:1}#echoes "a";echo ${x[1]:2:2}#echoes "r")
	${array[@]:0:${#array[@]}-1} - display all items in list except the last one.
	${array[@]:n:m} - similar to string splice, but works with array items instead of characters
		(ie x=(foo man chu); echo ${x[0]:0:2}#echoes "fo"; echo ${x[@]:0:2}#echoes "foo man")
	${#array[*]} - count # of items
	${#array[0]} - length of first item
	${array[$((RANDOM%num_of_item))]} - choose random item from list
	${array[@]^} - make first char in each item uppercase (ie "hi bob" -> "Hi Bob")
	unset array[0] - remove array item 0 (no "$" or braces)
	array+=( "something new" ) - add another item to an existing array
	
	list="11 22 33"
	if [[ $list =~ $item ]];then echo yes;fi - checks if $item is contained in $list

escape characters:
	\\    backslash
	\a    alert
	\b    backspace
	\c    no further output
	\e    escape
	\f    form feed
	\n    new line
	\r    carriage return
	\t    horizontal tab
	\v    vertical tab
	\0    null
	\0NNN octal number (0-7; 1-3 digits)
	\xHH  hex byte value (0-F; 1-2 digits)

line endings (EOL, delimiter):
	\n    \x0a     UNIX/Linux
	\r\n  \x0d\x0a DOS/Windows
	\r    \x0d     MacOS

POSIX character classes (translations, bracketed)
	[:alnum:]  all letters and digits
	[:alpha:]  all letters
	[:blank:]  all horizontal whitespace
	[:cntrl:]  all control characters
	[:digit:]  all digits
	[:graph:]  all printable characters, not including space
	[:lower:]  all lower case letters
	[:print:]  all printable characters, including space
	[:punct:]  all punctuation characters
	[:space:]  all horizontal or vertical whitespace
	[:upper:]  all upper case letters
	[:xdigit:] all hexadecimal digits

updating a line of text (progress bar):
i=0
while (( $i <= 5 ));do
	string=`echo -n "Progress: $i%"`
	count=${#string}
	echo -n $string
	sleep 1
	printf '%0.s\x08' $(seq 1 $count)
	let i++
done && echo Complete

POWER SAVING:
apt-get install laptop-mode-tools
sudo vim /etc/laptop-mode/conf.d/cpufreq.conf
	CONTROL_CPU_FREQUENCY=0
sudo service laptop-mode restart


selinux - see file "selinux"
iptables - see file "iptables"
samba (smbd/netbios/nmbd) - see file "samba"
nfs - see file "nfs"
cisco - see file "cisco"
bind (dns) - see file "bind"
gdb - see file "gdb"
nmap - see file "nmap"
regex (regular expression) - see file "regex"
ssh - see file "ssh"
tor - see file "tor"
tsocks - see file "tor"
zenity - see file "zenity"
wine - see file "wine"
unicode - see file "unicode"
ftp - see file "ftp"
ldap - see file "ldap"
nis - see file "ldap"
html - see file "html"
grub - see file "grub"
apache (httpd) - see file "apache"
cups/printing/lpr/lpd - see file "cups"
at (atd) - see file "at"
cron (crond) - see file "cron"
raid/mdadm - see file "raid"