我一直在工作中协助一些报告,并试图从我们生成的一些相当大的日志文件中获取不同元素的唯一计数。到目前为止,我已经能够运行两个单独的命令来得出计数,但由于一些限制,我必须将它们组合起来。这是我一直在运行的内容(文件、目录、搜索项的名称已更改以保护无辜者):
命令1- 过滤_transformer_
所有这些唯一的日志条目并将其写入新文件(我正在计算的每个项目每个事务都有多个条目,因此我这样做是为了加快下一步速度并删除重复项):
zgrep -a _transformer_ /files/are/located/here/logfile_date.gz > \
/temp/directory/count_file_date.gz
命令2- 计算与交易相关的每个项目的实例数量:
zgrep -caE 'shockwave|starscream|megatron|prowl|blaster' \
/temp/directory/count_file_date.gz
这非常有效,但我想将它们组合成一个命令并跳过写入新文件。这是我认为可行的方法,但事实并非如此:
单一命令
zgrep -a _transformer_ | \
zgrep -acE 'shockwave|starscream|megatron|prowl|blaster' \
/files/are/located/here/logfile_date.gz
运行上述命令会输出包含管道之间单词的所有日志条目的计数,并且不仅仅计算包含变压器在日志的特定行中。
答案1
zgrep -a _transformer_ /files/are/located/here/logfile_date.gz |
grep -acE 'shockwave|starscream|megatron|prowl|blaster'
第一个zgrep
调用gzip -dcf
文件,然后grep -a _transformer_
在内部运行结果流,生成一个未压缩的流,我们将其传递给另一个grep
调用,所有三个(gzip、grep、grep)同时运行,磁盘上没有存储任何中间数据。
您还可以手动运行这 3 个命令:
gzip -dcf /files/are/located/here/logfile_date.gz |
grep -a _transformer_ |
grep -acE 'shockwave|starscream|megatron|prowl|blaster'
(-f
(当与-c
和结合使用时-d
)的gzip
行为就像cat
文件碰巧没有被压缩一样,-d
解压缩,-c
在 stdout 上输出结果而不是生成未压缩的/files/are/located/here/logfile_date
)。
grep
如果支持的话,可以一并完成-P
:
gzip -dcf /files/are/located/here/logfile_date.gz |
grep -acP '^(?=.*_transformer_).*(shockwave|starscream|megatron|prowl|blaster)'
或者便携式地使用awk
:
gzip -dcf /files/are/located/here/logfile_date.gz |
awk -v n=0 '
/_transformer/ && /shockwave|starscream|megatron|prowl|blaster/ {n++}
END {print n}'