Descompacte um arquivo e processe seu conteúdo usando AWK e pipes

0

Eu preciso descompactar um arquivo de log e exibir algumas colunas específicas desse arquivo de log usando o awk. Pode ser feito usando pipe?

unzip log.zip | awk -F "- -" '{pring $1 " " $2} >newfile
    
por Sampad Mund 20.02.2018 / 07:30

2 respostas

2

Você precisa usar a opção unzip do -c para descompactar o conteúdo do arquivo .zip para o stdout .... caso contrário, ele descompactará o (s) arquivo (s) no arquivo .zip no disco, e aí não seja nada para canalizar em awk .

Como muitos programas que se originaram do MS-DOS / Windows em vez do Unix, unzip também fala sobre o que está fazendo. Os programas Unix geralmente não fazem isso até que você os informe explicitamente com uma opção -v ou --verbose ou --debug ou similar. É uma diferença cultural significativa entre o dos / windows e o software unix. e programadores.

A partir do ponto de vista de qualquer programa que receba entrada em stdin, isso é quase certamente um lixo que irá confundi-lo (é por isso que os programas unix não são detalhados a menos que você diga que eles são). Portanto, diga unzip para "calar a boca e começar a trabalhar" com a opção -q (silenciosa) ou -qq (extra silenciosa).

por exemplo,

unzip -qq -c log.zip | awk -F'- -' '{print $1, $2}' >newfile

BTW, eu mudei seu script awk ligeiramente. Corrigi o erro de sintaxe pring . Além disso, o separador de campo de saída padrão ( OFS ) em awk é um único espaço ... mesmo se você definir o separador de campo de entrada ( FS ) como algo diferente (por exemplo, com -F'- -' ). Por isso, imprimi apenas $1,$2 - não é necessário usar um caractere de espaço com aspas duplas.

    
por 20.02.2018 / 09:26
0

Você pode fazer isso:

awk -F "--" '{print $1 " "$2}' <(gzip -dc log.zip)

O comando gzip usa as opções -d e -c .

    -c --stdout --to-stdout
          Write output on standard output
    -d --decompress --uncompress
          Decompress.

Você pode usar o redirecionamento padrão para enviar a saída para um arquivo

awk -F "--" '{print $1 " "$2}' <(gzip -dc log.zip) > my_out_file

Como Cas apontou nos comentários, o gzip funciona para a maioria dos arquivos .zip, mas não é garantido que funcione com todos eles, você pode usar unzip com este comando.

awk -F "--" '{print $1 " "$2}' <(unzip -cq log.zip) > my_out_file

As opções são ligeiramente diferentes, mas o resultado é o mesmo.

    
por 20.02.2018 / 09:05

Tags