我尝试了这个,但它没有用。如何从awk命令生成输出为gz文件?
awk -v someVariable="$VAR1" '
BEGIN {
. . .
}
{
SOME CODES HERE
}
END {}
' $FILES> gzip $RESULTING_OUTPUT
答案 0 :(得分:3)
您可以将输出管道输出到awk之外的gzip(如Tom建议的那样),或者您可以通过内部 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收集的Web服务器日志不是按时间顺序排列的。日志对于sort
来说太大了,但是当分成小时块时可以处理。
YMMV。最好的解决方案取决于您实际想要实现的目标,而您尚未告诉我们。
答案 1 :(得分:2)
您需要管道输出到gzip
,然后重定向然后输出到文件:
awk '...' $FILES | gzip > "$RESULTING_OUTPUT"
请注意,建议不要使用变量名称的大写字母,因为它们可能会与shell内部变量冲突。此外,$FILES
看起来很可疑,因为它可能包含多个文件名的列表。你应该使用一个数组,你可以像"${files[@]}"
答案 2 :(得分:0)
这有效
awk -v someVariable="$VAR1" '
BEGIN {
. . .
}
{
SOME CODES HERE
}
END {}
' $FILES> $RESULTING_OUTPUT
gzip $RESULTING_OUTPUT