Вы можете ЯВНО трубы вашего выхода в GZIP вне AWK (как предположил Том), или вы можете отправить вывод через трубу из внутри AWK. Например:
awk '
{
print | "gzip > /path/to/output.gz";
}
' inputfile
Это имеет огромное преимущество в определенных ситуациях. Например, если вы хотите разделить очень длинный файл журнала на часовые куски, вы можете построить свою команду вывода в качестве переменной, а затем передать ее переменной.
awk '
# given:
# Mar 20 13:29:12 servername some message
BEGIN {
m["jan"]="01"; m["feb"]="02"; m["mar"]="03"; m["apr"]="04";
m["may"]="05"; m["jun"]="06"; m["jul"]="07"; m["aug"]="08";
m["sep"]="09"; m["oct"]="10"; m["nov"]="11"; m["dec"]="12";
}
{
output=sprintf("gzip -9 > /var/log/split/%s-%s-%s.log.gz", m[tolower($1)], $2, substr($3,1,2));
print | output
}' input.log
С помощью этого использования, ваш вывод команды GZIP линия повторно оценивается для каждой строки ввода, и AWK не закрывает трубу, если это не сказал вручную, или AWK исчерпывает входа и выходов ,
Мой собственный прецедент для этого заключался в том, что мы собирали журналы веб-сервера из CDN, которые не были в хронологическом порядке. Журналы были слишком большими для sort
, но их можно было обрабатывать, когда они разделены на часовые куски.
YMMV. Лучшее решение зависит от того, чего вы на самом деле пытаетесь достичь, чего вы нам не сказали.