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.