Сила ваших кончиков пальцев

Владимир Епифанов, Ostrovok.ru

Кто я

  • Владимир Епифанов
  • @voldmar
  • voldmar@ostrovok.ru
  • разработчик
  • 6 лет FreeBSD, 5 лет Linux
  • 5 лет MacOS X
  • 10 лет vim (и всё ещё учусь)

Почему мне это важно

О чём рассказ

  • sh, bash, zsh
  • Регулярные выражения
  • sed, awk, find, grep etc

sh

  • Голый sh не нужен
  • Везде есть bash
  • Если нет, то поставьте
  • zsh + Oh my zsh
  • Python, Ruby

Основные концепции

  • Файловая система
  • text in, text out
  • pipes
  • 0 == True

Переменные среды

  • VAR=value (без пробелов!)
  • наследование
  • export
  • передача параметров через переменные
  • наоборот нельзя

Файловая система

  • Иерархия
  • Права
  • $HOME, $PWD, $OLD_PWD
  • cd
  • cd -
  • pushd, popd, dirs
  • mkdir -p

Паттерны файловой системы

  • *
  • **
  • ?
  • [a-b]
  • [^a-b]

Паттерны файловой системы

  • {one,two,three}
  • mv file{,old}
  • python convert.py text.{md,html}

Паттерны файловой системы

  • man bash and /Pattern Matching
  • man zshexpn

find

  • Обход файловой системы
  • find {path} {predicates}
  • Кавычки
  • xargs

Предикаты find

  • -name
  • -iname
  • -ftype
  • -newer
  • -delete (только для файлов)
  • -exec
  • -depth, -maxdepth, -mindepth
  • man find

Регулярные выражения

  • a
  • (a|b)
  • a?
  • a*
  • a+
  • a*?
  • [a-z]

sed

  • ed
  • gsed
  • sed -E
  • sed -n
  • sed -i bak

Немного полезного

  • s/foo/bar/
  • s/(foo)bar/baz\1/
  • /start/,/end/s/foo/bar/g
  • 1,/end/s/foo/bar/g
  • man sed

awk

  • CSV et al.
  • awk -F
  • pattern { action }
  • {print $2, $1}
  • man awk

grep

  • grep
  • grep -HRIEn
  • grep -i
  • grep -e
  • grep -f
  • grep -v

Ещё grep

  • grep -q
  • grep -c
  • grep -L # Files without match
  • grep -o
  • grep -A, grep -B, grep -C
  • ack

sort

  • sort -u
  • sort -n
  • sort -t

uniq

  • sort -u # ещё раз
  • uniq -q
  • uniq -c
  • uniq -d

Exempli gratia

voldmar@air ~ % awk '{print $2}' history.txt | sort | uniq -c | sort -r | awk '$1 > 20 {print $0}'

Exempli gratia

579 ls # Look ma, no mc!
386 git
331 cd  # Look ma, no mc again!
321 brew
280 sd
264 vim # Look ma, no pycharm
113 ssh

Exempli gratia

78 rm # Ma!..
64 mv
63 man # RTFM
59 .. # Lazy garfield pic
49 cat
47 echo
46 pip
37 which
36 sv

Exempli gratia

34 grep
30 f
28 mkdir
27 res
24 curl
23 source
23 ipython
21 open

Алиасы и функции

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

Алиасы и функции

alias cdd='cd $(python -c "import django, os.path; print os.path.dirname(django.__file__)")'
alias g='grep --exclude-dir=.git --exclude=tags -RIEHn'
alias ohwait="git st -s --porcelain -uall | awk '{print \$2}' | grep '[.]py\$' | xargs pyflakes"
alias msh="./manage.py mshell"
alias f="find . -name"
alias F="find . -iname"
alias vd='vim $(git diff --name-only | sort -u)'

Алиасы и функции

vack () { vim -q<( ack -H --nocolor --nogroup --column  "$@" ); }
mkmig () { ./manage.py schemamigration --auto $1 $2 }
mkdmig () { ./manage.py datamigration $1 $2 }
mig ()  { ./manage.py migrate $1 --ignore-ghost-migrations }

Алиасы и функции

alias sd="ssh dev2.ostrovok.ru"
alias sv="ssh voldmar.ru"
alias res="while true; do ssh -t dev2.ostrovok.ru proj/ostrota/manage.py runserver 0.0.0.0:8000; sleep 3; done"
alias sres="while true; do ssh -t dev2.ostrovok.ru HTTPS=on proj/ostrota/manage.py runserver 0.0.0.0:8001; sleep 3; done"
alias ipython="python $(which ipython)"

Ввод-вывод в bash/zsh

  • >
  • >>
  • <
  • <<

Ввод-вывод в bash/zsh

  • <()
    • diff <( cmd1 | cmd2 ) <( cmd3 )
  • >()
  • $()
  • $(( ))

Управление

  • for
  • [ ] # Пробел!
  • [[ ]]
  • &&, ||
  • {}
  • ()
  • &, wait

Маководам

  • iTerm 2
  • brew

Почитать

  • Unix Shell Programming (3rd Edition)
  • Advanced Bash Programming
  • @climagic
  • http://www.catonmat.net/series/sed-one-liners-explained
  • http://www.catonmat.net/series/awk-one-liners-explained

Островку нужно ещё больше хороших питонистов!

Вопросы?