(cat mylog_1.log;zcat mylog_2.log.gz) | grep text | sort | uniq -c
Eu tenho um caso de uso para processar os seguintes tipos de arquivo:
1 - mylog_1.log
2 - mylog_2.log.gz
Eu tenho que executar dois comandos de processamento de texto diferentes em cada um deles da seguinte forma:
cat mylog_1.log | grep text | sort | uniq -c
zcat mylog_2.log.gz | grep text | sort | uniq -c
(cat, grep, awk e sed são os comandos mais usados)
Existe uma maneira de processar os dois tipos de arquivo em um único comando sem descompactar o arquivo?
(cat mylog_1.log;zcat mylog_2.log.gz) | grep text | sort | uniq -c
zgrep
irá descompactar os arquivos fornecidos, se necessário , depois passar os resultados para 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
Se a sua pergunta for especificamente como processar um arquivo de texto e um arquivo de texto gunzipped em um único comando, veja a outra questão. Mas se a sua pergunta é, em geral, como extrair texto de diferentes tipos de arquivos, usando diferentes ferramentas, e depois processá-los da mesma maneira,
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
Isso processará cada arquivo separadamente. Para combinar (concatenar) e processar o texto agregado como uma entidade, basta mover o tubo:
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
Tags text-processing gunzip