
си оказался для меня пока что слишком сложным, а баш слишком простым, слишком целочисленным (это можно обойти костылями но всё-таки) и без директивы include из-за чего там надо для читабельного кода городить костыль из main "$@" под чудовищной простынёй из функций.
а вот у awk и принцип работы необычный, и синтаксис максимально похож на сишный, и реализацию с логикой можно разнести по разным файлам. ну и плюс это один из языков которым больше 45 лет и которые до сих пор активно используются, по крайней мере я при поиске ответов на стековерфлоу в 90% случаев вижу ванлайнеры на awk.
поэтому я хочу собрать тут разные полезные штуки по авк (по крайней мере мне было интересно) ну и может кто-то поможет если такая помощь понадобится, или сам подкинет что-то полезное.
самый лучший гайд по основам который я видел https://youtu.be/E5aQxIdjT0M?t=651
классический учебник https://rutracker.org/forum/viewtopic.php?t=6412544 но язык там тяжеловат, может мне не хватает знания языка, может просто выражения старомодные.
примеры разных алгоритмов https://www.youtube.com/watch?v=4UGLsRYDfo8
а ещё в awk можно превращать любую нечитаемую awk-хуйню из ответов со стековерфлоу в нормальный понятный код если запустить её с awk -o- 'нечитаемый_ванлайнер'
а вот у awk и принцип работы необычный, и синтаксис максимально похож на сишный, и реализацию с логикой можно разнести по разным файлам. ну и плюс это один из языков которым больше 45 лет и которые до сих пор активно используются, по крайней мере я при поиске ответов на стековерфлоу в 90% случаев вижу ванлайнеры на awk.
поэтому я хочу собрать тут разные полезные штуки по авк (по крайней мере мне было интересно) ну и может кто-то поможет если такая помощь понадобится, или сам подкинет что-то полезное.
самый лучший гайд по основам который я видел https://youtu.be/E5aQxIdjT0M?t=651
классический учебник https://rutracker.org/forum/viewtopic.php?t=6412544 но язык там тяжеловат, может мне не хватает знания языка, может просто выражения старомодные.
примеры разных алгоритмов https://www.youtube.com/watch?v=4UGLsRYDfo8
а ещё в awk можно превращать любую нечитаемую awk-хуйню из ответов со стековерфлоу в нормальный понятный код если запустить её с awk -o- 'нечитаемый_ванлайнер'
Так и не осилил это и не понимаю, зачем оно, когда есть перл. Там тебе и программы на много файлов писать с АРХИТЕКТУРОЙ и неймспейсами, и ванлайнеры, умеющие больше чем sed и awk вместе взятые. Разве только в бизибокс перл не засунешь, но на дженерик x86 машине вообще похуй.
>>029
на опенврт перл весит больше мегабайта https://openwrt.org/packages/pkgdata/perl плюс авк есть вообще везде в том числе на роутерах, а вот для перла надо парсить /etc/os-release для выяснения на какой системе запустили скрипт, каким пакетным менеджером его установить, что делать если это старый роутер, всё место уже занял болвановский запрет с хостлистами и перл ставить вообще некуда.
ну и честно говоря я не осилил перловский синтаксис, мне лень в него вникать когда есть авк с сишным синтаксисом. плюс авк не менялся с 1994 года и любой нагугленный ванлайнер написанный за последние 30 лет будет работать так же как и когда его писали.
на опенврт перл весит больше мегабайта https://openwrt.org/packages/pkgdata/perl плюс авк есть вообще везде в том числе на роутерах, а вот для перла надо парсить /etc/os-release для выяснения на какой системе запустили скрипт, каким пакетным менеджером его установить, что делать если это старый роутер, всё место уже занял болвановский запрет с хостлистами и перл ставить вообще некуда.
ну и честно говоря я не осилил перловский синтаксис, мне лень в него вникать когда есть авк с сишным синтаксисом. плюс авк не менялся с 1994 года и любой нагугленный ванлайнер написанный за последние 30 лет будет работать так же как и когда его писали.
>>032
Так и думал.
Зачем?
Для перла тоже справедливо, там обратную совместимость десятилетиями тянут с недавнего времени стало хуже, но шансы нарваться на протухший код всё ещё ничтожны.
>опенврт
Так и думал.
>надо парсить /etc/os-release для выяснения на какой системе запустили скрипт, каким пакетным менеджером его установить
Зачем?
>любой нагугленный ванлайнер написанный за последние 30 лет будет работать так же как и когда его писали.
Для перла тоже справедливо, там обратную совместимость десятилетиями тянут с недавнего времени стало хуже, но шансы нарваться на протухший код всё ещё ничтожны.
>>016 (OP)
Bash-холопы как всегда соснули у Powershell-бояр.
Bash-холопы как всегда соснули у Powershell-бояр.
>>035
/etc/os-release надо парсить потому что на разных системах ставить пакеты надо разными пакетными менеджерами и я не придумал ничего лучше чем выдернуть инфу через cat /etc/os-release | grep -E -i '^ID=' | sed 's/ID=//g' | sed 's/\"//g' и сделать case-esac для всех популярных дистров включая опенврт. но это в любом случае плохое решение, скрипт должен максимально полагаться на то что уже и так везде предустановлено.
/etc/os-release надо парсить потому что на разных системах ставить пакеты надо разными пакетными менеджерами и я не придумал ничего лучше чем выдернуть инфу через cat /etc/os-release | grep -E -i '^ID=' | sed 's/ID=//g' | sed 's/\"//g' и сделать case-esac для всех популярных дистров включая опенврт. но это в любом случае плохое решение, скрипт должен максимально полагаться на то что уже и так везде предустановлено.
>>016 (OP)
Разве awk не годится только на то чтобы вытащить кусок текста из потока вывода или файла?
Как его можно сравнивать с сишкой и даже с башем, которые вполне полноценные языки?
>си оказался для меня пока что слишком сложным, а баш слишком простым
Разве awk не годится только на то чтобы вытащить кусок текста из потока вывода или файла?
Как его можно сравнивать с сишкой и даже с башем, которые вполне полноценные языки?
>>056
Ну в данном случае дебич здесь только ты, если не понимаешь что питон вообще под такие задачи не заточен.
Ну в данном случае дебич здесь только ты, если не понимаешь что питон вообще под такие задачи не заточен.
>>045
Какие пакеты надо ставить в перл, чтобы написать на нём то же самое, что ты будешь писать на awk, куда ты никаких пакетов ставить, насколько я понимаю, не планируешь?
Это раз. Два - клиент к cpan идёт в комплекте со стандартной либой.
Либо я тебя не понял, либо аргумент, мягко говоря, сомнительный.
>>056
Покажи однострочник на питухоне.
Какие пакеты надо ставить в перл, чтобы написать на нём то же самое, что ты будешь писать на awk, куда ты никаких пакетов ставить, насколько я понимаю, не планируешь?
Это раз. Два - клиент к cpan идёт в комплекте со стандартной либой.
Либо я тебя не понял, либо аргумент, мягко говоря, сомнительный.
>>056
Покажи однострочник на питухоне.
>>055
Он полный по Тьюрингу.
Он полный по Тьюрингу.
>>016 (OP)
Лучший учебник - это жизнь. После того как три дня выясняешь почему абсолютно одинаковые скрипты на одинаковых ос ведут себя по разному просто потому что какая-то либа заменила mawk на gawk, раз и навсегда переходишь на питон.
Лучший учебник - это жизнь. После того как три дня выясняешь почему абсолютно одинаковые скрипты на одинаковых ос ведут себя по разному просто потому что какая-то либа заменила mawk на gawk, раз и навсегда переходишь на питон.
>>055
по ссылке что я давал есть веб-сервер написанный на awk. а вытащить можно и грепом. awk в принципе такой же полноценный язык, по крайней мере по словам Кернигана. драйвера на нём писать не получится, но по такому принципу и питон с джавой можно из полноценных исключить. циклы, условия, ассоциативные массивы там есть, что ещё тебе надо чтобы признать полноценным языком? и главное зачем, свои задачи он делает и делает хорошо.
по ссылке что я давал есть веб-сервер написанный на awk. а вытащить можно и грепом. awk в принципе такой же полноценный язык, по крайней мере по словам Кернигана. драйвера на нём писать не получится, но по такому принципу и питон с джавой можно из полноценных исключить. циклы, условия, ассоциативные массивы там есть, что ещё тебе надо чтобы признать полноценным языком? и главное зачем, свои задачи он делает и делает хорошо.

>>061
Пистон это перлодрочество, конечно, не поощряет, но и не запрещает. Пиши себе свои однострочники.
>однострочник на питухоне
Пистон это перлодрочество, конечно, не поощряет, но и не запрещает. Пиши себе свои однострочники.
>>061
не, пакеты в перл не надо ставить, ставить надо сам перл, на опенврт его нет и нинужна, для большинства роутеров которые на руках у людей в рф он слишком тяжёлый и на эти роутеры не всегда даже запрет с nfq и хостлистами удаётся впихнуть. более того, я погуглил и оказалось что например на федоре предустановлен питон но не предустановлен перл https://www.cyberciti.biz/faq/install-perl-in-fedora-linux-using-dnf-command/ то есть для баш-скрипта с использованием перла надо городить костыль который будет проверять что за система, как проверить что перл установлен, как его установить - много мороки.
я делал баш-портянку которая автоматически обновляет настройки обхода блокировки ютуба (осенью методы блокировки менялись почти каждый день и я заебался каждый день после работы прогонять блокчек вручную) и надо было вытащить адрес GGC чтобы воткнуть в запретовский блокчек, на стековерфлоу нашёл ванлайнер на перле, и выяснилось что он без пакета https://openwrt.org/packages/pkgdata/perl не работает. мне места на роутере хватило конечно, но у меня роутер сильно лучше чем у большинства. а вот awk предустановлен везде и адрес выдёргивает через curl -s "https://www.youtube.com/watch?v=eZD5z7MTvJY" | awk '$1 ~ /googlevideo/ { print substr($0,RSTART+26,RLENGTH+37) }'
не, пакеты в перл не надо ставить, ставить надо сам перл, на опенврт его нет и нинужна, для большинства роутеров которые на руках у людей в рф он слишком тяжёлый и на эти роутеры не всегда даже запрет с nfq и хостлистами удаётся впихнуть. более того, я погуглил и оказалось что например на федоре предустановлен питон но не предустановлен перл https://www.cyberciti.biz/faq/install-perl-in-fedora-linux-using-dnf-command/ то есть для баш-скрипта с использованием перла надо городить костыль который будет проверять что за система, как проверить что перл установлен, как его установить - много мороки.
я делал баш-портянку которая автоматически обновляет настройки обхода блокировки ютуба (осенью методы блокировки менялись почти каждый день и я заебался каждый день после работы прогонять блокчек вручную) и надо было вытащить адрес GGC чтобы воткнуть в запретовский блокчек, на стековерфлоу нашёл ванлайнер на перле, и выяснилось что он без пакета https://openwrt.org/packages/pkgdata/perl не работает. мне места на роутере хватило конечно, но у меня роутер сильно лучше чем у большинства. а вот awk предустановлен везде и адрес выдёргивает через curl -s "https://www.youtube.com/watch?v=eZD5z7MTvJY" | awk '$1 ~ /googlevideo/ { print substr($0,RSTART+26,RLENGTH+37) }'
>>090
Держи в курсе
> | grep -E -i '^ID=' | sed 's/ID=//g' | sed 's/\"//g' - это не пиздец
> startswith и replace - это пиздец
Держи в курсе
>>093
Да, вот только всё это очень здорово нет, ведь это уродливая ооп.дрисня(), пока тебе надо достать простенький паттерн из файлика с парами ключ="значение" и вся твоя логика влазит в один СТЕЙТМЕНТ. Для чего посложнее ты будешь писать мусорный скрипт с убогой императивщиной внутри, которая всё равно использует перловые регулярки.
Да, вот только всё это очень здорово нет, ведь это уродливая ооп.дрисня(), пока тебе надо достать простенький паттерн из файлика с парами ключ="значение" и вся твоя логика влазит в один СТЕЙТМЕНТ. Для чего посложнее ты будешь писать мусорный скрипт с убогой императивщиной внутри, которая всё равно использует перловые регулярки.
>>093
я эти ванлайнеры стырил со стековерфлоу и тоже плевался с синтаксиса sed, но он вроде ещё древнее чем awk. сейчас я бы на awk сделал более читаемый код типа такого
os_id=$(cat /etc/os-release | awk '
BEGIN {
FS = "="
}
/^ID=/ {
gsub("\"","")
print $2
}
')
я эти ванлайнеры стырил со стековерфлоу и тоже плевался с синтаксиса sed, но он вроде ещё древнее чем awk. сейчас я бы на awk сделал более читаемый код типа такого
os_id=$(cat /etc/os-release | awk '
BEGIN {
FS = "="
}
/^ID=/ {
gsub("\"","")
print $2
}
')
>>103
Для чего посложнее ты в любом случае будешь писать мусорный скрипт. Что на перле, что на авке, что на баше, что на пистоне, что на нюшеле, что на элвише, что на бабашке. Вопрос в чём тебе удастся проще поддерживать гигиену - зависит целиком от навыков и задачи, а не от языка.
>>153
Ты как то сразу забыл про условие однострочника.
>Для чего посложнее ты будешь писать мусорный скрипт
Для чего посложнее ты в любом случае будешь писать мусорный скрипт. Что на перле, что на авке, что на баше, что на пистоне, что на нюшеле, что на элвише, что на бабашке. Вопрос в чём тебе удастся проще поддерживать гигиену - зависит целиком от навыков и задачи, а не от языка.
>>153
Ты как то сразу забыл про условие однострочника.
>>169
Ты будешь писать вместе с другими зумерами-питухоноблядками. Я буду только в исключительных случаях. У тебя же таким случаем будет каждый второй.
>Для чего посложнее ты в любом случае будешь писать мусорный скрипт.
Ты будешь писать вместе с другими зумерами-питухоноблядками. Я буду только в исключительных случаях. У тебя же таким случаем будет каждый второй.
>>169
ну его можно и в однострочник сжать при желании
os_id=$(cat /etc/os-release | awk 'BEGIN {FS = "="} /^ID=/ {gsub("\"",""); print $2}')
ты же выше писал что у sed синтаксис нечитаемый, я его сделал максимально читаемым. но в принципе он и в однострочном виде выглядит лучше чем sed. да и на питоне норм, но питон не везде есть в отличие от awk и в питоновском однострочнике стоит ещё кавычки удалить потому что в некоторых дистрах они есть https://github.com/which-distro/os-release/blob/main/openwrt/23.05.3 и это неудобно потом в case-esac пихать.
ну его можно и в однострочник сжать при желании
os_id=$(cat /etc/os-release | awk 'BEGIN {FS = "="} /^ID=/ {gsub("\"",""); print $2}')
ты же выше писал что у sed синтаксис нечитаемый, я его сделал максимально читаемым. но в принципе он и в однострочном виде выглядит лучше чем sed. да и на питоне норм, но питон не везде есть в отличие от awk и в питоновском однострочнике стоит ещё кавычки удалить потому что в некоторых дистрах они есть https://github.com/which-distro/os-release/blob/main/openwrt/23.05.3 и это неудобно потом в case-esac пихать.
вообще и кат конечно не нужен, это всё встроенными средствами авк делается
awk 'BEGIN {FS = "="} /^ID=/ {gsub("\"",""); print $2}' /etc/os-release
awk 'BEGIN {FS = "="} /^ID=/ {gsub("\"",""); print $2}' /etc/os-release
>>191
Да я больше про то, что читаемость - дело субъективное, зависит от опыта.
Немного эксплицирую тезис, чтобы не раздувать холивар. Интерактивный REPL и скриптование - сильно разные задачи.
REPL - это про стрелка вверх, дописать хвост, повторить итерацию, пока не получишь результат.
Скриптование - про повторяемость и переносимость.
Императивные языки для REPL действительно не годятся. ipython - говно, xonsh - большее говно, единственный живой ООП репл - это powershell, и то он опп только на полшишечки. Все эти nushell, elvish, babashka, ammonite, oilsh, все живые альтернативные шеллы - функциональщина.
А вот когда речь идёт о скриптах - тут уже всё сильно зависит от задачи. Иногда можно скопировать соплю из REPL и оставить всё как есть. А иногда надо с нуля переписывать всё. И тут уже выбираешь инструмент по ситуации. Где-то это pure sh, где-то awk, где-то python, где-то бинарник на go.
Да я больше про то, что читаемость - дело субъективное, зависит от опыта.
Немного эксплицирую тезис, чтобы не раздувать холивар. Интерактивный REPL и скриптование - сильно разные задачи.
REPL - это про стрелка вверх, дописать хвост, повторить итерацию, пока не получишь результат.
Скриптование - про повторяемость и переносимость.
Императивные языки для REPL действительно не годятся. ipython - говно, xonsh - большее говно, единственный живой ООП репл - это powershell, и то он опп только на полшишечки. Все эти nushell, elvish, babashka, ammonite, oilsh, все живые альтернативные шеллы - функциональщина.
А вот когда речь идёт о скриптах - тут уже всё сильно зависит от задачи. Иногда можно скопировать соплю из REPL и оставить всё как есть. А иногда надо с нуля переписывать всё. И тут уже выбираешь инструмент по ситуации. Где-то это pure sh, где-то awk, где-то python, где-то бинарник на go.
>>196
Тем временем:
perl -nswE 'say /"(.+)"/ if /^NAME=/' /etc/os-release
Да, да, я знаю - опенврт, все дела...
Тем временем:
perl -nswE 'say /"(.+)"/ if /^NAME=/' /etc/os-release
Да, да, я знаю - опенврт, все дела...
вообще я неправильно написал выше, код который достаёт адрес GGC через RSTART/RLENGTH не будет правильно работать если адреса имеют разную длину, а они как правило имеют, правильно будет выдёргивать адрес GGC вот так
unset GGC_ADDRESS
GGC_ADDRESS=$(curl -s "https://www.youtube.com/watch?v=eZD5z7MTvJY" | awk 'BEGIN {
RS="\\/"
i=0
}
$1 ~ /googlevideo.com/ {
array[$i]=sprintf( $0 )
i++
}
END {
print array[$i]
}
')
echo "GGC -> $GGC_ADDRESS"
unset GGC_ADDRESS
GGC_ADDRESS=$(curl -s "https://www.youtube.com/watch?v=eZD5z7MTvJY" | awk 'BEGIN {
RS="\\/"
i=0
}
$1 ~ /googlevideo.com/ {
array[$i]=sprintf( $0 )
i++
}
END {
print array[$i]
}
')
echo "GGC -> $GGC_ADDRESS"
>>196
Пистон через регулярочки:
python3 -c 'import re; print(re.search(r"^ID=(.*)", open("/etc/os-release").read(), re.M).group(1))'
Пистон через регулярочки:
python3 -c 'import re; print(re.search(r"^ID=(.*)", open("/etc/os-release").read(), re.M).group(1))'

>>230
Много утилит теперь отдают структуры на stdout. Прост можно делать что-типа `.ID` вместо всех вот этих эзотерических заклинаний ИТТ.
>Но зачем?
Много утилит теперь отдают структуры на stdout. Прост можно делать что-типа `.ID` вместо всех вот этих эзотерических заклинаний ИТТ.
>>236
Что это, зачем это? Что за утилиты, которые принудительно отдают тебе джсон и никак иначе? И почему это обязательно должно быть проблемой шелла?
echo '{"foo":2,"baz":{"qux":8}}' | perl -MJSON::XS -swE 'say $$_{foo} + $$_{baz}{qux} for decode_json(my $input = <>)'
Хотя я и не могу себе представить ситуацию, когда ты каждый день имеешь дело с тонной васянского говна, срущего исключительно джсоном в STDOUT.
>-json
Что это, зачем это? Что за утилиты, которые принудительно отдают тебе джсон и никак иначе? И почему это обязательно должно быть проблемой шелла?
echo '{"foo":2,"baz":{"qux":8}}' | perl -MJSON::XS -swE 'say $$_{foo} + $$_{baz}{qux} for decode_json(my $input = <>)'
Хотя я и не могу себе представить ситуацию, когда ты каждый день имеешь дело с тонной васянского говна, срущего исключительно джсоном в STDOUT.
>>243
охуеть, это как работает? точка же это подстановка для текущего каталога, где команда читающая файл? как шелл понимает что символы до = это переменная которую можно вывести? по каким ключевым словам надо гуглить чтобы почитать документацию по таким трюкам?
охуеть, это как работает? точка же это подстановка для текущего каталога, где команда читающая файл? как шелл понимает что символы до = это переменная которую можно вывести? по каким ключевым словам надо гуглить чтобы почитать документацию по таким трюкам?
Никогда бы не подумал, что за пределами дома престарелых еще можно встретить фанатов перла.
>>484
use Perl or die;
use Perl or die;
>>484
Перл вполне себе жив на юникс системах и постоянно обновляется, просто о нем мало говорят т.к. ниша стала очень узкой, где-то на уровне между башем и awk. Но по умолчанию перл есть на любом линуксе. а вот питухон3 еще устанавливать надо.
Перл вполне себе жив на юникс системах и постоянно обновляется, просто о нем мало говорят т.к. ниша стала очень узкой, где-то на уровне между башем и awk. Но по умолчанию перл есть на любом линуксе. а вот питухон3 еще устанавливать надо.
https://ru.stackoverflow.com/questions/1607444/%D0%9A%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-%D1%81%D1%82%D1%80%D0%BE%D0%BA-%D0%BF%D0%BE-%D0%B4%D0%BB%D0%B8%D0%BD%D0%B5-%D0%BD%D0%B0-%D1%87%D0%B8%D1%81%D1%82%D0%BE%D0%BC-awk
если кто-нибудь разбирается в awk ответьте на вопрос пожалуйста, я всю голову сломал. тут задать не могу, возвращает ошибку "присутствует слово из спам-листа".
если кто-нибудь разбирается в awk ответьте на вопрос пожалуйста, я всю голову сломал. тут задать не могу, возвращает ошибку "присутствует слово из спам-листа".
ладно, уже ответила добрая душа. пиздец у авк конечно жопоразрывающие тернарные операторы, теперь понимаю почему в книжке мартина написано избегать их любыми средствами.
>>236
Вкатываюсь в девопс, постоянно замечаю в примерах awk и jq. Это стандартные тулзы для работы с json и текстом что-ли?
Вкатываюсь в девопс, постоянно замечаю в примерах awk и jq. Это стандартные тулзы для работы с json и текстом что-ли?
>>661
Jq стандарт еще есть yq для пердолинга ямлов (для джейсонов тоже должно работать, тк любой корректный жсон это корректный ямл).
Awk юзается в простых однострочниках, обычно чтобы вырезать какой-то элемент из строки или типа того, гораздо стандартнее него - sed, grep, wc и так далее.
Выше уже говорилось, что если тебе нужен хоть сколько-то сложный скрипт, лучше написать его на питоне, а не городить шизофазическую баш портянку.
Jq стандарт еще есть yq для пердолинга ямлов (для джейсонов тоже должно работать, тк любой корректный жсон это корректный ямл).
Awk юзается в простых однострочниках, обычно чтобы вырезать какой-то элемент из строки или типа того, гораздо стандартнее него - sed, grep, wc и так далее.
Выше уже говорилось, что если тебе нужен хоть сколько-то сложный скрипт, лучше написать его на питоне, а не городить шизофазическую баш портянку.
>>607
Ты бы хоть подробнее писал с примерами, штоле, нам всем интересно.
Ты бы хоть подробнее писал с примерами, штоле, нам всем интересно.
>>765
Обосрался тут только один шиз, который утверждал что питухон не умеет в однострочники.
>обосрался
Обосрался тут только один шиз, который утверждал что питухон не умеет в однострочники.