torr / awk / grep localiza cadeia entre ponto e vírgula

1

Eu tenho um enorme arquivo de texto com algo assim:

igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;

e assim por diante ...

Eu gostaria de extrair todo o texto entre ponto e vírgula quando a string 'int' está presente. Existe uma maneira de fazer isso?

    
por RonaldoPA 06.09.2016 / 20:35

5 respostas

1

Já que você pediu por sed / grep, aqui está:

> cat file
igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;

> sed -nr 's/\s*;\s*/\n/gp' file | grep int
igldapint01
igdbint01
igmsgint02

Ou consiga-o apenas com uma única chamada sed ...

> sed -nr -e 's/\s*;\s*/\n/g;/int/P' file
igldapint01
igdbint01
igmsgint02
    
por 06.09.2016 / 21:02
2

Usou o comando "tr" para substituir os pontos-e-vírgulas por novas linhas e depois executar o grep (que é orientado por linhas).

$ cat input.txt | tr ';' '\n' | grep int
 igldapint01
 igdbint01
 igmsgint02
    
por 06.09.2016 / 20:51
1

Uma maneira é enganar e converter o ; em novas linhas e, em seguida, você pode apenas grep eg

tr ';' '2' | grep int

por exemplo

$ cat x
igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;

$ cat x | tr ';' '2' | grep int
igldapint01
 igdbint01
 igmsgint02

Observe que ele tem espaços em alguns casos, porque o espaço é entre os ; s. Observe também que a primeira palavra de uma linha (que não é estritamente entre ; em uma linha, mas está entre elas nos dados) também é retornada.

    
por 06.09.2016 / 20:49
0
% echo 'aint;int;cint' | perl -nle 'print for grep /int/, split /\s*;\s*/'
aint
int
cint
% 

Ou apenas split ";" para preservar qualquer espaço entre.

    
por 06.09.2016 / 20:43
0
$ cat abc.txt 
igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;

$ grep -o '[^;]*int[^;]*' abc.txt 
igldapint01
 igdbint01
 igmsgint02

Se espaços não forem desejados:

$ grep -o '[^ ;]*int[^ ;]*' abc.txt 
igldapint01
igdbint01
igmsgint02
    
por 07.09.2016 / 04:39

Tags