#!/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