fbpx
Aplicativos

Usando o comando sed para filtragem de texto.

Apresentando o problema:

Um certo formulário de um site além de enviar o e-mail tanto para o destinatário quanto uma cópia para o próprio remetente, também salvava todos os dados dentro de um arquivo de texto, porém para determinado trabalho, eu precisava coletar apenas algumas informações de todos os contatos que foram feitos a partir de uma data.

A solução:

Já falei aqui outras vezes sobre o comando sed: Como adicionar caractere em posição específica do texto e Como substituir uma string em vários arquivos. Pois foi novamente com ele que eu consegui resolver este meu pequeno problema, como demonstro no script abaixo:


#!/bin/bash

destfile=/home/user/pedidos/filtro.txt;
touch --date "2015-10-01  00:00:00" /tmp/start
array=($(find /home/user/pedidos/2*.txt -type f -newer /tmp/start |sort))
n=${#array[@]};
b=1

for ((x=0; x < $n; x++)); do
	echo "PEDIDO NÚMERO: " $(($x + $b)) >> "$destfile"
	echo $(sed -n 7' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 8' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 11' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 12' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 14' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 30' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 31' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 32' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 40' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 41' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 42' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 43' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 44' p;' ${array[$x]}) >> "$destfile"
	echo $(sed -n 45' p;' ${array[$x]}) >> "$destfile"
	echo "###############################################################################" >> "$destfile"

done

Sim, pequei em não ter comentado o script, porém não é nada difícil entendê-lo: criei a variável “destfile” com o caminho do arquivo a ser salvo com as informações filtradas:


destfile=/home/user/pedidos/filtro.txt;

Em seguida, criei um arquivo temporário atribuindo a ele uma outra data de criação (no caso, a data a partir da qual quero obter as informações desejadas, no exemplo: 01/10/2015 a partir das 00:00 horas:)


touch --date "2015-10-01  00:00:00" /tmp/start

“Populei” (tá certo esse termo?) um array com o resultado de uma busca feita com o comando **find** para encontrar os arquivos mais novos que o meu arquivo temporário criado anteriormente: `-newer /tmp/start` e coloqueios em ordem com o comando **sort**:


array=($(find /home/user/pedidos/2*.txt -type f -newer /tmp/start |sort))

Efetuo uma contagem de quantos elementos estão dentro deste array que foi criado e atribui este valor à variável “n”


n=${#array[@]};

Criei a variável “b” e atribui à ela o valor 1 para utilizá-la para escrever o n. do elemento para visualização e contagem, afinal, o primeiro elemento de um array sempre será 0, mas eu quero que ele seja exibido ao usuário final como sendo 1, até mesmo porque ao final ele me dará o número total de pedidos/contatos realizados e não pretendia explicar que àquele número deveria ser acrescentado +1 para saber o número total. 😉

Feito isso, para cada elemento no array, até que se chegasse ao número total de elementos é impressa no arquivo de destino a linha desejada com o comando echo, porém filtrada pelo comando sed, como por exemplo:


echo $(sed -n 7' p;' ${array[$x]}) >> "$destfile"

Basicamente esta é a história de como o comando sed salvou mais uma vez a barra deste programador preguiçoso aqui, espero que ele possa ser útil para mais alguém, por isso compartilho aqui. Se foi util para você, compartilhe também. Ou se tiver alguma ideia de como melhorar o script, deixe seu comentário.

Felix

Residindo atualmente na cidade de Cascavel, no oeste do Paraná. Já dei aulas de informática, trabalhei com Hardware, redes, fui analista de suporte, aprendi SEO e mídias sociais e também programação. Faço um pouco de tudo, mas não sou especialista em nada, por isso estou sempre estudando e tentando evoluir. Com isso vou compartilhando aqui um pouco do que vou aprendendo no dia a dia.

Verified by MonsterInsights