Чтобы добавлять сообщения и комментарии, .

@Strephil:
Strephil

Говно. Наткнулся на багу в busybox'ном awk'е, версия 1.22.0, почему-то числа с ведущими нулями трактует как шестнадцатеричные.
Что за херня :-(

@caban:
caban

AWK — крутейшая штука, сегодня написал на нём скрипт, всё правильно и приятно.

@qnikst:
qnikst

в файле строку вида:

package-db: prefix.cabal-sandbox/postfix

нужно превратить в:

package-db: prefix.cabal-sandbox/postfix:/prefix/.cabal-sandbox-shared/postfix

как наиболее просто?

@Strephil:
Strephil

Последнее время мне начинает нравиться awk. Для одноразового использования самое то, когда вот так легко ввод разделяется на поля и записи.
Единственное, что вот этот мерзкий C-подобный синтаксис.

А вот была бы какая-то смесь awk'а с python'ом.

@Strephil:
Strephil

Сегодня редкий случай — когда я использовал awk для дела
Вообще, это действительно очень удобно, когда вот можно указать RS, и разбирать себе потихоньку записи.

@Self-Perfection:
Self-Perfection

Подумалось мне, что надо бы поучить perl, и я даже почти дал себе зарок некоторое время использовать для парсинга логов только perl, вместо стандартных grep/cut/sed/awk/.... Но первый же эксперимент мне не понравился. Оригинальный однострочник:

$ time awk '{a[$7]+=1} END{for(k in a){print k}}' $LOG |wc -l
840

real 0m0.292s
user 0m0.254s
sys 0m0.034s

И перевод его на perl:

$ time perl -lane 'END{print scalar(keys %a)} $a{$F[6]}=();' $LOG
840

real 0m6.416s
user 0m6.380s
sys 0m0.018s

получилось длиннее и медленнее. Печально.

@Strephil:
Strephil

Переделан механизм расширений, с помощью которых, как я понимаю можно добавлять функции на C.
При этом из коробки есть расширение, которое аналогично -i в sed.

@Strephil:
Strephil

О, вышел GNU AWK 4.1.0!!!

@mc:
mc

павк — это как авк, только на питоне!1
github.com

@Oksion:
Oksion

господа линуксоиды, у вас есть шанс реально доказать превосходство линукса над остальными недооперационками, помогите пожалуйста как-то распарсить html файл. Суть в том что нужно найти в нём текст по шаблону <set value='значение' name='дата' /> и сделать из этого csv вида "значение, дата"

@syjgin:
syjgin

Сегодня по просьбе начальника писал спаморассылалку о новой версии местной софтины. Наверное, я-из-прошлого меня бы убил за такое

@gelin:
gelin

Блин! xargs с ключиком -0 вообще работает? Как нормально скормить ему кучку прогрепаных путей с ПРОБЕЛАМИ?

@Strephil:
Strephil

Ура! Ура! Gnu Awk 4.0.1 is available now!

@Strephil:
Strephil

В чем все-таки скрытый смысл, что синус есть, косинус есть, а тангенса — увы.
Как это можно логически запомнить, или как это принято в мире unix, нужно зазубрить, как мартышка: синус есть, косинус есть, тангенса нет?

@Strephil:
Strephil

Выпущен бета-релиз того, что будет 4.0.1
я уже совсем засыпаю, так что подробности завтра, спокойной ночи, жуйк!

@Strephil:
Strephil

Вот интересно, в стабильную версию системы Debian GNU/Linux (которая позиционируется как свободная и действительно стабильная) входит GNU awk 3.1.7…

В версии 3.1.8 обнаружена серьёзная ошибка (segmentation fault), возможно, она есть и в 3.1.7. Так главный разработчик GNU awk, еврей Аарон Роббинс, заявляет, что про третью ветку он давно забыл и ошибки исправлять не будет, если только его специально не попросить.
То есть, стабильная ветка Debian содержит никем не поддерживаемые программы, на ошибки в которых всем чихать!

По-видимому, нельзя называть ветку “stable”, пока в ней есть хотя бы один GNU-пакет или другое подобное еврейское говнецо. Debian GNU-unstable /Linux, как-то так.

@cormorant:
cormorant

Заменить в файле вида (дата-время отделены от значения табуляцией)
01.01.2000 11:00:00 60391.7
01.01.2000 11:02:00 60391.79
01.01.2000 11:04:00 60391.8
01.01.2000 11:06:00 60391.77
01.01.2000 11:08:00
01.01.2000 11:10:00 60391.68
01.01.2000 11:12:00 60391.66
строчки, где пропущено значение, на 0, сделал так
awk '{if (length($3) < 2) {print $1" "$2"\t"0} else {print $0}}' file.dat
Результат ясен. Можно было не записывать

@ramok:
ramok

диссскотека! танцует MC Птиц core.org.ua и клип core.org.ua

@ramok:
ramok

шматрица: clear; tput civis; awk 'BEGIN{for(;;) {printf("'$(tput cuu1)$(tput ri)'\033[0;32m");for(i = 1; i <= '$COLUMNS'; i++) printf("%lc", (rand() * 20) < 2 ? (rand() * 127 + 32) : " "); print ""; system("sleep " rand())}}'

@Strephil:
Strephil

В четвертой версии GNU AWK функции sub были приведены в соответствие со стандартом POSIX 2008.
Неделю назад пришел баг-репорт, что gawk работает согласно POSIX! Ужас!
…я оказался прав: главный разработчик gawk Аарон Роббинс подготовил патч, возвращающий старое поведение. В ближайшее время он будет добавлен в ветку git gawk-4.0-stable.
GNUgNUGNugnu!!!!!1111

@Strephil:
Strephil

Во-первых,
openbsd # echo '\\' | awk '{gsub("\\\\","\\\\");print}'
\\\\
Во-вторых,
gnu# echo '\\' | awk '{gsub("\\\\","\\\\"); print}'
\\
GNU слѣдует POSIX, OpenBSD сосет хуйцы.

@Strephil:
Strephil

# echo ' foo' | awk '{$2 = "bar"; print}'
foo bar

почему пропадает пробел перед foo?

@ramok:
ramok

прЮвет! awk 'BEGIN{h="__\\/||//||\\\\||\\/";split(h, a, //); for(;;) { for (i=1; i< length(a); i+=2) { printf " "a[i]"o"a[i+1]" .oO(прЮвет!)\r"; system("sleep 0.3") }}}'

@Strephil:
Strephil

Мудрёно устроена буферизация вывода в GNU AWK. В документации явно не объясняется, что там и как. В исходниках не разбирался. Сужу пока по strace'ам
Вот три примера. Прикольненько!
$ seq 1 10000 | strace -c -e trace=write gawk '{print "hello world";}'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.002961 0 10000 write
------ ----------- ----------- --------- --------- ----------------
100.00 0.002961 10000 total

$ seq 1 10000 | strace -c -e trace=write gawk '{print "hello world">"/dev/null";}'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.000371 0 10000 write
------ ----------- ----------- --------- --------- ----------------
100.00 0.000371 10000 total
$ seq 1 10000 | strace -c -e trace=write gawk '{print "hello world";}'>/dev/null
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
-nan 0.000000 0 30 write
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 30 total

@Strephil:
Strephil

gawk, похоже, печатает немедленно, а mawk буферизует.
там, где gawk делает 758798 вызовов write(), mawk достаточно 1975.
Угадайте, какая программа работает быстрее и во сколько раз?
Казалось бы, причем тут жидогну…

@Strephil:
Strephil

Ура! Четвертый gawk действительно вышел, Аарон Роббинс действительно написал такое письмо: lists.gnu.org Скачать коды: ftp.gnu.org

@Strephil:
Strephil

Нашел на gnu.org файл:
ftp.gnu.org это что, он уже вышел, да? Релиз? Написано, 29 июня.

@Strephil:
Strephil

Первая бета-версия GNU awk 4.0 вышла в свет! Можно тестировать! Ура!

@Gem:
Gem

Полезные одно-строчные скрипты sed (sed shell) opennet.ru
Вопрос знатокам sed — замена символов с файле opennet.ru

@Strephil:
Strephil

$ gawk 'BEGIN {print length("ы")}'
1
$ /opt/plan9/bin/awk 'BEGIN {print length("ы")}'
2
$ mawk 'BEGIN {print length("ы")}'
2
что, есть реализация всех этих команд лучше GNU? не смешно.

length[([s])]
Return the length, in characters, of its argument taken as a
string, or of the whole record, $0, if there is no argument.

Не в байтах, в символах.

@Strephil:
Strephil

Ну и как сделать простой аналог cut -f3?
Потому что print $3 печатает третье непустое поле. А как сделать, чтобы и пустые поля считались?

@Strephil:
Strephil

awk никому не нужен. Для совсем простого слишком сложен, для чуть более сложного слишком ущербен. Вот нафига он стандарт POSIX? Даже не то, что лишние буквы. Сколько поощрение его включения в дистрибутивы, его изучения, использования.
Был бы стандартом, например, bash со всеми его башизмами. Или другие расширения GNU… Было бы куда лучше.

@Darion:
Darion

awk "music": kmkeen.com

@iorlas:
iorlas

bashshell.net Основы awk. Для тех, кто всегда хотел, но не было времени.

@zelgadis:
zelgadis

awk is great

@twsdwf:
twsdwf

задачка: есть рнр-файлик dbconn.php, стандартный для используемой cms, с настройками подключения в БД. и куча "висяка" в mysql. убиваем все запросы,длящиеся дольше 200секунд...
echo -e "SHOW PROCESSLIST;\n" | eval `echo "mysql";awk -F'=' 'function qstrip(s){sub(/^([^"]\")/,"\"",s);sub(/(\"[^"])$/,"\"",s);return s;}{if($1 ~ DBHost){printf " -h%s ",qstrip($2);}else if($1 ~ DBLogin){printf " -u%s ",qstrip($2);}else if($1 ~/DBPassword/){printf " -p%s ",qstrip($2)}else if($1~/DBName/){printf " %s ",qstrip($2);}}' dbconn.php` | awk '{if(n<=0){for (i=1;i<=NF;++i){if($i == "Time" ){n=i;break;}}}else if( ($n>200) && ($1>0) ){printf "kill %d;\n",$1;}}' |eval `echo "mysql";awk -F'=' 'function qstrip(s){sub(/^([^"]\")/,"\"",s);sub(/(\"[^"])$/,"\"",s);return s;}{if($1 ~ DBHost){printf " -h%s ",qstrip($2);}else if($1 ~ DBLogin){printf " -u%s ",qstrip($2);}else if($1 ~/DBPassword/){printf " -p%s ",qstrip($2)}else if($1~/DBName/){printf " %s ",qstrip($2);}}' dbconn.php`;

@r1s:
r1s

Продолжаю баловаться с awk, пишу всякие мелкие скрипты. В качестве объекта для экспериментов взял access.log lighttpd, считаю всякое, вывожу статистику. И чем дальше, тем больше нравится мне awk, добавить еще sed по вкусу и вообще замечательно.

@r1s:
r1s

Читаю туториалы по awk, до этого как-то не удавалось посмотреть, что за зверь. В общем могу сказать только одно: преодолей я свою лень и посмотри раньше на него — и жизнь бы стала намного проще, да и времени лениться было бы больше. Хороший и мощный язык для скриптов и мб больше.

@mourneskey:
mourneskey

Запоздалое продолжение #674254.
Снова понадобилось повозиться с DAR'ом, поэтому вернулся к скрипту и допилил его до более-менее вменяемого состояния.
Убрал все вызовы внешних программ (я там date запускал на каждую строку), что можно — вынес в блок BEGIN awk-скрипта.
Время обработки моего бекапчика сократилось в 12 (!) раз: вместо ~3х минут — 15 секунд. Доволен до жути.
Завтра еще немного причешу его, добавлю комменты/кредитсы (все-таки начальная-то версия не моя была), и выложу куда-нибудь уже :)

@Stiletto:
Stiletto

однажды уже написаная, но затем проебаная утилитка, которая выводит размеры всех пакетов и их имена и сортирует их по размеру пакетов. awk.
для тех кому жуйк портит код: paste.pocoo.org
для себя чтобы непроебат:


#!/bin/awk -f
BEGIN {
while ("ls /var/lib/pacman/local/"|getline a) {
get_name=0; get_size=0;
for (i in vals)
delete vals[i];
valname="";
fname="/var/lib/pacman/local/"a"/desc";
while (getline str < fname) {
if(valname!="") {
vals[valname]=str;
valname="";
}
if (str ~ %.*%) {
valname=str;
}
}
print vals["%SIZE%"]" "a | "sort -n";
}
exit(0);
}

зопускать так: ./pkgsizes.awk, не забыв сделать chmod +x