UNIX para imprimir um conteúdo de um arquivo .gz

1

Eu tenho um arquivo .gz com o seguinte conteúdo:

ID:123455   23-07-2015 mvni
warning: RTM post
warning : no profile data

Usando a string no profile data , quero imprimir o ID. Eu tentei com o grep antes e depois das linhas, mas não está funcionando. Por favor, sugira quaisquer outros métodos.

    
por Pooja 23.07.2015 / 16:46

4 respostas

3

$ zgrep -B2 'warning : no profile data' *.gz | grep -o '^ID:[0-9]*'
ID:123455

Como apontado por user3188445, zgrep irá grep para strings dentro de arquivos (possivelmente compactados). Usando -B2 para imprimir 2 linhas antes da correspondência de aviso e, em seguida, extrair as IDs de todos os arquivos correspondentes usando um padrão grep em relação a stdout .

Isso funcionará se você tiver vários arquivos compactados ou várias seções correspondentes no mesmo arquivo.

    
por 23.07.2015 / 16:59
2

O comando zcat ou gzip -dc descompactará e imprimirá a saída de um arquivo gzipado no stdout. Então você pode executar, por exemplo, zcat file.gz | grep '^ID:' . No entanto, a maioria dos sistemas tem um comando chamado zgrep que já faz isso para você.

atualizar

Supondo que você tenha vários desses arquivos e queira imprimir a linha de IDs de arquivos que contenham um aviso específico, faça o seguinte:

zgrep -l 'warning : no profile data' *.gz | xargs zgrep '^ID:'

O primeiro comando, zgrep -l , imprime uma lista de arquivos que contêm o aviso. O segundo comando, xargs , pega uma lista de argumentos na entrada padrão e executa um comando em todas as entradas. O comando que ele executa também é zgrep , para imprimir a linha de ID desejada.

Segunda atualização

Para extrair apenas o ID numérico, pegue o comando que eu sugeri anteriormente e anexe

| sed -e 's/^ID:\([0-9]*\) .*//'

Isso apenas imprimirá o número de ID.

    
por 23.07.2015 / 16:51
1

Você pode usar o zgrep para aplicar um arquivo .gz. Eu suspeito que você quer algo como:

zgrep -B 2 'warning : no profile data' file.gz
    
por 23.07.2015 / 17:04
1

Se você tiver acesso a utilitários GNU, isso deve funcionar:

zgrep -B2 "no profile data" file | grep -oP 'ID:\K\d+'

Se isso não funcionar, você pode tentar isso:

zcat file.gz | grep -B2 "no profile data" | sed -n 's/ID:\([0-9]*\).*//p'

Ou:

zcat file.gz | 
 awk '{if(/^ID/){split($1,a,/:/); id=a[2];}if(/no profile data/){print id}}'

Ou:

 zcat file.gz | perl -lne '$id=$1 if /^ID:(\d+)/; print $id if /no profile data/'
    
por 23.07.2015 / 19:56