我尝试过这个,但没有成功。如何从 awk 命令生成 gz 文件的输出?
awk -v someVariable="$VAR1" '
BEGIN {
. . .
}
{
SOME CODES HERE
}
END {}
' $FILES> gzip $RESULTING_OUTPUT
Run Code Online (Sandbox Code Playgroud)
您可以将输出通过管道传输到 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。最佳解决方案取决于您实际想要实现的目标,而您尚未告诉我们。
| 归档时间: |
|
| 查看次数: |
2963 次 |
| 最近记录: |