#!/usr/bin/env bash

#Copy file contents into Clipboard ("ctrl+c")
xclip -sel c < file


### Buffers and redirect ###

#buffers 0=STDIN, 1=STDOUT, 2=STDERR, then 3 up to 9 are available for use

#exec without command argument will redirect IO for current program e.g.
#send stdout to /dev/null via file descriptor 9
exec 9>/dev/null 1>&9
#restore stdout so we can see it
exec &>/dev/tty

# example of redirect, get use to this //Gustav
cat < my_file.txt > my_new_file.txt

### Man pages ###

man #regular man pages
help #for help bash
apropos #search man pages (man)

### Symlinks and inodes ###

readlink #shows symlink info, also see f flag

#hardlink points to underlying inode so multiple can exist, and as long as any do exist the inode cannot be overwritten
#hardlink cannot point to folder as this would create loops
#however, symbolic (soft) links can point to folders since `readlink` shows the real path.


#use `stat` to see amount of (hard) links to a file, and other such info
stat
readlink
ln a b
ln -s a b

### Bash shortcuts ###

#0th argument of last command
echo !:0

#return from last command ("error code") for C errors see errno
echo $?


### grep, sed, awk

#the tools grep, sed, and awk are usually available on a Linux system and can be used for different purposes,
    # although it's often a matter of taste.
# These tools all use regular expressions (regex),
    # awk  - extended regex
    # sed  - regex (-E for extended)
    # grep - regex (-E for extened)

# grep together with the default programs in Linux (core utilities) can perform many basic operations
    # grep, cut, wc, head, tail, strings, ...
    # These can also be used together with sed, awk, or other tools
# sed is good for a lot of things, especially text modification e.g. search and replace stuff
    # example: find all headers (# ## ### etc) and add AS MANY # to the end of line
# awk, can use more advanced statements as well as variables and arrays to count and sum results,
    # thereby easily maintain data over multiple lines.
    # awk also supports delimiters to further split the rows into smaller fields.


####### The rest of this document shows examples of text manipulation #######


### SED append corresponding nr of '#' ###

#save starting '#' (at least 1) to group and append last to line
#s/ for search and replace
#\) group hits for later use as \1 and \2 ('#' and rest of text)
#Note that spaces have a meaning for the matching
#find rows starting with AT LEAST one '#' and save as first group,
    # the rest '.*' (all chars) to the end of row ($) save as second group.
    # Finally the text is printed as \1 \2 \1, i.e. the starting '#' are repeated at the end.

sed -i "s/^\(##*\)\(.*\)$/\1\2 \1/" example_doc.txt

#extended regex
sed -i -E "s/^(#+)(.*)$/\1\2 \1/" example_doc.txt


### Find users with bash as shell ###

#use cut to get first word before delimiter :
grep "/bin/bash" /etc/passwd | cut -d \: -f 1

#find lines ending with 'bash', each hit perform search and replace
sed -E "/.*bash$/ { s/^(\w*).*$/\1/;p };d" < /etc/passwd

#set separator ':', match regex, and print first string (before separator)
awk -F: '/bash/{ print $1 }' < /etc/passwd


### Lines without word ###

grep -v "daemon" /etc/group

sed -E "/daemon/d" < /etc/group

awk '!/daemon/' < /etc/group


### Count hits and show relevant lines ###

#print matching lines numbers
awk '/localhost/{print "Line " NR " matches"}' < /etc/hosts

# Count nr of hits (i) and matching line numbers (NR)
# TODO this seems broken!
#awk '/localhost/{i=0}{i++} /localhost/{print "Line " NR " matches"} END {print i " hits"}' < /etc/hosts


### List files with numbers (exclude folders) ###

#ls -p to list folders with / at the end
ls -p /etc/ | grep -v ".*/$"| grep "[0-9]"

ls -p /etc/ | awk "! /.*\/$/ && /[0-9]/"

#delete lines ending in /, then print remaning lines which contains at least a number, delete all lines
ls -p /etc/ | sed -E "/\/$/ d; /[0-9]/ p; d"


### SUM variables with awk ###

#If third argument delimted by : only contains digits add it to sum
awk -F ':' '$3 ~ /^[0-9]+$/ {sum+=$3} END {print sum}' < /etc/passwd


### AWK DIV ###

#BEGIN {
#    # Things to be done before you start processing rows.
#}
#{
#    # Things to be done for each row.
#}
#END {
#    # Things to be done after processing the last row.
#}


### Div ###

#simple find exact filename
ls /usr/share/doc -R | grep "^README$"

Last modified | History | Source | Preferences