awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo [RESOLVIDO]

1. awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo [RESOLVIDO]

Mauricio Junior
juniormarangao

(usa Debian)

Enviado em 20/03/2019 - 00:05h

Amigos linuxers

tenho uma dúvida quanto ao comando
awk 
.

Eu tenho um script que gera um log txt, o conteúdo é uma lista de alarmes, e eu precisava de um comando que exibisse conteúdos específicos, por exemplo:

A1/APZ "2B30V2/2B05N2 R" 045 190201 0300 
SP UNIT FAULT

SPG NODE
0 A

FAULT TYPE
INTERNAL DIAGNOSTIC ERROR

SUSPECTED BOARD(S)

CABINET MAG PCB UNIT FAULT WEIGHT
SPG-0-A SPVCM HDD HD-1 83
SPG-0-A SPVCM CPU 17

A1/EXT "2B30V2/2B05N2 " 667 190318 1400
EXTERNAL ALARM
FURTO CABO SANTA PAULA
ERSUN.SEGURANCA


Este é um exemplo do arquivo log gerado, e eu queria que aparecesse todas as linhas que contém "A1" e as três linhas seguintes de cada um dos "A1" que tiver.

Com o comando
# cat rp1-log.txt | awk '/A1/{print}'  
eu consegui ver o conteúdo da linha A1, porém não sei como fazer para que exiba as 3 linhas seguintes junto.
Alguém sabe uma forma?

Desde já agradeço.


  


2. awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo

Mauricio Junior
juniormarangao

(usa Debian)

Enviado em 20/03/2019 - 08:32h

Galera, andei testando umas coisas.

Fiz um arquivo .awk para executar com o seguinte conteúdo:

#!/usr/bin/awk

/A1/{nlinha=NR;
print nlinha, $0;
print nlinha+1, $0;
print nlinha+2, $0;
print nlinha+3, $0}


Assim usando o comando
 # awk -f arquivo.awk log.txt  


Consegui com que mudasse a numeração das linhas, mas o conteúdo continua sendo o mesmo da primeira linha de "A1" que ele acha. Ficando assim:

12 A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
13 A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
14 A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
15 A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
29 A1/APT "2B30V2/2B05N2 R" 139 190319 1103
30 A1/APT "2B30V2/2B05N2 R" 139 190319 1103
31 A1/APT "2B30V2/2B05N2 R" 139 190319 1103
32 A1/APT "2B30V2/2B05N2 R" 139 190319 1103


Ou seja, a linha 12 e a linha 29 são as originais, e as linhas 13, 14 e 15, e as linhas 30, 31 e 32, era para exibir o conteúdo que deveria, mas só repetiu.



3. Re: awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo [RESOLVIDO]

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 20/03/2019 - 10:37h

Usando o "grep":
grep -A 3 "A1" arquivo.txt 

A opção "-A" (After) do grep significa mostrar as N linhas seguintes ao "termo" encontrado.



4. awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo

Mauricio Junior
juniormarangao

(usa Debian)

Enviado em 20/03/2019 - 10:54h

Nossa cara, eu quebrei a cabeça aqui faz uns dias já com isso, e mal sabia que dava para resolver com o grep... kkk

Eu meio que consegui também com o awk, mas com o grep é até mais fácil.

Obrigado Ryuk


E para quem também estiver procurando uma solução semelhante no awk aqui fica o comando que usei:
 # awk '/A1/,/\n\n/{print}' log.txt  


Assim exibindo entre o intervalo "A1" e "\n\n" que são duas quebras de linha.

 # awk '/intervalo1/,/intervalo2/{print}' arquivo.txt  







5. Re: awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 20/03/2019 - 16:01h

juniormarangao escreveu:

Amigos linuxers

tenho uma dúvida quanto ao comando
awk 
.

Eu tenho um script que gera um log txt, o conteúdo é uma lista de alarmes, e eu precisava de um comando que exibisse conteúdos específicos, por exemplo:

A1/APZ "2B30V2/2B05N2 R" 045 190201 0300 
SP UNIT FAULT

SPG NODE
0 A

FAULT TYPE
INTERNAL DIAGNOSTIC ERROR

SUSPECTED BOARD(S)

CABINET MAG PCB UNIT FAULT WEIGHT
SPG-0-A SPVCM HDD HD-1 83
SPG-0-A SPVCM CPU 17

A1/EXT "2B30V2/2B05N2 " 667 190318 1400
EXTERNAL ALARM
FURTO CABO SANTA PAULA
ERSUN.SEGURANCA


Este é um exemplo do arquivo log gerado, e eu queria que aparecesse todas as linhas que contém "A1" e as três linhas seguintes de cada um dos "A1" que tiver.

Com o comando
# cat rp1-log.txt | awk '/A1/{print}'  
eu consegui ver o conteúdo da linha A1, porém não sei como fazer para que exiba as 3 linhas seguintes junto.
Alguém sabe uma forma?
Desde já agradeço.

Boa tarde Junior.
Utilize a "linha vazia" como separador de registro,
No comando, isso é informado em "BEGIN{RS="\n\n"; #RS é o separador de registro. São dois \n, o da linha de cima e da própria linha....
FS="\n" Indica que os campos são separados por "\n".
Sendo assim, temos:
awk 'BEGIN{RS="\n\n";FS="\n"} $1~/A1/ {printf "%s\n%s\n%s\n" ,$1,$2,$3}' log.txt 
A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
SP UNIT FAULT

A1/EXT "2B30V2/2B05N2 " 667 190318 1400
EXTERNAL ALARM
FURTO CABO SANTA PAULA

VEJA => echo -e "$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')"
Att.: Marcelo Oliver


6. Re: awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo [RESOLVIDO]

Mauricio Junior
juniormarangao

(usa Debian)

Enviado em 06/04/2019 - 02:36h

msoliver escreveu:

juniormarangao escreveu:

Amigos linuxers

tenho uma dúvida quanto ao comando
awk 
.

Eu tenho um script que gera um log txt, o conteúdo é uma lista de alarmes, e eu precisava de um comando que exibisse conteúdos específicos, por exemplo:

A1/APZ "2B30V2/2B05N2 R" 045 190201 0300 
SP UNIT FAULT

SPG NODE
0 A

FAULT TYPE
INTERNAL DIAGNOSTIC ERROR

SUSPECTED BOARD(S)

CABINET MAG PCB UNIT FAULT WEIGHT
SPG-0-A SPVCM HDD HD-1 83
SPG-0-A SPVCM CPU 17

A1/EXT "2B30V2/2B05N2 " 667 190318 1400
EXTERNAL ALARM
FURTO CABO SANTA PAULA
ERSUN.SEGURANCA


Este é um exemplo do arquivo log gerado, e eu queria que aparecesse todas as linhas que contém "A1" e as três linhas seguintes de cada um dos "A1" que tiver.

Com o comando
# cat rp1-log.txt | awk '/A1/{print}'  
eu consegui ver o conteúdo da linha A1, porém não sei como fazer para que exiba as 3 linhas seguintes junto.
Alguém sabe uma forma?
Desde já agradeço.

Boa tarde Junior.
Utilize a "linha vazia" como separador de registro,
No comando, isso é informado em "BEGIN{RS="\n\n"; #RS é o separador de registro. São dois \n, o da linha de cima e da própria linha....
FS="\n" Indica que os campos são separados por "\n".
Sendo assim, temos:
awk 'BEGIN{RS="\n\n";FS="\n"} $1~/A1/ {printf "%s\n%s\n%s\n" ,$1,$2,$3}' log.txt 
A1/APZ "2B30V2/2B05N2 R" 045 190201 0300
SP UNIT FAULT

A1/EXT "2B30V2/2B05N2 " 667 190318 1400
EXTERNAL ALARM
FURTO CABO SANTA PAULA

VEJA => echo -e "$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')"
Att.: Marcelo Oliver


Opaa obrigado pela ajuda.

Tenho que estudar bastante essas coisas pq tipo esse ultimo exemplo que voce mandou com echo e sed, nossa eu não entendo nada kkk


7. Re: awk - Encontrar conteúdo específico de uma linha e mais linhas abaixo [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 06/04/2019 - 21:34h


Boa noite Junior.
O comando:
echo -e "$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')"
É para mostrar uma mensagem do Viva o Linux....
o lynx, que é um navegador em modo texto, "pega" o conteúdo da pagina , "https://www.vivaolinux.com.br/termos-de-uso/"
O sed filtra, da linha que começa com [ ]+Se, REGEX: /^[ ]+Se/
Até a linha que termina com dou., REGEX: /dou.$/

Bastante simples....
Tinha colocado o echo, para incluir linhas vazias.....
No caso, não está sendo utilizado....

Att.: Marcelo Oliver

Mensagem:
lynx -dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'

Att.: Marcelo Oliver






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts