解压缩文件并使用 AWK 和管道处理其内容

解压缩文件并使用 AWK 和管道处理其内容

我需要解压缩日志文件,然后使用 awk 显示该日志文件的一些特定列。可以使用管道来完成吗?

unzip log.zip | awk -F "- -" '{pring $1 " " $2} >newfile

答案1

您需要使用unzip's-c选项将 .zip 文件的内容解压缩到标准输出......否则它将把 .zip 文件中的文件解压缩到磁盘上,并且不会有任何内容可以通过管道传输到awk

就像许多源自 MS-DOS/Windows 而不是 Unix 的程序一样,unzip它们也冗长地讲述它正在做什么。 Unix 程序通常不会这样做,除非您使用-vor--verbose--debug选项或类似选项明确告诉它们这样做。这是 dos/windows 和 unix 软件之间的显着文化差异。和程序员。

从任何在 stdin 上获取输入的程序的 POV 来看,这几乎肯定是会混淆它的垃圾(这就是为什么 UNIX 程序并不冗长,除非你告诉它们如此)。因此,请使用(安静)或(特别安静)选项unzip来告诉“闭嘴并开始工作” 。-q-qq

例如

unzip -qq -c log.zip | awk -F'- -' '{print $1, $2}' >newfile

顺便说一句,我稍微改变了你的awk脚本。我修复了pring语法错误。另外,默认的输出字段分隔符 ( OFS)awk是一个空格...即使您将输入字段分隔符 ( FS) 设置为其他内容(例如使用-F'- -')。所以我只是打印$1,$2- 不需要使用双引号空格字符。

答案2

你可以这样做:

awk -F "--" '{print $1 " "$2}' <(gzip -dc log.zip)

gzip 命令使用-d-c选项。

    -c --stdout --to-stdout
          Write output on standard output
    -d --decompress --uncompress
          Decompress.

您当然可以使用标准重定向将输出发送到文件

awk -F "--" '{print $1 " "$2}' <(gzip -dc log.zip) > my_out_file

正如 Cas 在评论中指出的那样,gzip 适用于大多数 .zip 文件,但不能保证适用于所有文件,您可以unzip与此命令一起使用。

awk -F "--" '{print $1 " "$2}' <(unzip -cq log.zip) > my_out_file

选项略有不同,但结果是相同的。

相关内容