Dúvidas Grep

1. Dúvidas Grep

Guilherme Luiz Chinini
Chinini

(usa Ubuntu)

Enviado em 11/08/2016 - 12:47h

Boa Tarde a todos, estou utilizando o seguinte comando:
grep -m1 "SINTAXE" *.
Para imprimir a primeira linha com a ocorrência SINTAXE, ocorre que o termo SINTAXE aparece duas, três ou até quatro vezes no mesmo arquivo. Como faço para extrair uma linha específica, tipo apenas a segunda ocorrência ou apenas a terceira.

Grato a todos desde já


  


2. Re: Dúvidas Grep

thinomar
thinomar

(usa Linux Mint)

Enviado em 11/08/2016 - 15:16h

echo -e "teste1\ntste\nteste2\ntesdfg\nfdf\nteste3" | grep teste | sed -n '2p' 

Onde o '2p' do sed representa a linha 2 que, no caso, como pega a saída do grep, se torna a segunda ocorrência.
--
-I've been talking to the main computer
-And...?
-It hates me


3. Re: Dúvidas Grep

Guilherme Luiz Chinini
Chinini

(usa Ubuntu)

Enviado em 11/08/2016 - 16:01h

thinomar escreveu:

echo -e "teste1\ntste\nteste2\ntesdfg\nfdf\nteste3" | grep teste | sed -n '2p' 

Onde o '2p' do sed representa a linha 2 que, no caso, como pega a saída do grep, se torna a segunda ocorrência.
--
-I've been talking to the main computer
-And...?
-It hates me


Chinini escreveu:

Cara esse código funcionou bem, no entanto preciso fazer a mesma coisa para um conjunto extenso de arquivos, sendo que os mesmos não estão nomeados numericamente, você sabe se existe uma forma de fazer isso sem ter de usar grep "SINTAXE" | sed -n '2p' para cada um dos arquivos?

grato pela solução do primeiro problema


4. Re: Dúvidas Grep

thinomar
thinomar

(usa Linux Mint)

Enviado em 11/08/2016 - 16:04h

Mas precisa ser sempre a mesma ocorrência? Por exemplo, precisa ser sempre a terceira ocorrência da palavra SINTAXE em qualquer arquivo?
--
-I've been talking to the main computer
-And...?
-It hates me


5. Re: Dúvidas Grep

Guilherme Luiz Chinini
Chinini

(usa Ubuntu)

Enviado em 11/08/2016 - 16:34h

Na verdade preciso extrair hora a segunda ocorrência, ora a terceira ocorrência da SINTAXE, o que eu desejo fazer é extrair, por exemplo, apenas a terceira ocorrência da SINTAXE de vários arquivos e de preferência colocar isso num único arquivo ou exibir isso na tela, e assim proceder depois para a terceira, quarta ocorrência. Acho que com esse exemplo fica mais fácil, tenho um conjunto de 10 arquivos .log e quanto uso o comando grep "EUMP2 = " so3_def.log aparece isso:

so3_def.log: E2 = -0.9086093561D+00 EUMP2 = -0.57980232889696D+02
so3_def.log: E2 = -0.6800567330D+00 EUMP2 = -0.57576063725034D+02
so3_def.log: E2 = -0.6800567339D+00 EUMP2 = -0.57576063725973D+02
so3_def.log: E2 = -0.7224020082D+00 EUMP2 = -0.57572800181461D+02
so3_def.log: E2 = -0.6947100473D+00 EUMP2 = -0.57513291725802D+02

Usando grep -1m "EUMP2 = " so3_def.log aparece isso:

so3_def.log: E2 = -0.9086093561D+00 EUMP2 = -0.57980232889696D+02

Utilizando para o conjunto dos 10 arquivos, ou seja, grep -1m "EUMP2 = " *.log, obtenho o seguinte resultado:

2_metil_tiofeno_def.log: E2 = -0.9863289996D+00 EUMP2 = -0.41930309302775D+02
bef2_def.log: E2 = -0.5480533907D+00 EUMP2 = -0.49601475977720D+02
fna_def.log: E2 = -0.2767357227D+00 EUMP2 = -0.24417962300778D+02
li2_def.log: E2 = -0.2056039348D-01 EUMP2 = -0.41743170013922D+00
lih_def.log: E2 = -0.2584455339D-01 EUMP2 = -0.77503869115381D+00
lina_def.log: E2 = -0.1999475108D-01 EUMP2 = -0.39924559312257D+00
mgcl2_def.log: E2 = -0.4269718027D+00 EUMP2 = -0.30767312901359D+02
pcl5_def.log: E2 = -0.1179447337D+01 EUMP2 = -0.81032576299120D+02
scl2_def.log: E2 = -0.5732247625D+00 EUMP2 = -0.39878667740789D+02
so3_def.log: E2 = -0.9086093561D+00 EUMP2 = -0.57980232889696D+02

Ou seja ele imprimi apenas a primeira ocorrência da sintaxe UMP2 de cada arquivo .log. Resumindo o que pretendo fazer é o mesmo só que hora extraindo a segunda ocorrência, hora a terceira, hora a quarta ocorrência.


6. Re: Dúvidas Grep

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 11/08/2016 - 18:58h

Chinini escreveu:

Na verdade preciso extrair hora a segunda ocorrência, ora a terceira ocorrência da SINTAXE, o que eu desejo fazer é extrair, por exemplo, apenas a terceira ocorrência da SINTAXE de vários arquivos e de preferência colocar isso num único arquivo ou exibir isso na tela, e assim proceder depois para a terceira, quarta ocorrência. Acho que com esse exemplo fica mais fácil, tenho um conjunto de 10 arquivos .log e quanto uso o comando grep "EUMP2 = " so3_def.log aparece isso:

so3_def.log: E2 = -0.9086093561D+00 EUMP2 = -0.57980232889696D+02
so3_def.log: E2 = -0.6800567330D+00 EUMP2 = -0.57576063725034D+02
so3_def.log: E2 = -0.6800567339D+00 EUMP2 = -0.57576063725973D+02
so3_def.log: E2 = -0.7224020082D+00 EUMP2 = -0.57572800181461D+02
so3_def.log: E2 = -0.6947100473D+00 EUMP2 = -0.57513291725802D+02

Usando grep -1m "EUMP2 = " so3_def.log aparece isso:

so3_def.log: E2 = -0.9086093561D+00 EUMP2 = -0.57980232889696D+02

Utilizando para o conjunto dos 10 arquivos, ou seja, grep -1m "EUMP2 = " *.log, obtenho o seguinte resultado:

2_metil_tiofeno_def.log: E2 = -0.9863289996D+00 EUMP2 = -0.41930309302775D+02
bef2_def.log: E2 = -0.5480533907D+00 EUMP2 = -0.49601475977720D+02
fna_def.log: E2 = -0.2767357227D+00 EUMP2 = -0.24417962300778D+02
li2_def.log: E2 = -0.2056039348D-01 EUMP2 = -0.41743170013922D+00
lih_def.log: E2 = -0.2584455339D-01 EUMP2 = -0.77503869115381D+00
lina_def.log: E2 = -0.1999475108D-01 EUMP2 = -0.39924559312257D+00
mgcl2_def.log: E2 = -0.4269718027D+00 EUMP2 = -0.30767312901359D+02
pcl5_def.log: E2 = -0.1179447337D+01 EUMP2 = -0.81032576299120D+02
scl2_def.log: E2 = -0.5732247625D+00 EUMP2 = -0.39878667740789D+02
so3_def.log: E2 = -0.9086093561D+00 EUMP2 = -0.57980232889696D+02

Ou seja ele imprimi apenas a primeira ocorrência da sintaxe UMP2 de cada arquivo .log. Resumindo o que pretendo fazer é o mesmo só que hora extraindo a segunda ocorrência, hora a terceira, hora a quarta ocorrência.


Boa noite Chinini.
Verifique se é isso que deseja:

NN=2 #DEFINE A LINHA INICIAL
while ((NN<=4));do
for ARQ in $(ls -1 *.log);do
echo -e "ARQUIVO:$ARQ LINHA:$NN\n" >> SAIDA.txt
egrep 'EUMP2' $ARQ | sed -n ''$NN'p' >> SAIDA.txt
done
let NN++
done

No exemplo acima, vai "pegar" a 2ª, 3ª e 4ª OCORRÊNCIA de cada arquivo,
Caso queira "pegar" as linhas fora de ordem, tipo: 3, 1, 2, etc . . .
Faça as alterações:
Troque
while ((NN<=4));do
Por
for NN in 3 1 2;do
E
EXCLUA
"NN=2"
E
let NN++

É Isso....
Se a resposta lhe ajudou, retribua, marcando a como A MELHOR.

Att.:
Marcelo Oliver






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts