我有一个 .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 。grep
stdout
无论您有多个压缩文件,还是同一文件内有多个匹配的部分,这都适用。
答案2
命令zcat
orgzip -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/'