си оказался для меня пока что слишком сложным, а баш слишком простым, слишком целочисленным (это можно обойти костылями но всё-таки) и без директивы include из-за чего там надо для читабельного кода городить костыль из main "$@" под чудовищной простынёй из функций.
а вот у awk и принцип работы необычный, и синтаксис максимально похож на сишный, и реализацию с логикой можно разнести по разным файлам. ну и плюс это один из языков которым больше 45 лет и которые до сих пор активно используются, по крайней мере я при поиске ответов на стековерфлоу в 90% случаев вижу ванлайнеры на awk.
поэтому я хочу собрать тут разные полезные штуки по авк (по крайней мере мне было интересно) ну и может кто-то поможет если такая помощь понадобится, или сам подкинет что-то полезное.
а ещё в awk можно превращать любую нечитаемую awk-хуйню из ответов со стековерфлоу в нормальный понятный код если запустить её с awk -o- 'нечитаемый_ванлайнер'
Так и не осилил это и не понимаю, зачем оно, когда есть перл. Там тебе и программы на много файлов писать с АРХИТЕКТУРОЙ и неймспейсами, и ванлайнеры, умеющие больше чем sed и awk вместе взятые. Разве только в бизибокс перл не засунешь, но на дженерик x86 машине вообще похуй.
>>3394029 на опенврт перл весит больше мегабайта https://openwrt.org/packages/pkgdata/perl плюс авк есть вообще везде в том числе на роутерах, а вот для перла надо парсить /etc/os-release для выяснения на какой системе запустили скрипт, каким пакетным менеджером его установить, что делать если это старый роутер, всё место уже занял болвановский запрет с хостлистами и перл ставить вообще некуда.
ну и честно говоря я не осилил перловский синтаксис, мне лень в него вникать когда есть авк с сишным синтаксисом. плюс авк не менялся с 1994 года и любой нагугленный ванлайнер написанный за последние 30 лет будет работать так же как и когда его писали.
>>3394032 >опенврт Так и думал. >надо парсить /etc/os-release для выяснения на какой системе запустили скрипт, каким пакетным менеджером его установить Зачем? >любой нагугленный ванлайнер написанный за последние 30 лет будет работать так же как и когда его писали. Для перла тоже справедливо, там обратную совместимость десятилетиями тянут с недавнего времени стало хуже, но шансы нарваться на протухший код всё ещё ничтожны.
>>3394035 /etc/os-release надо парсить потому что на разных системах ставить пакеты надо разными пакетными менеджерами и я не придумал ничего лучше чем выдернуть инфу через cat /etc/os-release | grep -E -i '^ID=' | sed 's/ID=//g' | sed 's/\"//g' и сделать case-esac для всех популярных дистров включая опенврт. но это в любом случае плохое решение, скрипт должен максимально полагаться на то что уже и так везде предустановлено.
>>3394016 (OP) >си оказался для меня пока что слишком сложным, а баш слишком простым Разве awk не годится только на то чтобы вытащить кусок текста из потока вывода или файла? Как его можно сравнивать с сишкой и даже с башем, которые вполне полноценные языки?
>>3394045 Какие пакеты надо ставить в перл, чтобы написать на нём то же самое, что ты будешь писать на awk, куда ты никаких пакетов ставить, насколько я понимаю, не планируешь? Это раз. Два - клиент к cpan идёт в комплекте со стандартной либой. Либо я тебя не понял, либо аргумент, мягко говоря, сомнительный.
>>3394016 (OP) Лучший учебник - это жизнь. После того как три дня выясняешь почему абсолютно одинаковые скрипты на одинаковых ос ведут себя по разному просто потому что какая-то либа заменила mawk на gawk, раз и навсегда переходишь на питон.
>>3394055 по ссылке что я давал есть веб-сервер написанный на awk. а вытащить можно и грепом. awk в принципе такой же полноценный язык, по крайней мере по словам Кернигана. драйвера на нём писать не получится, но по такому принципу и питон с джавой можно из полноценных исключить. циклы, условия, ассоциативные массивы там есть, что ещё тебе надо чтобы признать полноценным языком? и главное зачем, свои задачи он делает и делает хорошо.
>>3394061 не, пакеты в перл не надо ставить, ставить надо сам перл, на опенврт его нет и нинужна, для большинства роутеров которые на руках у людей в рф он слишком тяжёлый и на эти роутеры не всегда даже запрет с 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) }'
>>3394093 Да, вот только всё это очень здорово нет, ведь это уродливая ооп.дрисня(), пока тебе надо достать простенький паттерн из файлика с парами ключ="значение" и вся твоя логика влазит в один СТЕЙТМЕНТ. Для чего посложнее ты будешь писать мусорный скрипт с убогой императивщиной внутри, которая всё равно использует перловые регулярки.
>>3394093 я эти ванлайнеры стырил со стековерфлоу и тоже плевался с синтаксиса sed, но он вроде ещё древнее чем awk. сейчас я бы на awk сделал более читаемый код типа такого
>>3394103 >Для чего посложнее ты будешь писать мусорный скрипт Для чего посложнее ты в любом случае будешь писать мусорный скрипт. Что на перле, что на авке, что на баше, что на пистоне, что на нюшеле, что на элвише, что на бабашке. Вопрос в чём тебе удастся проще поддерживать гигиену - зависит целиком от навыков и задачи, а не от языка.
>>3394153 Ты как то сразу забыл про условие однострочника.
>>3394169 >Для чего посложнее ты в любом случае будешь писать мусорный скрипт. Ты будешь писать вместе с другими зумерами-питухоноблядками. Я буду только в исключительных случаях. У тебя же таким случаем будет каждый второй.
>>3394169 ну его можно и в однострочник сжать при желании 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 пихать.
>>3394191 Да я больше про то, что читаемость - дело субъективное, зависит от опыта.
Немного эксплицирую тезис, чтобы не раздувать холивар. Интерактивный REPL и скриптование - сильно разные задачи. REPL - это про стрелка вверх, дописать хвост, повторить итерацию, пока не получишь результат. Скриптование - про повторяемость и переносимость. Императивные языки для REPL действительно не годятся. ipython - говно, xonsh - большее говно, единственный живой ООП репл - это powershell, и то он опп только на полшишечки. Все эти nushell, elvish, babashka, ammonite, oilsh, все живые альтернативные шеллы - функциональщина. А вот когда речь идёт о скриптах - тут уже всё сильно зависит от задачи. Иногда можно скопировать соплю из REPL и оставить всё как есть. А иногда надо с нуля переписывать всё. И тут уже выбираешь инструмент по ситуации. Где-то это pure sh, где-то awk, где-то python, где-то бинарник на go.
вообще я неправильно написал выше, код который достаёт адрес GGC через RSTART/RLENGTH не будет правильно работать если адреса имеют разную длину, а они как правило имеют, правильно будет выдёргивать адрес GGC вот так
>>3394230 >Но зачем? Много утилит теперь отдают структуры на stdout. Прост можно делать что-типа `.ID` вместо всех вот этих эзотерических заклинаний ИТТ.
>>3394236 >-json Что это, зачем это? Что за утилиты, которые принудительно отдают тебе джсон и никак иначе? И почему это обязательно должно быть проблемой шелла?
>>3394243 охуеть, это как работает? точка же это подстановка для текущего каталога, где команда читающая файл? как шелл понимает что символы до = это переменная которую можно вывести? по каким ключевым словам надо гуглить чтобы почитать документацию по таким трюкам?
>>3394484 Перл вполне себе жив на юникс системах и постоянно обновляется, просто о нем мало говорят т.к. ниша стала очень узкой, где-то на уровне между башем и awk. Но по умолчанию перл есть на любом линуксе. а вот питухон3 еще устанавливать надо.
если кто-нибудь разбирается в awk ответьте на вопрос пожалуйста, я всю голову сломал. тут задать не могу, возвращает ошибку "присутствует слово из спам-листа".
ладно, уже ответила добрая душа. пиздец у авк конечно жопоразрывающие тернарные операторы, теперь понимаю почему в книжке мартина написано избегать их любыми средствами.
>>3394661 Jq стандарт еще есть yq для пердолинга ямлов (для джейсонов тоже должно работать, тк любой корректный жсон это корректный ямл). Awk юзается в простых однострочниках, обычно чтобы вырезать какой-то элемент из строки или типа того, гораздо стандартнее него - sed, grep, wc и так далее. Выше уже говорилось, что если тебе нужен хоть сколько-то сложный скрипт, лучше написать его на питоне, а не городить шизофазическую баш портянку.
>>3394689 если вкратце то conditional expression это чрезвычайно изъёбистый способ сишных дидов записать if-then-else, да ещё и описанный английским языком времён молодого брежнева.
то есть при записи
expr1 ? expr2 : expr3
интерпретатор авк смотрит что у нас в expr1. если там переменная или элемент массива то он проверяет есть ли там чего. если там что-то есть и это что-то не ноль то либо выполняется то что написано вместо expr2 если это оператор/функция, либо присваивается значение того что содержится в expr2 если в expr2 переменная, число, строка или элемент массива.
а если в expr1 ничего нет или есть но это ноль тогда то что делалось бы с expr2 делается с expr3.
то есть по сути строку m[c] = m[c] ? m[c] RS $0 : $0 можно переписать как
if (length(m[c]) == 0) #если длина данных в ячейке 0 значит ячейка пустая m[c]=$0 else m[c]=( m[c] RS $0 )
то есть задача следующая - надо отсортировать кучу строк по длине строки. при этом если просто присваивать строки в массив вида имя_массива[длина_строки]=содержимое_строки то все строки с одной длиной кроме последней такой строки перезапишут друг друга, а надо их все сохранить. и эту проблему решает conditional expression - если в ячейке массива что-то уже записано то к содержимому ячейки приписывается разделитель записей (по умолчанию перевод строки) и содержимое другой строки с такой же длиной. то есть для нас это будет выглядеть так как будто две строки с одной длиной друг за другом идут, а в реальности это одна строка записанная в одну ячейку массива в виде
sprintf "залупа кентавра\nзалупа петровича"
проблемы было две. первая - это уёбищная запись кода на стековерфлоу, из-за которой было тяжело понять какое действие производится первым (может настоящим программистам было бы легко), то есть по нормальному это надо было переписать как m[c] = ( m[c] ? m[c] RS $0 : $0 ) чтобы было понятно что сначала прогоняется if-then-else в тернарном операторе а потом результат присваивается в ячейку массива. вторая - это кондовый английский сишных дидов в учебнике, из-за чего я был уверен что "First, expr1 is evaluated" означает что в expr1 обязана быть какая-то операция/функция возвращающая либо 0 либо 1 либо NULL, а первый кусок оператора может и просто в переменную или ячейку массива посмотреть. по иронии судьбы в классическом учебнике по си от того же кернигана есть хорошее объяснение как это работает, а тут логика сишная а объяснение то ли я не нашёл то ли его вообще нет. если учесть что учебник по авк переиздавался сильно меньше то может его и не написали потому что в 80-х все кто знал с какой стороны включать компьютер и так это знали.
>>3394016 (OP) Надо бы сделать общий тред по всем специализированным линуксовым скриптовым языкам, в первую очередь по башику, но также и по awk, perl, sed и т.д. Кроме питона и руби конечно. Думаю было бы полезнее чем тред по одному awk.
>>3395212 честно говоря баш даже для меня слишком простой, я не понимаю зачем по нему отдельный тред. а sed или grep абсолютно ненужен если освоишь awk - awk вообще создавался чтобы делать всё то же самое что и sed и даже больше, только с помощью более читаемого кода. перл наверное норм язык, но у него тяжёлый плохочитаемый синтаксис (по крайней мере в ответах на стековерфлоу перловские ванлайнеры почти всегда нечитаемый набор закорючек который непонятно что делает), в awk хотя бы можно запустить awk -o- 'иероглифический_пиздец' и он развернёт ванлайнер в нормальный код. и честно говоря я не очень понимаю чего такого может делать перл чего не смог бы делать awk в связке с башем.
>>3395218 >честно говоря баш даже для меня слишком простой Там свои подводные камни, да и что значит слишком простой? Если забыть про ванлайнеры, то awk еще проще в каком-то смысле. Кроме того идея в том чтобы сделать один общий живой тред, т.к. всем интересно разное и понятно что тред по одному авку долго не протянет. Все эти языки - bash, awk, perl объединяет то что они все связаны с работой в командной строке линукса, поэтому стоило бы линуксоидам иметь свой тредик.
>>3395253 ну с awk у меня была проблема вообще понять как скрипт работает. я думал awk работает так же как и любой другой яп - ищет поисковой паттерн и что-то с ним делает или со строкой в которую он входит, вон как питоновский ванлайнер выше. мне тяжело было понять что скрипт буквально проходит построчно весь текст и каждую строку проверяет на вхождение. питоновский скрипт по факту делает то же самое но там синтаксис гораздо привычнее и сам факт построчного прохождения скрыт от программиста. может у меня одного голову от текстоцентричного подхода заклинило, хз.
но вообще ты прав, выёбываться сложностью языка это какие-то колхозные понты. я обеими руками за общий тред окололинуксовых языков, но и этот тред я бы не сносил.
https://github.com/e36freak/awk-libs вот это по-хорошему давным-давно надо сделать встроенными функциями awk, уж сортировка массива точно должна быть в любом языке программирования. или сделать awk++ и тащить в его стандартную библиотеку все ванлайнеры со стековерфлоу с большим количеством лайков.
>>3395212 >в первую очередь по башику В первую очередь по pure sh. Башизмы - зло.
>>3395218 >баш даже для меня слишком простой Баш это easy to learn, hard to master. Писать хороший читаемый код при помощи простого баша - нетривиальная, творческая задача.
>>3395452 >В первую очередь по pure sh. Башизмы - зло. Ещё пару лет назад это, кстати, действительно было проблемой на всяких опенврт с бизибокс-шеллами, где на [[ ]] ${foo[@]}, дэши в переменных и прочее нестандартное говно ты получал синтакс эррор. Но на свежем бизибоксе вроде ash умеет.
>>3396151 ну на разных устройствах запускать один и тот же скрипт где была бы логика, а реализация бы подгружалась и меняя реализацию на одном узле с которого она подгружается можно было бы сразу менять как работает скрипт везде.
>>3396250 >>3396211 Борзое ньюфажное говно, ткнутое носом в идиотизм собственных шизофантазий, ещё имеет наглость огрызаться. Ну хуй с тобой, пердоль своё, раз самый умный. Рекомендую озаботиться кэшированием скачанных файлов, если не хочешь совсем говно, всирающее тонны трафика впустую и запускающееся 10 секунд. Теперь можешь пойти нахуй.
>>3396338 Значит, обиженный с питоном отчаянно пытается в набросы. Энивей, не отменяет того факта, что ты настойчиво спрашиваешь непростительную хуйню. Не думал, почему такое ещё никто не сделал? В реализации не то чтобы сложно. Не еби мозги, короче, делай нормально.
>>3396475 у меня уже есть работа, а вкатываться в айти я опоздал на 15 лет. мне просто интересно учиться программированию чтобы мозги не ржавели, поэтому выбираю не язык который востребован а который интересен лично мне. для поиска работы тебе лучше питон учить или го или что там сейчас эйчары требуют.
>>3396674 Авк плохой выбор для обучения программированию, это ебучий дсл для парсинга строк, пусть и полный по тьюрингу. Примерно как учить Personal Home Page первым языком, только ещё хуже. У тебя в голове будет очень насрано и выучить что-то ещё потом будет БОЛЬНО.
>>3396688 если я доживу до потом - буду об этом париться. пока что в авк/баше интересно разбираться и он сразу пригождается, заодно привыкаю к сишному синтаксису и логике. выучить что-то новое всегда больно, если будет старание то выучу.
>>3396826 >>3396688 Ебать ты душный. Ну нравится ему ковырятся с авком, чего привязался. Тем более там сразу можно любую программу на практике использовать в отличие от всяких сишек где без библиотек на одном синтаксисе далеко не уедешь.
>>339675 >баше Если тебе так важно опенврт, рекомендую вместо баша чистый POSIX shell — на старых прошивках со старым бизибоксами башизмы работать не будут. Кстати, ты используешь POSIX awk или GNU awk?
>>3396858 не, мне не только для опенвртшных скриптов, с опенврт просто началось знакомство когда я охуел с того что можно править конфиг запрета в автоматическом режиме выдёргивая старую нерабочую стратегию обхода в середине строки и меняя её на новую рабочую которую авк тоже выдернул из вывода блокчека. когда стратегию блокировки ютуба меняли каждый день можно было засунуть скрипт в крон и приходя с работы ты мог не ебаться с блокчеком сорок минут и копипастить руками а сразу приходил и ютуб работает. было очень удобно.
есть ли более простой способ сравнить в бизибоксе/баше строке два float числа чем пикрил? bc не предлагать, его по умолчанию на опенврт нет, и не у всех есть место его установить, и это надо опять делать костыль с определением системы и установкой отсутствующих пакетов.
>>3400804 мне сложно понять что происходит в первых двух строчках, ни разу не видел фигурных скобок в башскрипте употреблённых в таком месте. это распарсенная строка с версией делится на две переменных по точке и потом эти переменные сравниваются соответственно друг другу?
идея хорошая, спасибо. но это сложно читать, мне наверно опыта не хватает но от обилия точек, слешей, скобочек глаза разбегаются. а если через неделю буду перечитывать скрипт чтобы туда чего-нибудь допилить то вообще охуею от того что эта строчка непонятно что делает. попробую сделать через пикрил, это оверхед конечно выдёргивать из строки мажорную и минорную версии авк-скриптами, но насколько же понятнее выглядит.
выяснилось что числа 6 и 5,9 предложенный выше код сравнивать правильно не умеет и пришлось накостылить проверку присутствия дробной части. наверное это можно было покороче записать, но мне главное было чтобы код через неделю/месяц/год при чтении понимал даже я.