to post messages and comments.

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

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

awk

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

Подумалось мне, что надо бы поучить 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

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

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

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

awk

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

Вот интересно, в стабильную версию системы 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, как-то так.

Заменить в файле вида (дата-время отделены от значения табуляцией)
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
Результат ясен. Можно было не записывать

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

Мудрёно устроена буферизация вывода в 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

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

$ 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.

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

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

задачка: есть рнр-файлик 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`;

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

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