Discovering the magic of the line in Prague

By Mark Krenz of @climagic What is climagic?

● Twitter account I started in 2009 ● Over 10,000 posts (~50% are unique commands) ● Over 138,000 followers and counting ● Meant to inspire beginners and advanced users ● Based on bash running on ● Tweets often driven by my own jobs, needs and ideas. ● Typical format of a tweet: # ● Youtube channel: http://www.youtube.com/user/climagic ● Also check out the IRC channel #climagic on irc.freenode.org Why “magic”?

Quite simply because it’s not “magic” all.

"Any sufficiently advanced technology is indistinguishable from magic.” -- Arthur C. Clarke’s 3rd law

"Witchcraft to the ignorant, … simple science to the learned" -- Leigh Brackett, 1942 am I?

Because I guess I’ve never really mentioned it.

● I’m Mark Krenz, I created and run climagic ● Live in the great town of Bloomington, Indiana, USA ● Security Analyst for Indiana University’s Center for Applied Cybersecurity Research ( https://cacr.iu.edu/ ) ● Have been using Linux since 1997 ● Wrote num-utils programs for CLI numeric operations ● Wrote the top rated SSH tutorial (needs updating) Who are you? According to the 2012 climagic survey with over 1000 responses and Twitter Analytics

● Beginners to advanced users and even non-believers ● People from 63+ different countries ● Various Unicies, Mac OS X plus over 26 distros of Linux ● Users of bash, zsh, tcsh, ksh, sh, dash, csh, ash, fish, pdksh and even…… powershell. ● People from a variety of different professions with different needs. (IT folk, Scientists, Engineers, Broadcasting, Law, Medicine, Writer, Train technician and even a Pastor) ● People who have a high tolerance for corny geek jokes. The command line? You mean that black window with text inside? No graphics? n the beginning… ( approx. 1.5 billion seconds ago ) there was a .

And Kenneth and Dennis said it is good and easy to work with, so they made everything* act like a file and called it TM Unix . And the system started to grow. each program do one thing well.

- Change your directory - What files are here - Show the contents of a file - Edit a file - Copy a file - remove a file - move a file - Create a directory - Count lines, words, characters su - Become the superuser or another user man - Learn about the system and commands However, the real power was in the plumbing. Make each program act as a filter. (stdin/stdout)

thers came and basked in Unix’s glory and exclaimed: “Let us make many programs for all to use with this system.. The command is the word. RTFM.”

The terminal window is a portal into the heart of your computer. You are the interface and it can be as good as you can be. How to get help? (Because you’ll probably need it)

● Run ‘man ls’ ● Run ‘man -k foobar’ (must run makewhatis first) ● Run ‘help cd’ ● Run ‘tmux -h’ ● http://mywiki.wooledge.org/BashGuide ● Google it ● Ask online ● Pray!

Lonely is the user who searches the Internet for an error message and only finds the source code that generates it. Moving around ● cd Pictures (Now you are in subdirectory Pictures) ● cd /home (Now you are in /home) ● cd (Now you are in your home directory ~/ ) ● cd - (Now you are in /home) ● cd /media/user/Flashcard ● cd . (cd into the same symbolic path. Useful if remounted/recreated)

Chuck Norris once ran cd .. in / and it worked. Useful Keystrokes (mostly readline/Emacs) ● [Ctrl]-r (then what to search for), press repeatedly, when done ● [Ctrl]-a (move to beginning of line) ● [Ctrl]-e (move to the end of the line) ● [Ctrl]-w (Yank (like delete) the last word) ● [Meta]-. (Insert the last argument from the last line) ● SSH keystrokes: ○ [RET]~C ○ [RET]~. ● ./render ● [Ctrl]-z ● jobs ● fg ● bg ● %1

"Computers in the future may weigh no than 1.5 tons." -- Popular Mechanics article from 1949 Variables ● MYWORD="aimlessness" ● export MYWORD (export means make the variable available to subshells, programs, etc) ● TZ="Europe/Prague" date (one export to command) ● LANG=C & set

"f u cn rd ths, u cn gt a gd jb n cmptr prgrmmng." -fortune Variables ● ALPHABET=$( {a..z} | -d ' ') ● echo ${ALPHABET:0:3} ● echo ${ALPHABET^^} ● echo ${ALPHABET/abc/Easy as abc 123 }

Our parents made machines that took people to the moon. We created programs that make it look like we are vomiting rainbows. Special Variables ● echo $(($RANDOM % 100)) ● echo $SHLVL ● echo $COLUMNS $LINES ● auxww | " $$ " ● pgrep -aP $PPID ● mv photo.jpg $OLDPWD/

What do keyboard users and reclusive astronauts have in common? They both think that space bars are too noisy. Functions ● uploadphotos(){ scp -rp "$@" you@webserver:www/photos/; } Usage: uploadphotos IMG_{3201..3250}.JPG

● function todo(){ ${EDITOR:-/usr/bin/vim} ~/$(date +todolist-%Y%m%d); }

● function cd(){ [[ "$1" == "..." ]] && builtin cd ../.. || builtin cd $@ ; }

fliptable(){ echo "(╯°□°)╯ ┻━┻"; }

Usage: fsck -y /dev/sda || fliptable Functions ● sus(){ sort | -c | sort $@; }

● function acronym(){ elinks -no-numbering -dump \ http://acronymfinder.com/$1.html | '/*/!d';}

● function box() { t="$1xxxx";c=${2:-=}; echo ${t//?/$c}; \ echo "$c $1 $c"; echo ${t//?/$c}; }

37, the age at which Grace Hopper joined the Navy, learned computer logic and later invented the compiler and COBOL. It's never too late to get started. Functions (pranks) ● function ls() { /bin/ls $@ | /usr/bin/tac ; }

":-P" -- Albert Einstein Misc tricks ● -sh */ ● -n+2 data.csv ● -o 1.1,2.2 -1 1 -2 1 -t: passwd shadow ● lsof +D /tmp ● lsof -i TCP:80 ● renice -p 2235

When confronted with new things, I first scoff at it. Then I scoff again. Then I try it. Then I use it. Then I defend it as a way of life. Brace Expansion ● convert photo.{jpg,png} -> convert photo.jpg photo.png ● tar zcvf sourcecode{.tar.gz,} -> tar zcvf sourcecode.tar.gz sourcecode ● echo {0..10} -> 0 1 2 3 4 5 6 7 8 9 10 ● echo a{0..5} -> a0 a1 a2 a3 a4 a5 ● echo {a..z} -> a b c d e f g h i j k l m n o p q r s t u v w x y z # Bash only

Did you know? Brian J. Fox's (creator of bash) grandfather Dan Fox, created the Monopoly® Man character. Now the $ prompt makes more sense. Output redirection ● ls -l > lsoutput.txt ● ls -l filethatdoesntexit 2> out.err ● t stream search trump > /dev/sda

STDERR is like the fire escape for data. Process Substitution ● -12 <(ls -1 dir1 | sort) <(ls -1 dir2 | sort)

Unix was invented the same month and year that ZZ Top was formed (June 1969). Coincidence? I think not. & sed ● awk '{print $1}' access_log ● awk -F, '{print $2 " " $3}' data.csv ● awk '$7~/\.png/ {array[$7]+=$10} END {for (i in array) \ { print array[i] " " i; } }' access_log | sort -nr

Computers are supposed to do the work for us. If you're doing most of If you're doing most of the work for the computer, then you've lost your way. sed ● sed -n '29p' mycode.pl ● sed -s -i.bak 's/Copyright 2016/Copyright 2017/' *.html ● sed -n '12 {p; Q}' file.txt

Sometimes regular expressions can get messy. That's what she sed. More awk & sed ● ps aux | awk '$8=="Z"' | wc -l ● elinks -dump http://bit.ly/qutWZK|sed -n -e 's/,//g' \ -e '/^1960/,/^2010/p' | awk '{p=$6/$2*100; print $1 " " p}'

How many unix users does it take to change a lightbulb? Well that depends, is it a System V, BSD, GNU or Mac lightbulb? Pipelines ● ls -l | less ● mount | column -t ● du -sh */ | sort -rh

ZZ Top: A band formed in June 1969 that is known for its beards. Unix: same commands, same dates, same reputation. Pipelines ● awk {'print $1'} access_log | sort | uniq -c | sort -nr

To anyone who ever asks for an example of a program that is the opposite of "do one thing well". Try a word processor. Pipelines ● elinks http://www.$( look . | egrep “^[a-z]{2,6}$” | shuf | -n 1 ).com

It took the power of 3 Commodore 64s to go to the moon, but you need something 100,000 times more powerful to run Firefox. Pipelines ● elinks enwp.org/$(date +%B_%d) | sed -n -e 's/\[[0-9]\+\]//g' \ -e '/^\[.* Ev/,/^\[/p' | tr -d '\n' | tr '*' '\n' | \ grep -v '\[ed' | sort -R | head -1

Try running ' 9 1752' Loops ● for i in 1 2 3 ; do echo $i ; done ● for i in *.jpg ; do convert $i ${i%jpg}.png ; done

Me: Ok Siri, copy the pictures from number 187 through 250 to the server. Siri: I'm sorry but I can't do that. Loops ● while true ; do ; 5 ; done ● while :;do iwlist wlan0 scan |awk -F\" '/ESSID/{print $2}' |espeak;done

Windows = Fast Food Mac = Expensive restaurant dinner iOS/Android = Vending machine snacks Linux = Home cooked meal Loops Figure out which years Nov 21st was on a Friday.

for y in {1970..2017} ; do [[ $( date -d $y-11-21 +%u ) -eq 5 ]] && echo $y ; done

Bad winters bring good software, and more programmers. Loops Send output of one loop down the pipeline into another loop.

for grass in field* ; do mow $grass; done | grep -v weeds \ | while read -r hay; do bale $hay; done

Distrust all claims for "one true way". -- "The Art of Unix Programming" by Eric S. Raymond . -name .htaccess | xargs egrep -l "(deny|allow)" ● look . | egrep "^[a-z]{1,4}$" | xargs -P 40 -I{} \ curl -L -sI -o www.{}.com http://www.{}.com ● xargs < file.txt

Big commands only looks complex when you look at the whole command at once; Break it down; Its not a picture. Putting it all together ● echo 192.168.0.{1..254}| xargs -n1 -d' ' -P254 -I{} \ ping -w1 -c1 {} 2>/dev/null| awk '/ttl/{print $4}'

%1 ; cd /pub && more beer Other useful commands (incomplete) ● tmux or screen ● script -t ~/myshell.script 2>~/myshell.time ● netcat and socat ● zcat, zless, zgrep and their cousins bzless, xzless, etc. ● sponge ● pee ● grep 67.205.74.88 messages |sponge |pee "head -1" "tail -1" ● ngrep -d eth0 -i 'select' port 3306 ● parcellite (clipboard/selection )

"I couldn't figure out how to quit so I rebooted the system." --[name censored to protect the innocent] Thank you for coming

● First of all special thanks to my family for the support. ● Petr Hodač and others from FIT for helping to host and organize this event. ● Czech Technical University for hosting this event. ● The many dedicated people who make open source great.

And thanks for reading this section too.