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