Processe um arquivo de texto e um arquivo de texto gunzipped em um único comando [duplicado]

0

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?

    
por GC 13 17.04.2018 / 17:46

3 respostas

0

(cat mylog_1.log;zcat mylog_2.log.gz) | grep text | sort | uniq -c
    
por 17.04.2018 / 17:50
0

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
    
por 17.04.2018 / 20:55
0

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
    
por 17.04.2018 / 23:27