如何对 awk 命令的结果输出进行 gzip 压缩?

Phi*_*ris 1 bash awk gzip

我尝试过这个,但没有成功。如何从 awk 命令生成 gz 文件的输出?

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

        {
           SOME CODES HERE
        }
        END {}
    ' $FILES> gzip $RESULTING_OUTPUT
Run Code Online (Sandbox Code Playgroud)

gho*_*oti 5

您可以将输出通过管道传输到 awk 外部的 gzip(如 Tom 建议的那样),也可以通过awk内部的管道发送输出。像这样:

awk '
  {
    print | "gzip > /path/to/output.gz";
  }
' inputfile
Run Code Online (Sandbox Code Playgroud)

这在某些情况下具有巨大的优势。例如,如果您想将一个很长的日志文件拆分为每小时的块,您可以将输出命令构建为变量,然后通过管道传输到该变量。

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
Run Code Online (Sandbox Code Playgroud)

通过这种用法,您的输出 gzip 命令行将针对每一行输入重新计算,并且 awk不会关闭管道,除非被告知手动关闭管道,或者 awk 耗尽输入并退出。

我自己的用例是,我们从 CDN 收集不按时间顺序排列的 Web 服务器日志。日志对于 来说太大了sort,但是当分成每小时的块时可以处理。

YMMV。最佳解决方案取决于您实际想要实现的目标,而您尚未告诉我们。