Chamando um arquivo com nome de arquivo variável no script bash

0

Digamos que eu tenha um arquivo de origem chamado A com muitas strings de 1 e 2, e cujo conteúdo está sendo modificado e alterado automaticamente (novas strings de 1 e 2 são adicionadas), e que eu executo um grep em este arquivo para extrair '1' strings em outro arquivo chamado B.

grep '1' A > B

Agora, as próximas operações do grep não devem apenas fazer um grep em B, mas também comparar B e A para extrair novas strings (e apenas novas strings) em outro arquivo. Isso deve ser feito repetidamente. Para isso eu crio um novo arquivo C que contém as strings '1' do conteúdo atualizado de A, compare com B e extraia a diferença em um novo arquivo chamado D:

grep '1' A > B
sleep 60
while true; do
grep '1' A > C
grep -v -F -x -f B C > D
sleep 60
done &

O problema é que ele não funcionará corretamente, já que B é um grep antigo de A, então a próxima vez que ele for executado, C será comparado apenas a este B antigo que não está sendo atualizado. Além disso, D está sendo sobregravado a cada vez.

Eu preciso ser capaz de instruir o script para cada vez que manter uma cópia do último B, então A é sempre comparado com sua versão anterior, e C sempre mostra a diferença entre o atual A e o anterior, o último B. don Não preciso manter versões anteriores de C enquanto as copio em outro lugar.

Eu percebi que tinha que usar nomes de arquivos variáveis e tentei adicionar uma variável $ (data) nos nomes de arquivos B e C, mas obviamente não funciona, pois o grep não os reconhece (como a data muda entre cada execução do script).

PS: Encontrei uma solução limpando o conteúdo de A entre cada execução, para que apenas o novo conteúdo seja levado em consideração, o que elimina a necessidade de usar nomes de variáveis e a segunda operação do grep. Eu ainda gostaria de aprender como chamar nomes de arquivos variáveis em scripts bash.

PS2: Estou escrevendo no meu telefone, então não sei como codificar corretamente o script bash.

    
por Paka 10.01.2017 / 10:13

1 resposta

0

por que não simplesmente substituir B?

grep '1' A > B
sleep 60
while true; do
grep '1' A > C
grep -v -F -x -f B C > D
cat C >> B   ####
sleep 60
done &

Dessa forma, D só obterá os últimos 60 segundos de 1 em A .

    
por 10.01.2017 / 16:57

Tags