如何gzip awk命令的结果输出?

时间:2015-03-24 14:21:03

标签: bash awk gz

我尝试了这个,但它没有用。如何从awk命令生成输出为gz文件?

 awk -v someVariable="$VAR1" '
        BEGIN {
         . . .
        }

        {
           SOME CODES HERE
        }
        END {}
    ' $FILES> gzip $RESULTING_OUTPUT

3 个答案:

答案 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