我需要解压缩日志文件,然后使用 awk 显示该日志文件的一些特定列。可以使用管道来完成吗?
unzip log.zip | awk -F "- -" '{pring $1 " " $2} >newfile
答案1
您需要使用unzip
's-c
选项将 .zip 文件的内容解压缩到标准输出......否则它将把 .zip 文件中的文件解压缩到磁盘上,并且不会有任何内容可以通过管道传输到awk
。
就像许多源自 MS-DOS/Windows 而不是 Unix 的程序一样,unzip
它们也冗长地讲述它正在做什么。 Unix 程序通常不会这样做,除非您使用-v
or--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
选项略有不同,但结果是相同的。