extrair vários arquivos .gz e imprimir o nome do arquivo extraído

0

Eu acho que isso é fácil, mas estou bloqueando ...

Eu tenho um diretório com uma série de arquivos de log (do servidor minecraft ...):

2014-09-28-1.log.gz
2014-09-29-1.log.gz
2014-09-30-1.log.gz
2014-10-01-1.log.gz
2014-10-02-1.log.gz
latest.log

Gostaria de extrair a data e a hora em que os usuários efetuaram login. No entanto, quando faço isso

gzcat *.gz | grep 'logged in'

Eu recebo uma saída assim:

[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location)
[18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location)
[01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location)

etc.

Infelizmente, enquanto recebo o carimbo de data / hora, não recebo a data. Idealmente, a saída seria

2014-10-03 19:26:03 Foo logged in
2014-10-04 18:26:08 Baz logged in
2014-10-05 01:16:38 User logged in

Eu reconheço que posso precisar e awk script para chegar a essa saída "ideal". Mas existe uma solução abreviada (não awk) para obter apenas a data intercalada com a listagem? Algo parecido com isto:

2014-10-03-1.log.gz
[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location)
2014-10-04-1.log.gz
[18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location)
2014-10-05-1.log.gz
[01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location)

(ou seja, o nome do arquivo antes dos bits de grep dentro de cada arquivo) já seria muito útil.

Note que normalmente há muitas outras entradas em cada arquivo de log - pode haver vários logins e outras mensagens (que eu não estou interessado hoje).

Na forma mais curta, minha pergunta se torna:

Can I use gzcat in a way that it prints the name of every zip file before passing the contents of that zip file to grep for further processing?

Eu poderia escrever um script para fazer a coisa toda; mas eu estou procurando algo mais inteligente (eu queria saber se tee pode ser usado para imprimir o nome do arquivo para stderr , bem como passar como argumento para grep , talvez.)

    
por Floris 05.10.2014 / 16:09

1 resposta

2

Este gzcat é fornecido por gzip package? Na minha máquina openSUSE GNU / Linux, o binário é chamado zcat . Se gzip estiver realmente instalado em sua máquina, você também deve ter outro binário chamado zgrep , que é apenas um script de shell que descompacta arquivos para stdout e invoca grep .

zgrep aceita (quase) o mesmo conjunto de argumentos que grep . Então você poderia fazer isso:

$ zgrep -H 'logged in' *.gz'

Isso retornará a saída neste formato:

2014-10-03-1.log.gz:[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location)

Você pode substituir .gz: com apenas um espaço em branco usando tr ou sed para obter algo próximo da sua saída ideal .

    
por 06.10.2014 / 00:48

Tags