Комментарии 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;}
А я вот честно не могу понять зачем нужен баш, авк и сед, если есть питон и подобные.
Под каждой статьей про баш находится человек, который начинает рассказывать про какие-то ограничения баша. Типа "это не будет работать, если в имени файла будет пробел", "это сломается, если строка будет пустой". Однострочник будет на 20% длиннее, зато наверное, ошибаться реже.
Однострочник будет на 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)
приходилось мне как-то поддерживать внутренний биллинг провайдера, написанный на смеси sed+awk+bash, это такой нечитаемый ад.
но в повседневной жизни активно использую awk/sed/bash/python, опять-таки повторюсь зависит от задач и контекста.
Тем же путем apache и PHP ставятся на саму железку. На апач там места хватило, на базу package-manegder его жалко. Ну как-то не принято их ставить на buildroot.
Можете на своем роутере посмотреть — есть ли питон и есть ли package manager. И каким путем он себе прошивку обновляет.
Bash-скрипты, часть 8: язык обработки данных awk