= GNU Tools Reloaded =

title:          "GNU Tools Reloaded"
page:           http://www.guckes.net/talks/gnu_tools.txt
page:           http://www.guckes.net/talks/gnu_tools.html
Latest change:  Fri Nov 11 14:23:42 CET 2016

"some GNU tools explained.."

= description =

show some GNU tools by examples.
practical stuff for everyday use.

= BEGIN =

welcome! :-)

"wir können über alles sprechen -
aber nicht über 40 minuten."

"we can talk about anything -
 but not about/over 40 mins."

so.. 40mins first.. then a PAUSE.
then another 40mins. and Q&A.
and maybe more in another room
if you are interested in more.

download this file with:
$ wget http://www.guckes.net/talks/gnu_tools.txt

send questions to:
Sven Guckes mailto:gnu_tools@guckes.net

here we go..

= SHELL =

bash and zsh

moving the cursor, deleting+inserting, kill ring..
see also: http://www.guckes.net/Setup/bashrc

== moving about ==

CTRL-A CTRL-E
CTRL-B CTRL-F
 ALT-B  ALT-F

== deleting ==

CTRL-W
CTRL-K CTRL-U

== inserting ==

CTRL-Y
from "kill ring":
 ALT-Y ALT-Y ..

== last word ==

inserting last word from last line -> M-. (meta-dot)

== clear ==

presentations of commands on an 80x25 terminal
is usually too small to be readable on videos.
so - use a bigger font, a shorter prompt - and
clear the screen for every new command/context.

$ clear

clears the screen
drawback:
[-] *six* keys to type!
[-] this adds an extra command to the history

CTRL-L:
[+] only 1.5 keys to type.
[+] does clear the screen.
[+] *keeps* the input!
[+] no extra entry in history.

== exit ==

exiting the shell:

$ exit

[+] should work for all shells. :-)
[-] five keys to type. :-(

alternative:

CTRL-D

[+] only 1.5 keys to type. \o/

catch: must be given as *first* character of input.

bash: IGNOREEOF

== prompts ==

changing prompt from long to short:

zsh> bash
4.3.30 guckes@kudu:~> echo $PS1
\V \u@\h:\w>

zsh:
alias __="PS1='%n@%m:%4c%1v> '"
alias  _='PS1='\''$ '\'

switch to short prompt.

[zsh] guckes@kudu:~> _
$ ...

zsh> __
guckes@kudu:~>

= Jobs =

zsh> bindkey -s '^z' "fg\r"
$ sleep 42
^Z
$ ^Z

== Event Designators ==

$ touch filename
$ ls filename
$ !! -h
$ !! -l

zsh: inline expansion of "!!"

alternative:

$ touch filename
$ ls filename
$ ls M-. -hl

"grouped switches": "-hl"

$ mount /dev/foo /foo
mount: only root can do that
$ sudo !!

== substitution ==

"^foo^bar"

$ systemctl start  dienst
$ ^start^status
    s^...^...^
$ systemctl status dienst

TODO add function to make that substitution

see also: man bash -> "Event Designators"

== HISTORY ==

bash:
  export HISTIGNORE=\
  "bg:cd:date:df:du:exit:fg:ll:ls:pwd:rehash:source:su:sudo:top:w"

== pwd ==

might be a built-in:

$ which -a pwd
pwd: shell built-in command
/bin/pwd

pwd:    options -L and -P

guckes@kudu:~/.P> pwd -L
/home/user/guckes/.P
guckes@kudu:~/.P> pwd -P
/home/www/guckes/public_html

= echo =

option "-n": "no newline"

$ echo -n foo; echo bar
foobar

= env =

just the variable names:
$ env | sed 's/=.*//'
$ env | sed 's/=.*//' | sort

= less =

  $ man less | grep -A 1 NAME
  NAME
         less - opposite of more

configuration:
see also: http://www.guckes.net/less/index.html

19:45 PAUSE
19:57 cont..

= man =

$  man -k less
$ apropos less

option "-r": regular expression
$ apropos -r less$
$ apropos -r '^vi' | sort | less +/vi

= mount =

mount? mnt!

  alias mnt='mount | column -t | less -S'

= od =

"od - dump files in octal and other formats"

option -a -> ASCII
$ od -a filename
$ xxd   filename    (comes with vim)
$ bvi   filename    binary editor

= shuf =

choose 6 random values from 1 to 49:
  $ seq 49 | shuf -n 6

-------------------------------------------------------------------
BIGGER PROGRAMS
-------------------------------------------------------------------

= inxi =

$ inxi -nb
  http://code.google.com/p/inxi/
  https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/inxi/source-archive.zip

admins: please install! :)

= mutt =

  display-filter!
  color for index and body - "bunt ist meine lieblingsfarbe"
  list-reply
  save-hook bedingung ~/Mail/foo
+ tag-prefix -> "save all tagged messages"

  signatures:
  :r ~/.signature
  :r ~/.sig.linuxhotel

  signature file -> extraction via agrep/awk

and now... neomutt!

= screen =

  multiple views of the same session

  copy mode
  exchange file (readbuf, writebuf)
  hardcopy
  monitor for activity
  monitor for silence
  multi-user mode

-> <ad> screen training </ad>

20:48 PAUSE
20:53 cont..

= vim =

  i_CTRL-D + foo() i_CTRL-T   (de)indent current line

  macro recording
  regexes -> takes time!
  :options

  abbreviations: dddd -> YYYY-MM-DD [uses strftime()]
  mappings:      ,,   -> :w

  dG "delete to end"  -> talk on "small commands"

  :r!command          -> read in output of "command" after current line
  !!date              -> replace current line with output of "date"
  >>                  -> shift current line
  g?                  -> rot13
  gq                  -> zitierten text umbrechen in emails

  :g/RE/ s:foo:bar
  :v/./d

== vimdiff ==

  editing /etc/passwd

-> <ad> vim training </ad>

21:37 ENDE

= zsh =

== global aliases ==

alias -g G='| grep'

  G   grep
  GG  grep --color

  S   sort
  W   wc -l

  H   head only
  T   tail only

  L   catch with less
  U   catch with urlview
  V   catch with vim

  P   pipe oooon! \o/    -> command1 P command2

-> <ad> zsh training </ad>

= Contact =

comments? questions? contact me! :-)

Sven Guckes gnu_tools@guckes.net
gpg keys: 1024R/57F77F09 and 8000R/0185391B

= Events =

when+where has it happened?

2016-11-10 Do 19-21h @LinuxHotel
https://pad.linuxhotel.de/p/cli

= Links =

https://wiki.lpi.org/wiki/LPIC-1#Topic_103:_GNU_and_Unix_Commands
bash echo env export pwd set+unset man uname history .bash_history
cat cut expand fmt head join less nl od paste
pr sed sort split tail tr unexpand uniq wc

= TODO =

smore more ideas..

find:   find . -xdev -type f -print0  | sort -z | xargs -0 cksum > /run/cksum.backup

mkdir:  option -p

shell:  reverse-i-search CTRL-R and CTRL-S
shell:  alias  dfg -> df -h
shell:  exec $SHELL

sort:   option "-u" -> unique
uniq:   option "-c" -> count
  alias laststats="last|sed 's/ .*//'|sort|uniq -c|sort -n -r|less"

TODO    gnuplot!  get data from US elections.

TODO    add a few tasks for the audience. "make them *work*." ;-)

$ grep change: gnu_tools.txt
$ wc -l        gnu_tools.txt

vim: set et fenc=latin1 ft=sven tw=999 nowrap: THPXRF EOF