Skip to content

Instantly share code, notes, and snippets.

@W4U-TOURS
Forked from nelsestu/common_linux_commands.sh
Created September 3, 2022 14:29
Show Gist options
  • Select an option

  • Save W4U-TOURS/b451fbd9ad22c6d5bfaa7a67f95efb69 to your computer and use it in GitHub Desktop.

Select an option

Save W4U-TOURS/b451fbd9ad22c6d5bfaa7a67f95efb69 to your computer and use it in GitHub Desktop.

Revisions

  1. @nelsestu nelsestu created this gist Aug 18, 2022.
    1,376 changes: 1,376 additions & 0 deletions common_linux_commands.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,1376 @@
    ================================================================================
    Terminal hotkeys ===============================================================

    Ctrl+U # cut all before cursor
    Ctrl+K # cut all after cursor
    Ctrl+W # cut word before cursor
    Ctrl+Y # paste

    Ctrl+L # clear screen
    Ctrl+S # freeze output
    Ctrl+Q # unfreeze

    Ctrl+C # SIGINT - interrupt current task
    Ctrl+Z # SIGTSTP - pause current task
    Ctrl+D # EOF, exit

    ================================================================================
    FHS ============================================================================

    /boot/ # boot loaders
    vmlinuz-x.x.x-x
    grub/grub.conf
    /dev/ # essential devices
    /proc/ # virtual filesystem providing info about processes and kernel info
    /mnt/ # temporarily mounted filesystems
    /media/ # mount points for removable media

    /bin/ # essential command binaries available for single user mode
    /sbin/ # same for root
    /lib/ # libraries for /bin and /sbin
    /opt/ # optional software packages
    /etc/ # system-wide configs
    init.d/ # init scripts and daemons
    rc # do runlevel changes (run rcN.d/ scripts)
    rcN.d/ # init scripts running at certain runlevel N (links to init.d/)
    # 0 - shutdown
    # 1 - single user mode
    # 2 - multiuser, no network
    # 3 - multiuser, with network
    # 5 - multiuser, GUI
    # 6 - reboot
    crontab
    cron.d/
    fstab # filesystems table

    hostname
    hosts
    network/
    interfaces
    resolv.conf

    passwd # list of users
    shadow # passwords
    group # list of groups
    gshadow # group passwords
    sudoers

    skel/ # default user's configs
    apt/
    sources.list
    /usr/ # secondary hierarchy for readonly files (unix system resources)
    bin/
    sbin/
    lib/
    include/
    local/ # tertiary hierarchy for local data specific to this host

    /tmp/ # temp files (usually removed on reboot (see $TMPTIME env var))
    /var/ # variable files (logs, spool files, emails, etc.)
    cache/
    tmp/ # temp files to be preserved between reboots
    lib/ # state information, e.g. databases
    mail/
    lock/
    run/
    spool/
    cron/crontabs/ # users' crontabs
    log/
    dmesg
    kern.log
    daemon.log
    auth.log
    messages
    syslog

    /root/ # root's home directory
    /home/ # users' home directories

    ================================================================================
    Package management =============================================================

    dpkg # debian package manager
    -i $deb_file # install
    -r $package # remove package
    --purge $package # remove package and its dependencies
    -s # print package status details

    apt-get # APT package handling utility
    update # update index
    upgrade # install newest versions of all packages
    install $package # install package
    -f # attempt to fix broken dependencies
    remove $package
    purge $package
    -y # automatic "yes" to prompts

    apt-cache
    show $package # print package records
    search $regex # search package in index

    ================================================================================
    Bash basics ====================================================================

    # Bash is a dialect of Shell.

    # To make file an executable bash script:
    # 1. Add at first line shebang ("#!") with path to bash interpreter:
    #!/bin/bash
    # or:
    #!/bin/bash args
    # or:
    #!/bin/sh # for posix shell compatible scripts
    # 2. Set executable permission for file

    # comment
    ; # statements delimeter

    # 0 - success exit code.
    # true (or :) is NOP command that always returns 0.
    # false - command that always returns 1.

    # Bash has no types. Any command is a string.

    # Command and arguments separates by whitespaces.
    # Command becomes meaningful because how it uses.
    # Ex:
    echo "-n abc" # "-n abc\n"
    echo -n abc # "abc"
    echo -n `abc` # command not found
    \ # escape specchar. also uses to escape newline.
    "some_val" # escape most of specchars in expression. Exclude "$", "`", "\".
    'some_val' # escape all specchars. Exclude only "'".

    ================================================================================
    Statements groups ==============================================================

    { statement1; statement2; ...; } # statements group
    # Group interpretes as one command and returns output, so can be used
    # for IO redirection.
    # Ex:
    {
    expr1
    expr2
    } > dir/file
    ( statement1; statement2; ...; ) # statements group
    # Executes in a subshell (child process). Has local scope, so vars
    # will not be available in parent scope.

    $( command1; command2; ...; ) # command substitution
    # Executes commands and substitutes result.
    # Ex:
    a=$(
    echo "List of files:"
    ls -l
    )
    echo "$a" # quoted to save whitespaces

    command1 && command2 # reduced logical AND by exitcode
    command1 || command2 # OR

    {$val1,$val2} # variants substitution
    {$m..$n} # by range
    # Command will be interpreted as command with list of arguments
    # provided by {...}.
    # Could not contain unescaped spaces!
    # Ex:
    v=2
    mkdir ./d{"1"," $v", " 3 "}
    # same as `mkdir "./d1" "./d 2" "./d 3 "`

    (( expr1, expr2, ... )) # arithmetic expressions group
    $(( expr1, expr2, ... )) # arith expr substitution (returns result of last)
    # Ex:
    echo $(( a = 1 + 1, b = 6 / 2 )) # 3
    echo $a # 2

    ================================================================================
    Variables ======================================================================
    # (!) Always quote variable substitution!

    varname=some_value # put|set value
    # Without spaces!

    $varname # substitution of value
    ${varname} # same

    ${varname:-default} # value if defined and not empty, default otherwise
    ${#varname} # length
    ${varname:offset:length} # substring
    ${varname/pattern/str} # replace first match by str
    ${varname//pattern/str} # replace all matches by str
    ${varname#pattern} # delete shortest match
    ${varname##pattern} # delete longest match
    ${varname%pattern} # delete shortest match from end
    ${varname%%pattern} # delete longest match from end

    unset varname # delete variable

    ================================================================================
    Arrays =========================================================================

    arr=() # new empty array
    arr=($val1 $val2 ...) # create and fill
    declare -A arr=([$key]=$val1 ...) # associative array

    arr[$key]=$value # put|set value
    arr+=($value) # append value

    ${arr[$key]} # get item by index|key
    ${#arr[@]} # get length

    ${arr[*]} # join values. Uses IFS as delimeter.
    ${!arr[*]} # join indexes|keys
    ${arr[@]} # iterate by values
    ${!arr[@]} # iterate by indexes|keys

    # Ex:
    files=(./*.txt) # get filenames by glob pattern

    # Iterate:
    for val in "${arr[@]}"; do # remember to quote!
    echo "$val"
    done

    seq $end # generate sequence of numbers [1; $end]
    seq $start $end # [$start; $end]
    seq $start $step $end # [$start; $end] with step $step

    ================================================================================
    Control statements =============================================================

    if command; then
    ...
    elif command; then
    ...
    else
    ...
    fi

    case $str in
    pattern1) command1 ;;
    pattern2) command2 ;;
    ...
    *) commandDefault ;;
    esac

    while command; do
    ...
    done
    # Ex:
    cancel= # false
    n=0
    # repeat every 5 seconds until cancelled:
    while [ ! $cancel ] && sleep 5; do
    (( n++ ))
    echo "iter $n"
    [ $n -ge 5 ] && cancel=true
    done

    until command; do
    ...
    done

    for item in $range; do
    ...
    done
    # Ex:
    for v in "one" "two" "three"; do
    echo "$v"
    done

    for (( init; check; step; )); do
    ...
    done

    select selected in item1 item2 ...; do
    # will ask user to select item
    # uses PS3 as prompt
    # selected variable will contain selected item value or ""
    # REPLY will contain number of selected item (from 1)
    ...
    break # will ask again without break
    done

    # Cancel loop:
    break

    # Cancel current iteration:
    continue

    ================================================================================
    Test command ===================================================================

    [ expr ] # test command. Unix-shell-compatible.
    # [] operators:
    -e $path # is exists
    -s $path # is file exists and not empty
    -f $path # is file
    -d $path # is dir
    -h $path # is symlink
    -r|-w|-x $path # is readable|writable|executable

    -t $fd # is file descriptor opened on a terminal
    # e.g. [ -t 0 ] - true if it's an interactive shell

    -z $str # is string empty
    -n $str # not empty
    $str1 = $str2
    $str1 != $str2
    $str1 \< $str2 # ascii sorting
    $str \> $str2

    ! expr # NOT
    expr1 -a expr2 # AND (not reduced)
    expr1 -o expr2 # OR (not reduced)

    $num1 -eq $num2 # is numbers are equal
    $num1 -ne $num2 # not equal
    $num1 -lt $num2 # less than
    $num1 -le $num2 # less or equal
    $num1 -gt $num2 # greater than
    $num1 -ge $num2 # greater or equal
    # Ex:
    if [ $a = "a" ]; then ...

    [[ expr ]] # test keyword. It's more powerful but not shell-compatible.
    # [[]] operators (additional to []):
    $str1 = glob_pattern # dont quote!
    $str1 != glob_pattern
    $str1 =~ regex_pattern # dont quote!
    $str1 < $str2 # ascii sorting
    $str > $str2

    expr1 && expr2 # AND (reduced)
    expr1 || expr2 # OR (reduced)

    ( expr ) # group to change precedence

    ================================================================================
    Regex ==========================================================================

    # Glob
    # Glob can be used to match string or filenames.
    # There spec characters:
    * # any number of any chars (exclude "/" when matching filenames)
    ** # any dir|file and its subdirs (recursive *)
    ? # any single char
    [a-z] # single char from range
    [^a-z] # inversed
    # Glob pattern implicitly anchored from start to end of line.
    # Ex:
    ls -l ~/*.txt # list all txt files in home dir
    rm -r ./* # remove all files and dirs from cwd
    if [[ filename = *.png ]]; then ...

    # Extended glob
    # To enable it: `shopt -s extglob`
    # Also supports:
    ?(pattern1|pattern2|...) # zero or one occurence
    *(pattern1|pattern2|...) # zero or more
    +(pattern1|pattern2|...) # one or more
    @(pattern1|pattern2|...) # one
    !(pattern1|pattern2|...) # inverse

    # Ex:
    ls !(*.jpg|*.gif)

    # Regex in test command
    # Since bash3.0 supports =~ operator for [[]] keyword.
    # It matches string from left side by regex from right side and
    # returns 0 (matched), 1 (not matched) or 2 (incorrect pattern syntax).
    # Ex:
    if [[ some =~ ([a-z]{2})([a-z]{2}) ]]; then
    echo ${BASH_REMATCH[0]} # "some"
    echo ${BASH_REMATCH[2]} # "me"
    fi

    # Basic regex (BRE dialect)
    ^ # beginnig of line
    $ # end of line
    . # any char
    [a-z] # single char from range
    [^a-z] # inversed
    <abc> # word (space-separated sequence)
    * # zero or more occurences

    # Extended regex (ERE dialect)
    # additionally to BRE it supports:
    + # one or more occurences
    ? # zero or one occurence
    {n} # n occurences of previous char or group
    {n,} # n or more occurences
    {n,m} # from n to m [n; m] occurences
    | # logical OR
    () # grouping

    # (!) Do not quote glob or regex.

    ================================================================================
    Functions ======================================================================

    function func_name() { # declare function
    # func body
    echo $1 # first argument
    }

    func_name # invoke
    func_name $arg1 $arg2 ... # invoke with arguments

    unset func_name # delete function

    # Inside function are available:
    $FUNCNAME
    $1, $2, ... # arguments
    $# # number of args

    local varname=$value # define local variable
    # By default all variables defined inside function are available
    # in caller's scope and can overwrite existing vars.

    return $n # return from function
    # Function can return only number, it's like an exitcode.

    ================================================================================
    Script =========================================================================

    $0 # command|script name
    $1, $2, ..., ${10}, ... # arguments
    # Ex:
    sn=`basename $0`
    echo "Script name: $sn"
    $# # number of arguments
    $@ # all arguments as string (separated by IFS)
    # Ex:
    args=("$@") # args as array
    IFS=","
    echo "${args[*]}" # print args separated by ","
    unset IFS
    shift $n # shift arguments list to left (exclude $0)
    # n = 1 by default
    set $arg1 $arg2 ... # set command line arguments

    getopts $format arg # parse one command line argument (invoke in while
    # to get all args)
    # format - string like "a:bc:"
    # ":" after key means that value required for this key
    # arg - variable that will contain key
    # to get value - OPTARG variable
    # Ex:
    while getopts "ad:" arg; do
    case $arg in
    a) a=true ;;
    d)
    if [ -d "$OPTARG" ]; then
    dir=$OPTARG
    fi ;;
    esac
    done

    exit $code # quit script with exitcode [0-255]. 0 means normal exit.
    $? # stores exitcode returned by last command

    trap 'command1; command2; ...' $signal # trap incoming signals
    trap - $signal # restore trap to default
    trap # print traps list
    # It can be used to perform cleanup.
    # where signal:
    HUP
    INT
    QUIT
    TERM
    EXIT
    # Ex:
    trap 'rm -f tmpfile' EXIT

    exec $path # run external program. Process will be replaced
    source $path # run script in the current environment (like an import)
    . $path # same
    eval $cmd ... # concat and evaluate given command, return its exit code

    set -x # enable debug mode
    set +x # disable debug mode

    ================================================================================
    Environment variables ==========================================================

    export VARNAME=<value> # export env var to child processes

    # Predefined global env vars:
    BASH_VERSION # string describing the version
    HOSTNAME # hostname of your computer
    PPID # PID of the parent process
    PWD # current working directory
    RANDOM # random number between 0 and 32767 (new on each expanding)
    UID # ID number of the current user
    COLUMNS # width of terminal in characters
    LINES # height of terminal in characters
    HOME # current user's home directory
    PATH # colon-separated list of paths
    PS1 # string that describes the format of shell prompt
    TMPDIR # directory that is used to store temporary files
    IFS # args separator (' \t\n' by default)

    # To set env vars need to add|change it in:
    # global:
    /etc/environment

    # login shell:
    /etc/profile
    ~/.profile

    # nonlogin shell:
    /etc/bashrc
    ~/.bashrc

    # interactive shell:
    /etc/profile
    ~/.profile
    ~/.bashrc

    # noninteractive shell:
    /etc/bashrc

    ================================================================================
    History ========================================================================

    history N # print list of N last commands

    !N # run command number N
    !-N # -N'th command
    !xyz # last command beginning with 'xyz'
    !xyz:p # print instead of run

    !! # last command
    !$ # last word|argument of last command
    !* # arguments of last command

    ^a^b # replace 'a' to 'b' in last command and run

    # precede command by the space to prevent saving in history

    ================================================================================
    Processes ======================================================================

    some_command & # run command in background

    $! # stores PID of recently started background task
    # Ex:
    ( sleep 10; ) & p=$! # run and save pid
    kill -INT $p

    bg $pid # switch paused task to background and resume it
    # $pid - PID or %task_number
    fg $pid # switch task to foreground
    jobs # list of background tasks
    top # live task manager
    -d $sec # update interval (10 seconds by default)

    $$ # PID of current process

    ps # list processes
    # options:
    -A # all
    u # user-oriented format
    a # all with TTY, include other users
    x # all without TTY
    r # only running
    -t $tty # by TTY
    -p $pid # by PID
    -u $user # by user id or name

    # Ex:
    ps uaxf | grep "glob_to_filter"

    kill signal $pid # send signal to process
    # where signal:
    -1 # SIGHUP
    -2 # SIGINT
    -3 # SIGQUIT
    -15 # SIGTERM (default)
    -9 # SIGKILL
    # $pid - PID or %task_number
    killall $name # kill process by name
    -s $signal
    -i # interactive

    sleep $n # put current process to sleep for $n seconds

    ================================================================================
    IO =============================================================================

    echo $value # print line to stdout
    # options:
    -n # without ending newline
    -e # enable escape-sequences
    -E # supress escape-sequences

    exec N< $file # create|replace file descriptor N

    read varname # read line from stdin and put to variable
    # options:
    -p $prompt # show prompt
    -s # hide input
    -r # dont allow backslash escaping
    -a # split to array
    -d $char # specify delimeter char
    -t $sec # timeout
    -n $n # read max n chars if delimeter not received before
    -N $n # read exactly n chars. Ignore delimeter.
    -u $fd # specify FD instead of stdin
    # Ex:
    exec 3< "file_to_read"
    read -u 3 line
    echo "first line: $line"

    less [$file] # view file|input with pagination
    -N # show line numbers
    -M # show prompt (number of lines, percent, filename)
    head [$file] # print first part of file|input
    # options:
    -n $lines # number of lines to print
    -c $bytes # bytes to print
    tail [$file] # print last part
    # options:
    -n $lines
    -c $bytes
    -f # watch for updates

    sort [$file] # print lines sorted
    # options:
    -u # unique
    -n # numeric sort
    -r # reverse
    -k <n> # sort by field n (from 1)
    tr $str1 $str2 # filter input - replace all chars from $str1 to
    # appropriate chars from $str2

    $target N< $source # input redirection
    # N = 0 by default
    $source N> $target # output redirection (rewrite, create if doesnt exists)
    # N = 1 by default
    $source N>> $target # append
    # N = 1 by default
    # where:
    $source, $target # input|output (file, statements group, etc.)
    N # FD number
    # Ex:
    cat >> file
    iconv -f cp1251 -t utf8 < album_cp1251.cue > album_utf8.cue

    # Predefined FDs:
    0 # stdin
    1 # stdout
    2 # stderr

    # Redirection can be filtered.
    # Ex:
    wrongCmd 2> $file # write stderr to file
    cmd > $file 2>&1 # write both stdout and stderr to file
    cmd &> $file # same
    cmd > $fileOut 2> $fileErr # write stdout and stderr to different files
    cmd 1>&2 # write stdout to stderr

    cmd1 | cmd2 # pipe, conveyer. Uses for chaining - get stdout from
    # first and send it to stdin of next command. Each command executes
    # in a subshell.
    # Ex:
    cat somefile | grep "word_to_search"
    cat somefile | tr abc ABC > file2

    /dev/null # path to system's black hole
    # It can be used e.g. to silence stdout|stderr.
    # Ex:
    { command1; command2; } 2> /dev/null # errors will be suppressed

    /dev/tty # current terminal. Can be used to guarantee that output will reach
    # terminal although stdout redirection

    sync # flush any buffered data out to disk

    ================================================================================
    FS =============================================================================

    fuser $file # list users that are using filesystem|file
    -m $mp # mountpoint
    -k # kill all found processes
    -v # verbose

    fdisk -l # list devices
    fdisk -l $device # list partitions
    # $device - block device, e.g. /dev/sdb

    df [$mp] # show fs usage
    -h # human readable
    lsblk # list block devices
    -o $output # comma-separated options: "name", "rm", "size", "ro",
    # "type", "fstype", "mountpoint", "label", "uuid",
    # "log-sec", "phy-sec", etc (optionally with + sign to append).
    # default: name,maj:min,rm,size,ro,type,mountpoint

    mount $fs $mountpoint # mount filesystem
    # $fs - filesystem
    # $mountpoint - target directory to mount
    # options:
    -t $type # fs type: "ext4", "ntfs", "vfat", "smbfs", etc,
    -o $rights # options, "rw" (read,write), "ro" (readonly),
    # "force" (for repair), "remount" (change mountpoint or rights)
    --bind $dir # create mirror
    # Ex:
    sudo mkdir /mnt/somemp
    sudo mount /dev/sdb1 /mnt/somemp
    umount $fs|$mountpoint # unmount filesystem

    fdisk $device # change partition table of this device
    mkfs -t $type $fs # format
    # $fs - filesystem

    mlabel -i $fs ::$label # change FAT label
    ntfslabel $fs $label # change NTFS label
    e2label $fs $label # change EXT label

    # Ex:
    # create bootable usb
    sudo -s
    umount /dev/sdb1
    mkfs -t vfat /dev/sdb1
    dd bs=4M if=./someimage.iso of=/dev/sdb && sync
    # or
    # cat ./someimage.iso > /dev/sdb && sync
    fdisk /dev/sdb
    # then select option "a" to set boot flag
    mlabel -i /dev/sdb1 ::LIVE

    ================================================================================
    Files ==========================================================================

    chmod value $file # set privileges
    # where value can be:
    ABC
    # where:
    # A - "u" (user,owner), "g" (group), "o" (others), "a" (all),
    # "ug", "uo", etc.
    # B - "+" (add permission), "=" (rewrite permission),
    # "-" (remove permission)
    # C - "r" (read), "w" (write), "x" (execute), "rw", "rwx", etc.
    # Special flags:
    # "s" - setuid|setguid (execute with owner's
    # permissions)
    # "t" - sticky bit (only owners can delete|rename
    # files in this directory)
    # e.g. `chmod ug+x file`
    UGO
    # where:
    # U - number 0-7 - permission for owner
    # G - number 0-7 - permission for group
    # O - number 0-7 - permission for others
    # where:
    # 0 - forbidden
    # 4 - read
    # 5 - read and execute
    # 6 - read and write
    # 7 - read, write and execute
    # e.g. `chmod 754 file`
    # options:
    -R # recursive
    --reference $file # copy privileges from another file
    -v # verbose
    -f # silent
    chown $user:$group $path
    # options:
    -R # recursive
    # Ex:
    sudo chown -R $(whoami) some/dir

    pwd # print current working directory
    cd $dir # change current directory

    ls $dir|$file... # print list of items in directory or
    # info about file
    # options:
    -a # show hidden (beginning with '.')
    -A # without ./ and ../
    -l # with info (chmod, size, mtime)
    -F # show "/" after dir, "*" after executable file
    -h # human-readable size (kb, mb, gb)
    -t # sort by modified time (desc)
    -r # reverse order
    -s # show blocks number
    -d # directory itself instead of its content
    du $dir|$file # print size of file or directory recursively (disk usage)
    # options:
    -d $n # max depth
    -c # show grand total
    -h # human readable
    -s # print only total for each argument

    dd # copy and convert bytes
    bs=$c # read|write up to $c bytes at a time (e.g. "1M")
    if=$source # file or device
    of=$dest # file or device

    cp $source... $target # copy file|dir
    # options:
    -r # recursive - to copy directory
    -i # interactive mode (prompt before overwrite)
    -u # update mode
    -P # dont follow symbolic links in source
    -L # always follow symlinks in source
    --preserve=$attrs # preserve attributes
    # available params: mode, ownership, timestamps, context,
    # links, xattr, all
    -p # same as --preserve=mode,ownership,timestamps
    -v # verbose
    mv $source... $target # move file|dir
    # options:
    -v # verbose
    -i # interactive mode
    -u # update mode
    touch $file # create empty file
    # options:
    -c # do not create if doesnt exists
    -a # only update access time
    -m # only update modified time
    -d $rel_date # change modified time
    mkdir $dir # create empty dir
    # options:
    -r # recursive
    -v # verbose
    rm $file # remove file|dir
    # options:
    -r # recursive - to remove dir
    -f # force - without prompt for subdirs
    -v # verbose
    ln $file_target $link_path # create link (hard by default)
    # options:
    -s # symbolic
    -v # verbose
    file $filename # identify file type

    locate $file # quick file search
    # options:
    -i # ignore case
    -b # match only basename
    -c # print only count of found
    --regex # use extended regex
    find $dir search action # recursively search files|dirs in $dir by search
    # pattern and perform action for each item
    # where $dir is a path
    # where search can contain:
    \( expr \) # group expressions to change precedence
    ! expr
    expr -o expr # OR
    expt -a expr # AND
    -name "glob_pattern" # search by filename
    -path "glob_pattern" # search by path or filename
    -mtime $n # by date modified (days)
    # where $n:
    N # N days
    +N # more than N
    -N # less than
    -type $type # by type
    # where $type:
    f # file
    d # directory
    -size $size # by size (blocks)
    # where $size:
    N # N blocks
    Nc # N bytes
    +N|+Nc # more than
    -N|-Nc # less than
    # and where action:
    -print # simple print found list (default)
    -exec command {} \; # execute command(s). {} is a placeholder
    # for found path
    # Ex:
    find ./* -exec touch -m {} \; # update modified time recursively

    grep $pattern [$file...] # search by pattern in contents of each
    # file or stdin
    # options:
    -r # resursive
    -G # use basic regular expression (BRE) (default)
    -E # use extended regular expression (ERE)
    -P # use perl regex
    -F # fixed string, dont interpret pattern as regex
    -m $n # specify max count of matches
    -v # invert match
    -i # ignore case
    -w # match whole words
    -x # match whole lines
    -C $n # show $n lines around (context)
    -H # show filenames
    -h # dont show filenames
    -n # show line numbers
    -l # print only filenames
    -L # print only filenames of not matched
    -c # print only count of matched lines per file
    -q # supress output (return only exit code)
    -s # supress warnings
    # Ex:
    ls -a | grep ".bash*"

    sed $expression [$file] # SED - stream editor
    # expression applies for each line
    -e $expression # to specify multiple expressions
    # ; can be used as delimeter instead
    -f $script_file # file containing sed expressions
    # also uses for interpreter script: #!/bin/sed -f
    -n [$print_command] # no printing unless an explicit request to print
    -r # use extended regex
    -i[suffix] # save backup and rewrite file

    # expression syntax:
    <address> # address lines to work width (at beginning of expression)
    # where address:
    <n> # line number (count from 1)
    # $ - specchar for last line
    /<regex>/
    <start_addr>,<stop_addr> # address range
    ! # invert address restriction

    { <commands> } # group commands

    p # print line
    = # print line number
    d # delete line
    a <str> # append line after current
    i <str> # insert line before current
    c <str> # replace current line or range
    s/<regex>/<repl>/<flags> # substitute (first occurence by default)
    # regex - basic regular expression
    # & - specchar - found substring to past in replacement pattern
    # flags:
    <n> # address occurence
    g # global
    I # ignore case
    y/<chars>/<chars>/ # transform (like tr shell command)

    h # put pattern buffer to hold buffer
    H # append to hold buffer
    x # exchange pattern buffer and hold buffer
    g # put hold buffer to pattern buffer
    G # append to pattern buffer

    r <file> # read file and paste contents after current line
    w <file> # write to file
    n # skip line
    q # quit

    # Ex:
    sed "2 ! s/([a-z]+)/(\1)/g w out.txt" -r # wrap words into parentheses
    # on every lines exclude line 2 and write modified lines to file
    sed "1,2 {
    i qwe
    a rty
    }"
    # wrap 1 and 2 lines and print to stdout
    find ./static/ -type f -name "*.es6" | \
    xargs -i sed -r -i \
    "s/import ([a-z0-9_]+) from '(.+)'/import * as \1 from '\2'/I" {}
    # modify imports and rewrite files, recursively

    wc [$file] # tells how many lines, words and bytes in file|input
    -l # count lines
    -w # count words
    -m # count chars
    -c # count bytes

    cut [$file] # parse fields from file|input
    -c $selec # select characters
    -b $selec # select bytes
    -f $selec # select fields, e.g. '-f 1,3' - first and third
    -d $char # fields delimeter (default - tab)
    -s # do not print lines without delimeters

    diff $file1 $file2 # show differs
    -u # unified output (+, -, @@)

    md5sum [$file] # md5 hash of file|input

    shed [$file] # hex editor
    -r # readonly
    -s $n # cursor offset

    tar $file... # tar archiving
    # options:
    -f $file # archive file
    -C $file # destination
    -x # extract
    -c # create
    -r # append files
    -u # update mode. Append files if they are newer
    -t # list contents
    -z # through gzip compression
    -j # through bzip2 compression
    # Ex:
    tar -xz -f ./archive.tar.gz -C ./target
    tar -xj -f ./archive.tar.bz2 -C ./target
    tar -xJ -f ./archive.tar.xz -C ./target
    tar -cz -f "../${PWD##*/}.tar.gz" .

    zip $archive_file $file... # zip archiving
    # options:
    -d $file... # delete files from archive
    -r # recursively
    -u # update mode
    # Ex:
    zip -r ./archive.zip ./file1 ./file2 ./dir
    unzip $archive
    # options:
    -d $path # specify target dir

    dump -N $fs # backup filesystem, N - backup level (0 - full)
    -u # save date and level in /etc/dumpdates
    -f $dumpfile
    -a # auto-size, fill dest device
    restore # restore|view dump
    -f $dumpfile
    -x $filename # restore specified file
    -r # restore to cwd
    -i # interactive restore
    # commands:
    # cd, ls, pwd, add $filename, extract

    ================================================================================
    Network ========================================================================

    netstat # print network connections, routing tables, statistics, etc.
    -t # tcp
    -u # udp
    -x # unix sockets
    -l # only listening
    -a # all, any status
    -p # display pid and program names
    -n # dont resolve hosts or usernames, use numeric (for speed up)

    -s # print statistics
    -r # print kernel routing table
    -i # print list of network interfaces
    # Ex:
    netstat -tulpn # print listening ports

    lsof -i :$port # search processes by listening port
    -t # print only pid

    ifconfig [$interface] # configure|view network interface(s)
    -a # show all, even if down
    ifconfig $interface [$addr] [options]
    # options:
    up|down # up or down certain interface
    mtu $n # set max transmission unit
    netmask $mask # set mask
    broadcast [$addr] # set|reset broadcast address
    pointopoint [$addr] # enable|disable p2p mode
    hw $type $mac # set hardware address
    # $type - "ether", "ax25", "ARCnet", "netrom"

    ifup|ifdown [$interface] # bring interface(s) up or down
    -a # all interfaces

    ping $addr
    -s $bytes # packet size
    traceroute $addr
    -n # dont resolve names

    telnet $addr $port
    -l $user
    -n $tracefile # record trace info
    -S $tos # type of service
    # commands:
    mode line|character|isig|-isig|edit|-edit
    send eof|eor|el|escape|nop|susp
    close
    quit

    # Ex (smtp):
    $ telnet 123.123.123.123 25

    HELO smtp.example.com
    MAIL FROM: sender@host
    RCPT TO: receiver@host
    DATA
    Subject: some subject
    some message
    .

    wget $url # download files via http, https or ftp
    # options:
    -t $num # number tries
    -O $path # output file
    -c # continue partially downloaded file
    -r # recursively
    -D $domain # restrict only for specified domain
    -S # collect headers
    --spider # do not load content

    tcpdmp [filter] # dump traffic
    -i $interface
    -c $n # limit number of puckets
    -n # dont resolve names
    -A # print as ascii
    -X # print both numeric and ascii
    -l # make stdout line buffered
    -w $file # dump to file
    -r $file # read dump from file
    # filter:
    host $addr
    port $n

    nmap $target # port scanner
    -sL # list scan
    -sn # ping scan
    -Pn # no ping (skip discovery stage)
    -PS # TCP SYN/ACK
    --disable-arp-ping
    -n # no DNS resolution
    --dns-servers $dns_servers
    --traceroute # trace hop path
    -sS, -sT, -sA, -sW, -sM # SYN, Connect, ACK, Window, Maimon
    # TCP scan technique
    -sN, -sF, -sX # Null, FIN, Xmas TCP scan technique
    -sY # INIT scan SCTP technique
    -sU # UDP scans
    -sI $zombie $host[:$port] # iddle scan
    -sV # probe to determine service version, info
    -p $range # set range of ports to scan
    -iL $file # list of hosts from file

    ================================================================================
    SSH ============================================================================

    apt-get install openssh-server
    apt-get install openssh-client

    ssh $user@$hostname [$commands] # connect
    # commands - single quoted commands
    # options:
    -i $path # private key for authentication (default: ~/.ssh/id_rsa)
    -p $number # port number
    -A # forward key

    ssh-keygen # generate key pair
    # options:
    -t dsa|rsa
    -b $n # length (1024 (def), 2048, 4096)
    -f $path # file to save keys (default: ~/.ssh/id_rsa and
    # ~/.ssh/id_rsa.pub)
    ssh-copy-id $user@$hostname # send public key to server
    # to remote ~/.ssh/autorized_keys dir
    # options:
    -i $path # public key file (default: ~/.ssh/id-rsa.pub)
    -p $number # port number

    puttygen -o $destfile -O $type $keyfile # convert ssh key
    # type - output format. "private" - putty format,
    # "private-openssh", "public" - standart ssh.com,
    # "public-openssh", "fingerprint"

    scp [$user_from@$host_from:]$path_src [$user_to@$host_to:]$path_dst
    # copy files locally or to|from remote system over ssh
    # options:
    -i $path # private key (passes to ssh)
    -P $number # port number
    -p # preserve mtime and modes
    -r # recursive
    -v # verbose
    rsync [$user_from@$host_from:]$path_src [$user_to@$host_to:]$path_dst
    # copy files locally or to|from remote system over ssh. Uses delta
    # transfer algorithm.
    # options:
    -A # with ACL
    -a # recursive with symlinks and devices saving mtime, owner, group
    -b # backup files instead of rewriting (uses "~" prefix by def)
    -u # skip files which target mtime > source mtime
    -r # recursive
    -z # compress
    --exclude $pattern # prevent syncing (root - root of src)
    --delete # delete extraneous files from target (absent in source)
    --ignore-errors # delete even if there IO errors
    --existing # skip creating new files
    --ignore-existing # skip updating files
    --devices # copy devices
    --specials # copy special files
    --links # copy symlinks as symlinks
    --times # preserve mtime
    --perms # preserve access permissions
    --group # preserve groups info
    -v # verbose
    # if $path_src have trailing slash - it will be same as /* glob
    # Ex:
    rsync -auv --delete \
    --exclude "/files/*" --exclude "/logs" \
    ./ "$user@$host:$dest"

    # client config:
    ~/.ssh/config or /etc/ssh/ssh_config

    # server config:
    /etc/ssh/sshd_config

    ================================================================================
    Tmux ===========================================================================

    # Tmux - terminal manager.
    # Tmux has three levels of hierarchy: Sessions, windows, and panes.
    # Sessions are groups of windows, and a window is a layout of panes.

    tmux # start the tmux session
    tmux new
    -s <name>

    # In Tmux press the ctrl+b, then:
    d # detach
    s # list sessions
    $ # rename session

    c # new window
    , # rename window
    & # kill window

    tmux ls # list of the running sessions

    tmux a # attach to the tmux session
    -t <name>

    tmux kill-session
    -t <name>

    ================================================================================
    Services =======================================================================

    # Systemd - create and manage services.

    # To create service put unit file
    # into /etc/systemd/system/<servicename>.service directory.

    systemctl
    daemon-reload # index new unit files
    enable <servicename> # enable autostart at boot
    start <servicename> # start manually
    status <servicename> # view service info and status

    # Example of unit file:
    [Unit]
    Description=My Service
    After=network.target

    [Service]
    Type=simple
    # simple, forking, oneshot, dbus, notify, idle
    Restart=always
    # always, on-success, on-failure, on-abnormal, on-watchdog, on-abort
    RestartSec=0 # delay
    ExecStart=/usr/local/bin/myservice.sh

    [Install]
    WantedBy=runlevel3.target

    ================================================================================
    Vim ============================================================================

    vim $file # open file in vim editor
    # options:
    -R # readonly
    -r # restore from temp backup

    # Vim will be launched in command mode.
    # commands:
    CTRL+G # show filename, size and status
    a # edit after cursor (add)
    i # edit before cursor (insert)
    # will be switched to editor mode
    ESC # switch back to command mode

    . # repeat last command

    gg # go to start
    G # go to EOF

    CTRL+V # selection
    d # delete selection
    y # copy selection

    dd # delete current line
    D # delete chars from current pos to EOL

    yy # copy current line
    yG # from current line to the EOF
    NY # N lines
    p # paste below current line
    P # paste above current line

    :w # save
    :w $file # save to file
    :w>> $file # append to file
    :Nw>> $file # append line N to file
    :N,Mw>> $file # append lines [N; M] to file
    :r $file # read file and append below current line
    :Nr $file # read and append below line N

    :q # quit
    :q! # quit without save
    :cq # quit with non-zero exit code

    u # undo
    CTRL+R # redo

    / # search after
    ? # search before
    n # find next

    :set number # show line numbers (nonumber to disable)
    :set incsearch # enable inremental search
    :set autoindent # enable indentaion
    :set syntax=some_lang|off # enable|disable syntax highlighting

    # settings can be defined in VIMINIT environment variable:
    # Ex:
    export VIMINIT='set number incsearch'

    ================================================================================
    Miscellaneous ==================================================================

    while ( nc -l 80 < $some_response_file > : ) ; do $some_cmd ; done
    # simple server

    curl ifconfig.co # get public ip

    while true; do
    inotifywait -r -e MODIFY $some_dir && $some_cmd
    done # watch on directory and run command when any file changed

    date +%T # print time (%H:%M:%S)
    date +%s # print timestamp
    date -d "12/31/2016 23:59:59" +%s # date to timestamp

    cat url.txt | xargs wget # pass stdout to argument
    cat url.txt | xargs -i wget "{} something" # with placeholder

    which $name # search executable in PATH
    whereis $name # search executable in system dirs
    locate $name # search file using precompiled index

    whoami # current username
    id $username # user id and groups

    useradd $username # create user
    -d $dir # set home directory
    -m # create home if not exists
    -g $group # set primary group
    usermod $username # edit user
    passwd $username # change password
    userdel $username
    -r # delete home dir

    crontab # view|edit user's crontab
    -u $username # for specified user
    -e # edit
    -l # print content
    -r # remove

    lscpu # display info about cpu
    lshw # display info about hardware
    -short
    lsblk # list block devices
    free # display free memory