Pull to refresh

Comments 18

Рассказывая об AWK, не рассказали про главное, про паттерны перед блоками кода:


awk '$1 > 0 {print $2}' file # вывести второе поле только если первое > 0
awk '$1 > 0, length($0) == 0 {…}' file # обработать строки, начиная с той у которой $1>0 и до первой пустой строки
awk '/re/ {…}' file # обработать строки соответствующие регекспу

и т.д.

Ещё на awk очень прямолинейно делаются конечные автоматы. Собственно это следствие патернматчинга.


BEGIN {state=0}
$1 > 0  {state=1; next;}
$1 <= 0 {state=2; next;}
/re/, state==1 {print $4; state=0; next;}
/re/, state==2 {print $5; state=0; next;}

Ай лажу на скорую руку написал: не попадаем мы в /re/ условие. Но думаю прицип я понятно изложил.

В принципе, все, что может awk, можно сделать и на чистом bash. Кроме математики, раве что.
Однострочники на python?

Под каждой статьей про баш находится человек, который начинает рассказывать про какие-то ограничения баша. Типа "это не будет работать, если в имени файла будет пробел", "это сломается, если строка будет пустой". Однострочник будет на 20% длиннее, зато наверное, ошибаться реже.

Не смотря на то что я один из «тех людей», я операционные скрипты пишу на баше и на Python перехожу если возникает необходимость обрабатывать массивы данных сложнее одноуровнего поля и если использую Ansible.

Однострочник будет на 20% длиннее

find "${DIR1}/" "${DIR2}/" -mindepth 2 -maxdepth 4 -type f -mtime +"${days_process}" -print0 | tee -a /path/to/logs/processed_files.txt | xargs -0 -I{} -P "$(($(nproc) -1))" -n 1 iconv -f "big5" -t "utf-8" -o "{}_processed" {}
Ну, если просто ответить на Ваше негодование — есть ";" для разделения операторов.
Так что да, это реально.
Другое дело, что это ужасно и не должно применяться на практике.
Негодования не было, вам показалось ;)
Было удивление, но совсем небольшое. Псто смысл однострочника — быстро решить одноразовую задачу и забыть. Поэтому делать его длиннее — странно.

Bash, awk и sed, как любой специализированный язык программирования, имеют ряд специально заточенных примитивов, которые в языках общего назначения (python, например) реализуются синтаксически довольно громоздко.


Например аналог


LC_ALL=C  echo -n label $(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | awk '/percentage/ {print $2}') '|' $(uptime | sed 's/.*://; s/, / /g') '|' $(date)

по моим ощущениям на python займет примерно строк 150


Приемущество python над *sh в большем контроле на структурами данных и инкапсуляцией. Таким образом когда надо рулить например кучей json/yaml файлов именно python является хорошим кондидатом на лидерство.


Некоторое промежуточное состояние занимает perl: структуры в нем не хуже python, а некоторые примитивы напрямую унаследованы из shell и awk (perl был придуман именно как попытка решить практические проблемы с awk)

А вот есть у вас, к примеру гигабайтный текстовый лог. И его надо как-то обработать. Попробуйте сделать это перлом или питоном, а потом awk-ом. Только обязательно померяйте скорость.
зависит от задачи, сложную логику обработки с большим числом условий, циклов и внутренних структур даже пытаться не буду писать на awk/bash если есть python, только если есть ограничения, из-за которых ЯВУ нет возможности использовать, ну или на спор :)
приходилось мне как-то поддерживать внутренний биллинг провайдера, написанный на смеси sed+awk+bash, это такой нечитаемый ад.

но в повседневной жизни активно использую awk/sed/bash/python, опять-таки повторюсь зависит от задач и контекста.
Я говорю о реальном случае, с которым пришлось столкнуться. Ежедневный парсинг логов, справиться с которыми (по быстродействию, в связи с их объёмом) смог только awk. Альтернативы не было.
Если вы про свою персоналку — то питон у вас есть. А если вы делаете инсталятор на любую машину? А если у вас встроенная система с busybox? Связка bash+awl+sed есть везде.
А зачем нужен инсталлятор на любую машину? На правильных машинах есть package manager. На встроенных системах гигабайтные логи не ворочают.
Ну как пример инсталятор от MOXA. По ссылке «Набор инструментов разработчика», то есть toolchain. Там sh-скрипт, но он ставится на любую x86ую linux-машину. То есть не только debian и ubuntu, а ещё и всякие RPM-based.

Тем же путем apache и PHP ставятся на саму железку. На апач там места хватило, на базу package-manegder его жалко. Ну как-то не принято их ставить на buildroot.

Можете на своем роутере посмотреть — есть ли питон и есть ли package manager. И каким путем он себе прошивку обновляет.
Sign up to leave a comment.