142
Useless Use of * Slide 1 Useless Use of * Jan Schaumann [email protected] PGP: 136D 027F DC29 8402 7B42 47D6 7C5B 64AF AF22 6A4C Jan Schaumann SCALE5x

Schaum Ann

Embed Size (px)

DESCRIPTION

schaum

Citation preview

Page 1: Schaum Ann

Useless Use of * Slide 1

Useless Use of *

Jan [email protected]

PGP: 136D 027F DC29 8402 7B42 47D6 7C5B 64AF AF22 6A4C

Jan Schaumann SCALE5x

Page 2: Schaum Ann

Useless Use of * Slide 2

whoami

$ ME=$(id -un)

$ grep ${ME} /etc/passwd | cut -d: -f5

Jan Schaumann

$

Jan Schaumann SCALE5x

Page 3: Schaum Ann

Useless Use of * Slide 3

whoami

$ ME=$(id -un)

$ grep ${ME} /etc/passwd | cut -d: -f5

Jan Schaumann

$ groups ${ME}

netbsd sa yahoo

$

Jan Schaumann SCALE5x

Page 4: Schaum Ann

Useless Use of * Slide 4

whoami

$ ME=$(id -un)

$ grep ${ME} /etc/passwd | cut -d: -f5

Jan Schaumann

$ groups ${ME}

netbsd sa yahoo

$

Jan Schaumann SCALE5x

Page 5: Schaum Ann

Useless Use of * Slide 5

whoami

$ ME=$(id -un)

$ grep ${ME} /etc/passwd | cut -d: -f5

Jan Schaumann

$ groups ${ME}

netbsd sa yahoo

$

Jan Schaumann SCALE5x

Page 6: Schaum Ann

Useless Use of * Slide 6

whoami

$ ME=$(id -un)

$ grep ${ME} /etc/passwd | cut -d: -f5

Jan Schaumann

$ groups ${ME}

netbsd sa yahoo

$

Jan Schaumann SCALE5x

Page 7: Schaum Ann

Useless Use of * Slide 7

whoami

$ ME=$(id -un)

$ grep ${ME} /etc/passwd | cut -d: -f5

Jan Schaumann

$ groups ${ME}

netbsd sa yahoo

$

Jan Schaumann SCALE5x

Page 8: Schaum Ann

Useless Use of * Slide 8

whoami

$ ME=$(id -un)

$ grep ${ME} /etc/passwd | cut -d: -f5

Jan Schaumann

$ groups ${ME}

netbsd sa yahoo

$

http://pipes.yahoo.com

Jan Schaumann SCALE5x

Page 9: Schaum Ann

Useless Use of * Slide 9

Useless Use of... what?

Back in the day...

Jan Schaumann SCALE5x

Page 10: Schaum Ann

Useless Use of * Slide 10

Useless Use of... what?

Back in the day...

Jan Schaumann SCALE5x

Page 11: Schaum Ann

Useless Use of * Slide 11

Useless Use of... what?

Back in the day...

The Operator

Jan Schaumann SCALE5x

Page 12: Schaum Ann

Useless Use of * Slide 12

Useless Use of... what?

Back in the day...

BOFH

Jan Schaumann SCALE5x

Page 13: Schaum Ann

Useless Use of * Slide 13

Useless Use of... what?

Back in the day...

Jan Schaumann SCALE5x

Page 14: Schaum Ann

Useless Use of * Slide 14

Useless Use of... what?

Back in the day...

Jan Schaumann SCALE5x

Page 15: Schaum Ann

Useless Use of * Slide 15

Useless Use of... what?

Back in the day...

Jan Schaumann SCALE5x

Page 16: Schaum Ann

Useless Use of * Slide 16

Useless Use of... what?

Back in the day...

Jan Schaumann SCALE5x

Page 17: Schaum Ann

Useless Use of * Slide 17

Useless Use of... what?

comp.unix.shell

Jan Schaumann SCALE5x

Page 18: Schaum Ann

Useless Use of * Slide 18

Useless Use of... what?

I have a bunch of text files that contain strings

containing /u. I no longer want them to contain

/u ex: /u/appl/ should be /appl/....

Should I use awk? sed? Help!

Jan Schaumann SCALE5x

Page 19: Schaum Ann

Useless Use of * Slide 19

Useless Use of... what?

> I have a bunch of text files that contain strings

> containing /u. I no longer want them to contain

> /u ex: /u/appl/ should be /appl/....

>

> Should I use awk? sed? Help!

cat file | sed -e "s!/u/!/!"

Jan Schaumann SCALE5x

Page 20: Schaum Ann

Useless Use of * Slide 20

Useless Use of Cat

Jan Schaumann SCALE5x

Page 21: Schaum Ann

Useless Use of * Slide 21

Useful Use of Cat (?)

The obvious:cat file | grep pattern

cat file | awk ’{ print $2; }’

Jan Schaumann SCALE5x

Page 22: Schaum Ann

Useless Use of * Slide 22

Useless Use of Cat

The obvious:cat file | grep pattern

cat file | awk ’{ print $2; }’

Jan Schaumann SCALE5x

Page 23: Schaum Ann

Useless Use of * Slide 23

Useless Use of Cat

The obvious:cat file | grep pattern

grep pattern file

cat file | awk ’{ print $2; }’

awk ’{ print $2; }’ < file

Jan Schaumann SCALE5x

Page 24: Schaum Ann

Useless Use of * Slide 24

Useful Use of Cat (?)

cat file1 file2 file3 | wc -l

cat file1 file2 file3 | wc -w

Jan Schaumann SCALE5x

Page 25: Schaum Ann

Useless Use of * Slide 25

Useless Use of Cat

cat file1 file2 file3 | wc -l

cat file1 file2 file3 | wc -w

Jan Schaumann SCALE5x

Page 26: Schaum Ann

Useless Use of * Slide 26

Useless Use of Cat

cat file1 file2 file3 | wc -l

awk ’END { print NR }’ file1 file2 file3

cat file1 file2 file3 | wc -w

awk ’{w = w + NF} END { print w }’ file1 file2 file3

Jan Schaumann SCALE5x

Page 27: Schaum Ann

Useless Use of * Slide 27

Useful Use of Cat (?)

cat file1 file2 file3 | grep pattern

if [ $(cat files | grep -c pattern) -gt 0 ]; then

Jan Schaumann SCALE5x

Page 28: Schaum Ann

Useless Use of * Slide 28

Useless Use of Cat

cat file1 file2 file3 | grep pattern

if [ $(cat files | grep -c pattern) -gt 0 ]; then

Jan Schaumann SCALE5x

Page 29: Schaum Ann

Useless Use of * Slide 29

Useless Use of Cat

cat file1 file2 file3 | grep pattern

grep -h pattern file1 file2 file3

if [ $(cat files | grep -c pattern) -gt 0 ]; then

Jan Schaumann SCALE5x

Page 30: Schaum Ann

Useless Use of * Slide 30

Useless Use of Cat

cat file1 file2 file3 | grep pattern

grep -h pattern file1 file2 file3

awk ’/pattern/ { print }’ file1 file2 file3

if [ $(cat files | grep -c pattern) -gt 0 ]; then

Jan Schaumann SCALE5x

Page 31: Schaum Ann

Useless Use of * Slide 31

Useless Use of Cat

cat file1 file2 file3 | grep pattern

grep -h pattern file1 file2 file3

awk ’/pattern/ { print }’ file1 file2 file3

if [ $(cat files | grep -c pattern) -gt 0 ]; then

if [ -n ”$(grep -l pattern files)” ]; then

Jan Schaumann SCALE5x

Page 32: Schaum Ann

Useless Use of * Slide 32

Useless Use of Cat

cat file1 file2 file3 | grep pattern

grep -h pattern file1 file2 file3

awk ’/pattern/ { print }’ file1 file2 file3

if [ $(cat files | grep -c pattern) -gt 0 ]; then

if [ -n "$(grep -l pattern files)" ]; then

if grep pattern files >/dev/null 2>&1; then

Jan Schaumann SCALE5x

Page 33: Schaum Ann

Useless Use of * Slide 33

Useful Use of Cat

concatenate and print files

Jan Schaumann SCALE5x

Page 34: Schaum Ann

Useless Use of * Slide 34

Useful Use of Cat

concatenate and print files (D’oh!)

cat * > file

Jan Schaumann SCALE5x

Page 35: Schaum Ann

Useless Use of * Slide 35

Useful Use of Cat

concatenate and print files (D’oh!)

cat * > file

feed file as input to another command in a particular order

Jan Schaumann SCALE5x

Page 36: Schaum Ann

Useless Use of * Slide 36

Useful Use of Cat

concatenate and print files (D’oh!)

cat * > file

feed file as input to another command in a particular order

{ echo $VAR1; cat file; cmd1; } | command

Jan Schaumann SCALE5x

Page 37: Schaum Ann

Useless Use of * Slide 37

Useful Use of Cat

concatenate and print files (D’oh!)

cat * > file

feed file as input to another command in a particular order

{ echo $VAR1; cat file; cmd1; } | command

use as a NOOP

Jan Schaumann SCALE5x

Page 38: Schaum Ann

Useless Use of * Slide 38

Useful Use of Cat

concatenate and print files (D’oh!)

cat * > file

feed file as input to another command in a particular order

{ echo $VAR1; cat file; cmd1; } | command

use as a NOOP

if condition; then

cmd1 | cmd2 | cmd3

else

cmd1 | cmd3

fi

Jan Schaumann SCALE5x

Page 39: Schaum Ann

Useless Use of * Slide 39

Useful Use of Cat

concatenate and print files (D’oh!)

cat * > file

feed file as input to another command in a particular order

{ echo $VAR1; cat file; cmd1; } | command

use as a NOOP

if condition; then

filter=cmd2

else

filter=cat

fi

cmd1 | ${filter} | cmd3

Jan Schaumann SCALE5x

Page 40: Schaum Ann

Useless Use of * Slide 40

Useful Use of Cat

CAT5

CAT6

Jan Schaumann SCALE5x

Page 41: Schaum Ann

Useless Use of * Slide 41

Why bother?

Jan Schaumann SCALE5x

Page 42: Schaum Ann

Useless Use of * Slide 42

Why bother?

$2.95

Jan Schaumann SCALE5x

Page 43: Schaum Ann

Useless Use of * Slide 43

Why bother?

$5.90

Jan Schaumann SCALE5x

Page 44: Schaum Ann

Useless Use of * Slide 44

Why bother?

$11.80

Jan Schaumann SCALE5x

Page 45: Schaum Ann

Useless Use of * Slide 45

Why bother?

$23.60

Jan Schaumann SCALE5x

Page 46: Schaum Ann

Useless Use of * Slide 46

Why bother?

Jan Schaumann SCALE5x

Page 47: Schaum Ann

Useless Use of * Slide 47

Why bother?

$47.20

Jan Schaumann SCALE5x

Page 48: Schaum Ann

Useless Use of * Slide 48

Why bother?

$94.4

Jan Schaumann SCALE5x

Page 49: Schaum Ann

Useless Use of * Slide 49

Why bother?

Jan Schaumann SCALE5x

Page 50: Schaum Ann

Useless Use of * Slide 50

Why bother?

Jan Schaumann SCALE5x

Page 51: Schaum Ann

Useless Use of * Slide 51

But...

Jan Schaumann SCALE5x

Page 52: Schaum Ann

Useless Use of * Slide 52

But...

... I run my scripts only once!

Jan Schaumann SCALE5x

Page 53: Schaum Ann

Useless Use of * Slide 53

But...

... I have super fast hardware!

Jan Schaumann SCALE5x

Page 54: Schaum Ann

Useless Use of * Slide 54

But...

... I have super fast hardware!$ uptime

10:36AM up 254 days, 4 users, load averages: 80.12, 75.51, 72.40

$

Jan Schaumann SCALE5x

Page 55: Schaum Ann

Useless Use of * Slide 55

But...

... nobody else but me uses my code!

Jan Schaumann SCALE5x

Page 56: Schaum Ann

Useless Use of * Slide 56

Oh, really?

Unfortunately, you really have no control over your code:

Jan Schaumann SCALE5x

Page 57: Schaum Ann

Useless Use of * Slide 57

Oh, really?

Unfortunately, you really have no control over your code:

code grows

Jan Schaumann SCALE5x

Page 58: Schaum Ann

Useless Use of * Slide 58

Oh, really?

Unfortunately, you really have no control over your code:

code grows

code is reused

Jan Schaumann SCALE5x

Page 59: Schaum Ann

Useless Use of * Slide 59

Oh, really?

Unfortunately, you really have no control over your code:

code grows

code is reused

code moves with you

Jan Schaumann SCALE5x

Page 60: Schaum Ann

Useless Use of * Slide 60

Oh, really?

Unfortunately, you really have no control over your code:

code grows

code is reused

code moves with you

code is left behind

Jan Schaumann SCALE5x

Page 61: Schaum Ann

Useless Use of * Slide 61

Oh, really?

Unfortunately, you really have no control over your code:

code grows

code is reused

code moves with you

code is left behind

It’s alive!

Jan Schaumann SCALE5x

Page 62: Schaum Ann

Useless Use of * Slide 62

Oh, really?

Jan Schaumann SCALE5x

Page 63: Schaum Ann

Useless Use of * Slide 63

Oh, really?

Jan Schaumann SCALE5x

Page 64: Schaum Ann

Useless Use of * Slide 64

Useless Use of *

Useless Use of Cat

Jan Schaumann SCALE5x

Page 65: Schaum Ann

Useless Use of * Slide 65

Useless Use of *

Useless Use of *

Jan Schaumann SCALE5x

Page 66: Schaum Ann

Useless Use of * Slide 66

Useless Use of Grep

Jan Schaumann SCALE5x

Page 67: Schaum Ann

Useless Use of * Slide 67

Useless Use of Grep

Of course, all use of grep(1) is useless!

Jan Schaumann SCALE5x

Page 68: Schaum Ann

Useless Use of * Slide 68

Useless Use of Grep

Of course, all use of grep(1) is useless!

echo g/RE/p | ed -s file

Jan Schaumann SCALE5x

Page 69: Schaum Ann

Useless Use of * Slide 69

Useful Use of Grep (?)

host hostname | grep ’has address’ | awk ’{ print $NF }’

echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’

Jan Schaumann SCALE5x

Page 70: Schaum Ann

Useless Use of * Slide 70

Useless Use of Grep

host hostname | grep ’has address’ | awk ’{ print $NF }’

echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’

Jan Schaumann SCALE5x

Page 71: Schaum Ann

Useless Use of * Slide 71

Useless Use of Grep

host hostname | grep ’has address’ | awk ’{ print $NF }’

host hostname | awk ’/has address/ { print $NF }’

echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’

Jan Schaumann SCALE5x

Page 72: Schaum Ann

Useless Use of * Slide 72

Useless Use of Grep

host hostname | grep ’has address’ | awk ’{ print $NF }’

host hostname | awk ’/has address/ { print $NF }’

echo ${string} | grep ’pattern’ | sed -e ’s/foo/bar/’

echo ${string} | sed -ne ’/pattern/ s/foo/bar/p’

Jan Schaumann SCALE5x

Page 73: Schaum Ann

Useless Use of * Slide 73

Useful Use of Grep (?)

grep pattern1 file ... | grep -v pattern2

grep pattern1 file | grep -v ^# | grep -v pattern2

Jan Schaumann SCALE5x

Page 74: Schaum Ann

Useless Use of * Slide 74

Useless Use of Grep

grep pattern1 file ... | grep -v pattern2

grep pattern1 file | grep -v ^# | grep -v pattern2

Jan Schaumann SCALE5x

Page 75: Schaum Ann

Useless Use of * Slide 75

Useless Use of Grep

grep pattern1 file ... | grep -v pattern2

awk ’/pattern1/ && !/pattern2/ { print }’ file ...

grep pattern1 file | grep -v ^# | grep -v pattern2

Jan Schaumann SCALE5x

Page 76: Schaum Ann

Useless Use of * Slide 76

Useless Use of Grep

grep pattern1 file ... | grep -v pattern2

awk ’/pattern1/ && !/pattern2/ { print }’ file ...

grep pattern1 file | grep -v ^# | grep -v pattern2

awk ’/pattern1/ && !/(ˆ#)|(pattern2)/ { print }’ file

Jan Schaumann SCALE5x

Page 77: Schaum Ann

Useless Use of * Slide 77

Useful Use of Sed (?)

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

ls ${p}

done

Jan Schaumann SCALE5x

Page 78: Schaum Ann

Useless Use of * Slide 78

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

ls ${p}

done

Jan Schaumann SCALE5x

Page 79: Schaum Ann

Useless Use of * Slide 79

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

IFS=":"; for p in ${PATH}; do

ls ${p}

done

Jan Schaumann SCALE5x

Page 80: Schaum Ann

Useless Use of * Slide 80

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

IFS=":"; for p in ${PATH}; do

ls ${p}

done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’

Sed

Jan Schaumann SCALE5x

Page 81: Schaum Ann

Useless Use of * Slide 81

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

IFS=":"; for p in ${PATH}; do

ls ${p}

done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’

Mknod ?

Jan Schaumann SCALE5x

Page 82: Schaum Ann

Useless Use of * Slide 82

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

IFS=":"; for p in ${PATH}; do

ls ${p}

done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’

Groff ?

Jan Schaumann SCALE5x

Page 83: Schaum Ann

Useless Use of * Slide 83

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

IFS=":"; for p in ${PATH}; do

ls ${p}

done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’

Shlock ?

Jan Schaumann SCALE5x

Page 84: Schaum Ann

Useless Use of * Slide 84

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

IFS=":"; for p in ${PATH}; do

ls ${p}

done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’

Route ?

Jan Schaumann SCALE5x

Page 85: Schaum Ann

Useless Use of * Slide 85

Useless Use of Sed

for p in $(echo ${PATH} | sed -e ’s/:/ /’); do

IFS=":"; for p in ${PATH}; do

ls ${p}

done | awk ’BEGIN { srand() } { if (NR == int(rand()*100)) { print }}’

Dump ?

Jan Schaumann SCALE5x

Page 86: Schaum Ann

Useless Use of * Slide 86

Useless Use of Sed

Jan Schaumann SCALE5x

Page 87: Schaum Ann

Useless Use of * Slide 87

Useful Use of Sed (?)

VAR1="foo-bar-baz"

VAR2=$(echo ${VAR1} | sed -e ’s/-baz//’)

Jan Schaumann SCALE5x

Page 88: Schaum Ann

Useless Use of * Slide 88

Useless Use of Sed

VAR1="foo-bar-baz"

VAR2=$(echo ${VAR1} | sed -e ’s/-baz//’)

Jan Schaumann SCALE5x

Page 89: Schaum Ann

Useless Use of * Slide 89

Useless Use of Sed

VAR1="foo-bar-baz"

VAR2=$(echo ${VAR1} | sed -e ’s/-baz//’)

VAR2=${VAR1%-baz}

Jan Schaumann SCALE5x

Page 90: Schaum Ann

Useless Use of * Slide 90

Useful Use of Sed (?)

Looping over values in a variable:

VAR1="foo-bar-baz"

for i in $(echo ${VAR1} | sed -e ’s/-/ /g’); do

the_needful $i

done

Jan Schaumann SCALE5x

Page 91: Schaum Ann

Useless Use of * Slide 91

Useless Use of Sed

Looping over values in a variable:VAR1="foo-bar-baz"

for i in $(echo ${VAR1} | sed -e ’s/-/ /g’); do

IFS=-

for i in ${VAR1}; do

the_needful $i

done

Jan Schaumann SCALE5x

Page 92: Schaum Ann

Useless Use of * Slide 92

Useful Use of Sed (?)

Assigning variables:

VAR1="foo-bar-baz"

VAR_A=$(echo ${VAR} | sed -e ’s/-*//’)

VAR_B=$(echo ${VAR} | sed -e ’s/[^-]*-\([^-]*\)-.*/\1/’)

VAR_C=$(echo ${VAR} | sed -e ’s/.*-//’)

Jan Schaumann SCALE5x

Page 93: Schaum Ann

Useless Use of * Slide 93

Useless Use of Sed

Assigning variables:VAR1="foo-bar-baz"

VAR A=$(echo ${VAR} | sed -e ’s/-*//’)

VAR B=$(echo ${VAR} | sed -e ’s/[^-]*-[ˆ−]-.*/\1/’)

VAR C=$(echo ${VAR} | sed -e ’s/.*-//’)

IFS=-

set -- ${VAR1}

VAR_A="${1}"

VAR_B="${2}"

VAR_C="${3}"

Jan Schaumann SCALE5x

Page 94: Schaum Ann

Useless Use of * Slide 94

Useless Use of ...

Dude, IFS + shell is Teh Roxor!!!1Look, Ma: Reading a CSV with Shell Only!

IFS=","

while read -r field1 waste field3 field4 waste; do

echo "${field1}: ${field4} --> ${field3}"

done <file

Jan Schaumann SCALE5x

Page 95: Schaum Ann

Useless Use of * Slide 95

Useless Use of Shell Only

$ cat >script.sh

IFS=","

while read -r waste field2 field3 waste; do

echo "${field1}: ${field4} --> ${field3}"

done <file

^D

$ wc -l file

111061 file

$ time sh script.sh >/dev/null

12.33s real 3.30s user 8.54s system

$

Jan Schaumann SCALE5x

Page 96: Schaum Ann

Useless Use of * Slide 96

Useless Use of Shell Only

Awk to the rescue!

$ cat >script2.sh

awk -F"," ’{ print $1 ": " $4 " --> " $3 }’ <file

^D

$ time sh script2.sh >/dev/null

1.08s real 1.08s user 0.00s system

$

Jan Schaumann SCALE5x

Page 97: Schaum Ann

Useless Use of * Slide 97

Useful Use of Ls (?)

for file in $(ls *pattern*); do

the_needful

done

Jan Schaumann SCALE5x

Page 98: Schaum Ann

Useless Use of * Slide 98

Useless Use of Ls

for file in $(ls *pattern*); do

for file in *pattern*; do

the_needful

done

Jan Schaumann SCALE5x

Page 99: Schaum Ann

Useless Use of * Slide 99

Useful Use of Wc (?)

VAR=$(cat file | wc -l | sed -e ’s/ *//g)’

Jan Schaumann SCALE5x

Page 100: Schaum Ann

Useless Use of * Slide 100

Useful Use of Wc (?)

VAR=$(cat file | wc -l | sed -e ’s/ *//g’)

VAR=$(wc -l <file| sed -e ’s/ *//g)’

Jan Schaumann SCALE5x

Page 101: Schaum Ann

Useless Use of * Slide 101

Useless Use of ... ?

VAR=$(cat file | wc -l | sed -e ’s/ *//g’)

VAR=$(wc -l <file| sed -e ’s/ *//g)’

Jan Schaumann SCALE5x

Page 102: Schaum Ann

Useless Use of * Slide 102

Useless Use of ... ?

VAR=$(cat file | wc -l | sed -e ’s/ *//g’)

VAR=$(wc -l <file| sed -e ’s/ *//g)’

Jan Schaumann SCALE5x

Page 103: Schaum Ann

Useless Use of * Slide 103

Useless Use of ... ?

VAR=$(cat file | wc -l | sed -e ’s/ *//g’)

VAR=$(wc -l <file| sed -e ’s/ *//g)’

VAR=$(awk ’END { print NR }’ file)

Jan Schaumann SCALE5x

Page 104: Schaum Ann

Useless Use of * Slide 104

Useless Use of Sed

VAR=$(cat file | wc -l | sed -e ’s/ *//g’)

VAR=$(wc -l <file| sed -e ’s/ *//g)’

VAR=$(wc -l <file)

Jan Schaumann SCALE5x

Page 105: Schaum Ann

Useless Use of * Slide 105

Useless Use of Sed

VAR=$(cat file | wc -l | sed -e ’s/ *//g’)

VAR=$(wc -l <file| sed -e ’s/ *//g)’

VAR=$(wc -l <file)

echo "${VAR}"

Jan Schaumann SCALE5x

Page 106: Schaum Ann

Useless Use of * Slide 106

Useless Use of Sed

VAR=$(cat file | wc -l | sed -e ’s/ *//g’)

VAR=$(wc -l <file| sed -e ’s/ *//g)’

VAR=$(wc -l <file)

echo "${VAR}"

echo ${VAR}

Jan Schaumann SCALE5x

Page 107: Schaum Ann

Useless Use of * Slide 107

Useful Use of Head (?)

command1 | head -1 | sed -e ’s/pattern/string/’

command1 | head -10 | sed -e ’s/pattern/string/’

Jan Schaumann SCALE5x

Page 108: Schaum Ann

Useless Use of * Slide 108

Useless Use of Head

command1 | head -1 | sed -e ’s/pattern/string/’

command1 | sed -e ’s/pattern/string/;q’

command1 | head -10 | sed -e ’s/pattern/string/’

Jan Schaumann SCALE5x

Page 109: Schaum Ann

Useless Use of * Slide 109

Useless Use of Head

command1 | head -1 | sed -e ’s/pattern/string/’

command1 | sed -e ’s/pattern/string/;q’

command1 | head -10 | sed -e ’s/pattern/string/’

command1 | awk ’{ if (NR <= 10) { print gensub("pattern","string",0); } }’

Jan Schaumann SCALE5x

Page 110: Schaum Ann

Useless Use of * Slide 110

Useful Use of Tail (?)

command1 | tail -1 | sed -e ’s/pattern/string/’

Jan Schaumann SCALE5x

Page 111: Schaum Ann

Useless Use of * Slide 111

Useless Use of Tail

command1 | tail -1 | sed -e ’s/pattern/string/’

command1 | awk ’END { print gensub("pattern","string",0); exit; }’

Jan Schaumann SCALE5x

Page 112: Schaum Ann

Useless Use of * Slide 112

Useful Use of Tail (?)

command1 | tail -10 | sed -e ’s/pattern/string/’

Jan Schaumann SCALE5x

Page 113: Schaum Ann

Useless Use of * Slide 113

Useful Use of Tail

command1 | tail -10 | sed -e ’s/pattern/string/’

Jan Schaumann SCALE5x

Page 114: Schaum Ann

Useless Use of * Slide 114

Useful Use of Expr (?)

echo $(expr $i + $i)

Jan Schaumann SCALE5x

Page 115: Schaum Ann

Useless Use of * Slide 115

Useless Use of Expr

echo $(expr $i + $i)

echo $(( $i + $i ))

Jan Schaumann SCALE5x

Page 116: Schaum Ann

Useless Use of * Slide 116

Useless Use of Expr

echo $(expr $i + $i)

echo $(( $i + $i ))

echo $(( $i << 1 ))

This even lets you do binary manipulation (binary and, or, xor, not, leftshift, rightshift).

Jan Schaumann SCALE5x

Page 117: Schaum Ann

Useless Use of * Slide 117

Useless Use of Expr

echo $(expr $i + $i)

echo $(( $i + $i ))

echo $(( $i << 1 ))

This even lets you do binary manipulation (binary and, or, xor, not, leftshift, rightshift).

$ x=5

$ y=12

$ x=$(( ${x} ^ ${y} ))

$ y=$(( ${x} ^ ${y} ))

$ x=$(( ${x} ^ ${y} ))

$ echo "x=${x}; y=${y}"

x=12; y=5

$

Jan Schaumann SCALE5x

Page 118: Schaum Ann

Useless Use of * Slide 118

Most Egregiously Useless Use of Perl

perl -e "print \"y\\nn\\n\";" | cmd

Jan Schaumann SCALE5x

Page 119: Schaum Ann

Useless Use of * Slide 119

Most Egregiously Useless Use of Perl

perl -e "print \"y\\nn\\n\";" | cmd

( echo y; echo n; ) | cmd

Jan Schaumann SCALE5x

Page 120: Schaum Ann

Useless Use of * Slide 120

Most Egregiously Useless Use of Perl

perl -e "print \"y\\nn\\n\";" | cmd

( echo y; echo n; ) | cmd

{ echo y; echo n; } | cmd

printf "y\nn\n" | cmd

Jan Schaumann SCALE5x

Page 121: Schaum Ann

Useless Use of * Slide 121

Shell Coding: Performance

avoid file I/O

avoid Useless Use of *:

use builtins when you can

avoid builtins when it makes sense

use the right tool for the job

avoid spawning subshells (+1 fork) or pipes (n+1 forks)

Jan Schaumann SCALE5x

Page 122: Schaum Ann

Useless Use of * Slide 122

Shell Coding: Performance

avoid file I/O

avoid Useless Use of *:

use builtins when you can

avoid builtins when it makes sense

use the right tool for the job

avoid spawning subshells (+1 fork) or pipes (n+1 forks)

cut -f2 vs. awk ’{print $2}’

$ stat -f "%z %N" /usr/bin/awk /usr/bin/cut

133487 /usr/bin/awk

12590 /usr/bin/cut

$

Jan Schaumann SCALE5x

Page 123: Schaum Ann

Useless Use of * Slide 123

Testing Shell Code

make your code modular

clearly define each function:

pre-conditions

valid input

post-conditions

prepare valid input and desired output of each function

prepare invalid input and desired output of each function

Jan Schaumann SCALE5x

Page 124: Schaum Ann

Useless Use of * Slide 124

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

Jan Schaumann SCALE5x

Page 125: Schaum Ann

Useless Use of * Slide 125

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

$ cat >script.sh

set -u

echo ${FOO}

echo "done"

^D

$ sh script.sh

script.sh: FOO: parameter not set

$ echo $?

2

$

Jan Schaumann SCALE5x

Page 126: Schaum Ann

Useless Use of * Slide 126

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

$ cat >script.sh

set -e

ls /nowhere

echo "done"

^D

$ sh script.sh

ls: /nowhere: No such file or directory

$

Jan Schaumann SCALE5x

Page 127: Schaum Ann

Useless Use of * Slide 127

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

$ cat >script.sh

set -e

if ! ls /nowhere; then

echo "ls failed"

fi

echo "done"

^D

$ sh script.sh

ls: /nowhere: No such file or directory

ls failed

done

$

Jan Schaumann SCALE5x

Page 128: Schaum Ann

Useless Use of * Slide 128

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

$ cat >script.sh

readonly VAR="foo"

VAR="bar"

echo ${VAR}

^D

$ sh script.sh

script.sh: VAR: is read only

$

Jan Schaumann SCALE5x

Page 129: Schaum Ann

Useless Use of * Slide 129

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

Jan Schaumann SCALE5x

Page 130: Schaum Ann

Useless Use of * Slide 130

Shell Coding Style: local variables

$ cat s.sh

func () {

input="${1}"

# do something with ${input}

}

$ cat script.sh

. ./s.sh

input="var1 var2 var3"

for var in ${input}; do

func "${var}"

done

echo ${input}

$ sh script.sh

var3

$

Jan Schaumann SCALE5x

Page 131: Schaum Ann

Useless Use of * Slide 131

Shell Coding Style: local variables

$ cat s.sh

func () {

local input="${1}"

# do something with ${input}

}

$ cat script.sh

. ./s.sh

input="var1 var2 var3"

for var in ${input}; do

func "${var}"

done

echo ${input}

$ sh script.sh

var1 var2 var3

$

Jan Schaumann SCALE5x

Page 132: Schaum Ann

Useless Use of * Slide 132

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

Jan Schaumann SCALE5x

Page 133: Schaum Ann

Useless Use of * Slide 133

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

Bad:

# this adds 1 to num

num=$(( ${num} + 1 ))

Jan Schaumann SCALE5x

Page 134: Schaum Ann

Useless Use of * Slide 134

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

Better:

input="pair1l:pair1r pair2l:pair2r"

# extract first pair in input string, throw away rest

p1l=${input%%:*}

rest=${input#*:}

p1r=${rest% *}

Jan Schaumann SCALE5x

Page 135: Schaum Ann

Useless Use of * Slide 135

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

write your code in a modular way

Jan Schaumann SCALE5x

Page 136: Schaum Ann

Useless Use of * Slide 136

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

write your code in a modular way

write test cases for your shell code

Jan Schaumann SCALE5x

Page 137: Schaum Ann

Useless Use of * Slide 137

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

write your code in a modular way

write test cases for your shell code

be consistent in your style

Jan Schaumann SCALE5x

Page 138: Schaum Ann

Useless Use of * Slide 138

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

write your code in a modular way

write test cases for your shell code

be consistent in your style

be consistent in your user interface

Jan Schaumann SCALE5x

Page 139: Schaum Ann

Useless Use of * Slide 139

Shell Coding Style

Writing Shell Code is just like writing any other code:

set -eu (perl-mongers: think -w and use strict;)

use readonly variables

use local variables

comment your code

write your code in a modular way

write test cases for your shell code

be consistent in your style

be consistent in your user interface

be willing to sacrifice performance for readability

Jan Schaumann SCALE5x

Page 140: Schaum Ann

Useless Use of * Slide 140

Shell Coding: Performance vs. Readability

awk -F: -v ME="${ME}" ’{ if ($0 ~ ME) { print $5 }}’ file

vs.

grep ${ME} file | cut -d: -f5

awk ’{w = w + NF} END { print w }’ file1 file2 file3

vs.cat file1 file2 file2 | wc -w

Jan Schaumann SCALE5x

Page 141: Schaum Ann

Useless Use of * Slide 141

The KISS Principle

Keep It Simple, Stupid!

Jan Schaumann SCALE5x

Page 142: Schaum Ann

Useless Use of * Slide 142

Useless Use of time (?)

Thanks!

Jan Schaumann SCALE5x