UNIX 从 .gz 文件打印内容

UNIX 从 .gz 文件打印内容

我有一个 .gz 文件,其内容如下:

ID:123455   23-07-2015 mvni
warning: RTM post
warning : no profile data

我想使用字符串no profile data打印 ID。我尝试在行前和行后使用 grep 但它不起作用。请建议任何其他方法。

答案1

$ zgrep -B2 'warning : no profile data' *.gz | grep -o '^ID:[0-9]*'
ID:123455

正如 user3188445 所指出的,zgrep将 grep 查找(可能是压缩的)文件中的字符串。用于在警告匹配之前打印 2 行,然后使用标准的against-B2提取所有匹配文件的 ID 。grepstdout

无论您有多个压缩文件,还是同一文件内有多个匹配的部分,这都适用。

答案2

命令zcatorgzip -dc将解压缩 gzip 压缩文件的输出并将其打印到 stdout。例如,您可以运行zcat file.gz | grep '^ID:'.但是,大多数系统都有一个名为 的命令zgrep已经可以为您完成此操作。

更新

假设您有一堆这样的文件,并且想要打印包含特定警告的文件中的 ID 行,您可以执行以下操作:

zgrep -l 'warning : no profile data' *.gz | xargs zgrep '^ID:'

第一个命令zgrep -l打印包含警告的文件列表。第二个命令xargs接受标准输入上的参数列表并对所有输入运行命令。它运行的命令也是zgrep,以便打印你想要的ID行。

第二次更新

要仅提取数字 ID,请采用我之前建议的命令并附加

| sed -e 's/^ID:\([0-9]*\) .*/\1/'

这只会打印 ID 号。

答案3

您可以使用 zgrep 来 grep .gz 文件。我怀疑你想要类似的东西:

zgrep -B 2 'warning : no profile data' file.gz

答案4

如果您有权访问 GNU 实用程序,这应该可以工作:

zgrep -B2 "no profile data" file | grep -oP 'ID:\K\d+'

如果这不起作用,您可以尝试以下方法:

zcat file.gz | grep -B2 "no profile data" | sed -n 's/ID:\([0-9]*\).*/\1/p'

或者:

zcat file.gz | 
 awk '{if(/^ID/){split($1,a,/:/); id=a[2];}if(/no profile data/){print id}}'

或者:

 zcat file.gz | perl -lne '$id=$1 if /^ID:(\d+)/; print $id if /no profile data/'

相关内容