Discussion:
[shell-script] Como pegar uma parte do texto(não uma linha) em um arquivo que contém uma expressão
Celso Macêdo celsovsm@gmail.com [shell-script]
2018-05-06 02:07:41 UTC
Permalink
Boa noite, pessoal!

Supondo que tenhamos o arquivo maquinas.txt abaixo:

10.10.1.1

maquina 1 - zen01

maquina 2 - web01

maquina 3 - trend01


10.10...1.5

maquina 4 - xen01

maquina 5 - rede01

maquina 6 - fs1c1

maquina 7 - arcserve


10.10.1.10

maquina 8 - teste

maquina 9 - desenvolvimento


10...10.1.15

maquina 10 - homologa

Como fazer uma busca numa determinada expressão e apresentar todo um trecho
de texto que está entre o ip e uma linha vazia?

Exemplo: uma busca de xen01 deve mostrar:

10.10.1.5

maquina 4 - xen01

maquina 5 - rede01

maquina 6 - fs1c1

maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará exibir
para alcançar o resultado acima, pois o número de máquinas é variável

Valeu!!!

Celso
Tiago Peczenyj tiago.peczenyj@gmail.com [shell-script]
2018-05-06 14:16:46 UTC
Permalink
Ola

A seguinte expressão SED pode ajudar

sed -n '/inicio/,/fim/p' arquivo.txt

Onde inicio e fim são expressões. Faça uns testes até obter o resultado
adequado
Post by Celso Macêdo ***@gmail.com [shell-script]
Boa noite, pessoal!
10.10.1.1
maquina 1 - zen01
maquina 2 - web01
maquina 3 - trend01
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
10.10.1.10
maquina 8 - teste
maquina 9 - desenvolvimento
10.10.1.15
maquina 10 - homologa
Como fazer uma busca numa determinada expressão e apresentar todo um
trecho de texto que está entre o ip e uma linha vazia?
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará exibir
para alcançar o resultado acima, pois o número de máquinas é variável
Valeu!!!
Celso
--
Tiago B. Peczenyj

http://about.me/peczenyj
phfbettega@yahoo.com.br [shell-script]
2018-05-06 14:17:32 UTC
Permalink
Olá Celso, solução com sed.

sed -nr '/^[0-9]/ {:a;H;n;s/^[0-9]/&/;tb;ba;:b;x;s/xen01/&/;tc;n;ba;:c;p;q}' maquinas.txt
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Boa noite, pessoal!
10.10.1.1
maquina 1 - zen01
maquina 2 - web01
maquina 3 - trend01
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
10.10.1.10
maquina 8 - teste
maquina 9 - desenvolvimento
10.10.1.15
maquina 10 - homologa
Como fazer uma busca numa determinada expressão e apresentar todo um trecho de texto que está entre o ip e uma
linha vazia?
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará exibir para alcançar o resultado acima,
pois o número de máquinas é variável
Valeu!!!
Celso
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
Celso Macêdo celsovsm@gmail.com [shell-script]
2018-05-06 21:40:21 UTC
Permalink
Paulo,

Quase isso....

Mas não funciona com a última... "homologa"

[]'s
Celso
Post by ***@yahoo.com.br [shell-script]
Olá Celso, solução com sed.
sed -nr '/^[0-9]/ {:a;H;n;s/^[0-9]/&/;tb;ba;:b;x;s/xen01/&/;tc;n;ba;:c;p;q}' maquinas.txt
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Boa noite, pessoal!
10.10.1.1
maquina 1 - zen01
maquina 2 - web01
maquina 3 - trend01
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
10.10.1.10
maquina 8 - teste
maquina 9 - desenvolvimento
10.10.1.15
maquina 10 - homologa
Como fazer uma busca numa determinada expressão e apresentar todo um
trecho de texto que está entre o ip e uma
Post by Celso Macêdo ***@gmail.com [shell-script]
linha vazia?
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará
exibir para alcançar o resultado acima,
Post by Celso Macêdo ***@gmail.com [shell-script]
pois o número de máquinas é variável
Valeu!!!
Celso
----------------------------------------------------------
----------------------------------------------------------
phfbettega@yahoo.com.br [shell-script]
2018-05-07 00:53:03 UTC
Permalink
É verdade, no último bloco de texto não funciona porque a última linha
não começa com número.

Depois de carregar a última linha (algum comando 'n'), o comando
's/^[0-9]/&/' falha, então ao invés de ir para a marca 'b',
volta para a marca 'a', mas o arquivo já acabou, então o comando 'n'
não lê mais nenhuma linha e encerra o script sed naquele ponto.

O conserto é colocar um teste pra saber se a última linha foi lida.
Se foi, pula para a marca 'b'.
'/^[0-9]/ {:a;H;$bb;n;s/^[0-9]/&/;tb;ba;:b;x;s/homologa/&/;tc;n;ba;:c;p;q}'
(talvez eu tenha tomado o caminho mais complicado nesse sed rs)

Outra falha pode ser se alguma linha das máquinas começar com número,
nesse caso o casamento do ip tem que ser mais específico.
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Paulo,
Quase isso....
Mas não funciona com a última... "homologa"
[]'s
Celso
__
Olá Celso, solução com sed.
sed -nr '/^[0-9]/ {:a;H;n;s/^[0-9]/&/;tb;ba;:b;x;s/xen01/&/;tc;n;ba;:c;p;q}' maquinas.txt
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Boa noite, pessoal!
10.10.1.1
maquina 1 - zen01
maquina 2 - web01
maquina 3 - trend01
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
10.10.1.10
maquina 8 - teste
maquina 9 - desenvolvimento
10.10.1.15
maquina 10 - homologa
Como fazer uma busca numa determinada expressão e apresentar todo um trecho de texto que está entre o
ip e uma
Post by Celso Macêdo ***@gmail.com [shell-script]
linha vazia?
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará exibir para alcançar o resultado acima,
pois o número de máquinas é variável
Valeu!!!
Celso
----------------------------------------------------------
----------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
Celso Macêdo celsovsm@gmail.com [shell-script]
2018-05-07 04:05:23 UTC
Permalink
Valeu, Paulo!!!

Agora eu vou estudar sua solução, pois não conhecia esses detalhes todos do
sed.

Se alguém tiver outra alternativa usando outro comando, ou até um sed
diferente, eu quero aprender rsrsrsrsrs

[]'s
Celso
Post by ***@yahoo.com.br [shell-script]
É verdade, no último bloco de texto não funciona porque a última linha
não começa com número.
Depois de carregar a última linha (algum comando 'n'), o comando
's/^[0-9]/&/' falha, então ao invés de ir para a marca 'b',
volta para a marca 'a', mas o arquivo já acabou, então o comando 'n'
não lê mais nenhuma linha e encerra o script sed naquele ponto.
O conserto é colocar um teste pra saber se a última linha foi lida.
Se foi, pula para a marca 'b'.
'/^[0-9]/ {:a;H;$bb;n;s/^[0-9]/&/;tb;ba;:b;x;s/homologa/&/;tc;n;ba;:c;
p;q}'
(talvez eu tenha tomado o caminho mais complicado nesse sed rs)
Outra falha pode ser se alguma linha das máquinas começar com número,
nesse caso o casamento do ip tem que ser mais específico.
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Paulo,
Quase isso....
Mas não funciona com a última... "homologa"
[]'s
Celso
__
Olá Celso, solução com sed.
sed -nr '/^[0-9]/ {:a;H;n;s/^[0-9]/&/;tb;ba;:b;x;s/xen01/&/;tc;n;ba;:c;p;q}'
maquinas.txt
Post by Celso Macêdo ***@gmail.com [shell-script]
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Boa noite, pessoal!
10.10.1.1
maquina 1 - zen01
maquina 2 - web01
maquina 3 - trend01
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
10.10.1.10
maquina 8 - teste
maquina 9 - desenvolvimento
10.10.1.15
maquina 10 - homologa
Como fazer uma busca numa determinada expressão e apresentar todo um
trecho de texto que está entre o
Post by Celso Macêdo ***@gmail.com [shell-script]
ip e uma
Post by Celso Macêdo ***@gmail.com [shell-script]
linha vazia?
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará
exibir para alcançar o resultado acima,
Post by Celso Macêdo ***@gmail.com [shell-script]
Post by Celso Macêdo ***@gmail.com [shell-script]
pois o número de máquinas é variável
Valeu!!!
Celso
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
phfbettega@yahoo.com.br [shell-script]
2018-05-07 12:48:15 UTC
Permalink
Uma solução com bash, usando a dica do Mestre Julio de incluir uma linha extra
no final do arquivo para pegar o último bloco.

unset bloco linha_ip
while read linha
do
[[ "$linha" =~ ^[0-9] ]] && let linha_ip++
[ "$linha_ip" -eq 2 ] && {
grep -q xen01 <<<"$bloco" &&
{ echo -e "$bloco";break;} ||
{ bloco=;linha_ip=1;}
}
bloco+="$linha\n"
done < <(echo 1|cat maquinas.txt -)
Post by Celso Macêdo ***@gmail.com [shell-script]
Valeu, Paulo!!!
Agora eu vou estudar sua solução, pois não conhecia esses detalhes todos do sed.
Se alguém tiver outra alternativa usando outro comando, ou até um sed diferente, eu quero aprender rsrsrsrsrs
[]'s
Celso
__
É verdade, no último bloco de texto não funciona porque a última linha
não começa com número.
Depois de carregar a última linha (algum comando 'n'), o comando
's/^[0-9]/&/' falha, então ao invés de ir para a marca 'b',
volta para a marca 'a', mas o arquivo já acabou, então o comando 'n'
não lê mais nenhuma linha e encerra o script sed naquele ponto.
O conserto é colocar um teste pra saber se a última linha foi lida.
Se foi, pula para a marca 'b'.
'/^[0-9]/ {:a;H;$bb;n;s/^[0-9]/&/;tb;ba;:b;x;s/homologa/&/;tc;n;ba;:c;p;q}'
(talvez eu tenha tomado o caminho mais complicado nesse sed rs)
Outra falha pode ser se alguma linha das máquinas começar com número,
nesse caso o casamento do ip tem que ser mais específico.
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Paulo,
Quase isso....
Mas não funciona com a última... "homologa"
[]'s
Celso
__
Olá Celso, solução com sed.
sed -nr '/^[0-9]/ {:a;H;n;s/^[0-9]/&/;tb;ba;:b;x;s/xen01/&/;tc;n;ba;:c;p;q}' maquinas.txt
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Boa noite, pessoal!
10.10.1.1
maquina 1 - zen01
maquina 2 - web01
maquina 3 - trend01
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
10.10.1.10
maquina 8 - teste
maquina 9 - desenvolvimento
10.10.1.15
maquina 10 - homologa
Como fazer uma busca numa determinada expressão e apresentar todo um trecho de texto que está entre o
ip e uma
Post by Celso Macêdo ***@gmail.com [shell-script]
linha vazia?
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará exibir para alcançar o resultado
acima,
Post by Celso Macêdo ***@gmail.com [shell-script]
Post by Celso Macêdo ***@gmail.com [shell-script]
pois o número de máquinas é variável
Valeu!!!
Celso
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2018-05-07 09:31:28 UTC
Permalink
Talvez seja mais fácil começar o sed inserindo uma linha fictícia no final
do arquivo e terminá-lo removendo essa linha

Abraços,
Julio

*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» O treinamento está muito caro?*
*O melhor de todos em EAD é http://www.dicas-l.com.br/cursos/psl/
<http://www.dicas-l.com.br/cursos/psl/>*

*Damos treinamento em sua empresa **com certificado*
*e nota fiscal **por **um preço, **no mínimo, 50% **abaixo*
*de qualquer curso.*

​​
Nosso time de instrutores *in company* é formado somente por
​
​
autores
​ ​
​
de
*Best Sellers​ ​*​laureados ​sobre os temas.. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
Post by ***@yahoo.com.br [shell-script]
É verdade, no último bloco de texto não funciona porque a última linha
não começa com número.
Depois de carregar a última linha (algum comando 'n'), o comando
's/^[0-9]/&/' falha, então ao invés de ir para a marca 'b',
volta para a marca 'a', mas o arquivo já acabou, então o comando 'n'
não lê mais nenhuma linha e encerra o script sed naquele ponto.
O conserto é colocar um teste pra saber se a última linha foi lida.
Se foi, pula para a marca 'b'.
'/^[0-9]/ {:a;H;$bb;n;s/^[0-9]/&/;tb;ba;:b;x;s/homologa/&/;tc;n;ba;:c;
p;q}'
(talvez eu tenha tomado o caminho mais complicado nesse sed rs)
Outra falha pode ser se alguma linha das máquinas começar com número,
nesse caso o casamento do ip tem que ser mais específico.
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Paulo,
Quase isso....
Mas não funciona com a última... "homologa"
[]'s
Celso
__
Olá Celso, solução com sed.
sed -nr '/^[0-9]/ {:a;H;n;s/^[0-9]/&/;tb;ba;:b;x;s/xen01/&/;tc;n;ba;:c;p;q}'
maquinas.txt
Post by Celso Macêdo ***@gmail.com [shell-script]
Abraços Paulo
Post by Celso Macêdo ***@gmail.com [shell-script]
Boa noite, pessoal!
10.10.1.1
maquina 1 - zen01
maquina 2 - web01
maquina 3 - trend01
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
10.10.1.10
maquina 8 - teste
maquina 9 - desenvolvimento
10.10.1.15
maquina 10 - homologa
Como fazer uma busca numa determinada expressão e apresentar todo um
trecho de texto que está entre o
Post by Celso Macêdo ***@gmail.com [shell-script]
ip e uma
Post by Celso Macêdo ***@gmail.com [shell-script]
linha vazia?
10.10.1.5
maquina 4 - xen01
maquina 5 - rede01
maquina 6 - fs1c1
maquina 7 - arcserve
OBS: Você não sabe quantas linhas antes e quantas depois precisará
exibir para alcançar o resultado acima,
Post by Celso Macêdo ***@gmail.com [shell-script]
Post by Celso Macêdo ***@gmail.com [shell-script]
pois o número de máquinas é variável
Valeu!!!
Celso
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
itamarnet@yahoo.com.br [shell-script]
2018-05-07 11:37:44 UTC
Permalink
Caro Celso

Uma sugestão em awk:


awk '{linha[++j]=$0};/^10\./{ini=NR};/rede01/{imprime=1};/^ *$/{fim=(NR-1);if(imprime){for(i=ini;i<=fim;i++) print linha[i]};imprime=0};END{if (imprime){for(i=ini;i<=NR;i++) print linha[i]}}' maquinas.txt



Acredito que solucione


[]'s
Itamar
itamarnet@yahoo.com.br [shell-script]
2018-05-07 11:41:13 UTC
Permalink
Caro Celso

Aqui vai uma sugestão baseado em awk:


$ var='xen01'; awk '{linha[++j]=$0};/^10\./{ini=NR};/'$var'/{imprime=1};/^ *$/{fim=(NR-1);if(imprime){for(i=ini;i<=fim;i++) print linha[i]};imprime=0};END{if (imprime){for(i=ini;i<=NR;i++) print linha[i]}}' maquinas.txt



Espero que ajude


[]'s
Itamar
itamarnet@yahoo.com.br [shell-script]
2018-05-07 14:30:19 UTC
Permalink
Caro Celso


Outra opção simples que lembrei que pode usar apenas com sed:

(tac maquinas.txt | sed -n '/xen01/,/10\./p' | tac; sed -n '/xen01/,/^ *$/{/^ *$/d;p;}' maquinas.txt) | uniq



Nesse caso apenas se houver a coincidência em apenas um bloco, mas se a pesquisa encontrar a ocorrência em mais de um bloco isso não serve.


[]'s
Itamar

Loading...