我有一个处理以下文件类型的用例:
1 - mylog_1.log
2 - mylog_2.log.gz
我必须对每个命令运行两个不同的文本处理命令,如下所示:
cat mylog_1.log | grep text | sort | uniq -c
zcat mylog_2.log.gz | grep text | sort | uniq -c
(cat、grep、awk 和 sed 是常用命令)
有没有办法在单个命令中处理两种文件类型而无需解压缩文件?
答案1
(cat mylog_1.log;zcat mylog_2.log.gz) | grep text | sort | uniq -c
答案2
zgrep
将解压缩给定的文件,如果需要的话,然后将结果传递给grep
:
$ echo text one > log_1.log
$ echo text two > log_2.log
$ gzip log_2.log
$ zgrep text log_* | sort | uniq -c
1 log_1.log:text one
1 log_2.log.gz:text two
答案3
如果您的问题具体是如何在单个命令中处理文本文件和压缩文本文件,请参阅另一个问题。但是,如果您的问题通常是如何使用不同的工具从不同类型的文件中提取文本,然后以相同的方式处理它们,
for file in mylog_1.log mylog_2.log.gz …
do
if [[ "$file" == *.gz ]]
then
zcat "$file"
else
cat "$file"
fi | grep text | sort | uniq -c
done
这将单独处理每个文件。要组合(连接)它们并将聚合文本作为一个实体进行处理,只需移动管道即可:
for file in mylog_1.log mylog_2.log.gz …
do
if [[ "$file" == *.gz ]]
then
zcat "$file"
else
cat "$file"
fi
done | grep text | sort | uniq -c