Redirecionar a saída final para um arquivo e parar quando a correspondência for encontrada

4

Existe este ficheiro de registo em que os dados que chegam são contínuos. O que eu queria que acontecesse era afixar -f esse arquivo de log e redirecioná-lo para um arquivo com as condições ff

exemplo do conteúdo dos arquivos de log

aaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
ccccccccccccccc
ddddddddddddddd
eeeeeeeeeeeeeee
fffffffffffffff
ggggggggggggggg
hhhhhhhhhhhhhhh
iiiiiiiiiiiiiii

no tailing, eu quero que o redirecionamento comece quando ele encontrar o primeiro padrão, então pare o redirecionamento, assim como o tailing quando eu encontrar o segundo padrão. por exemplo

Eu quero que o redirecionamento comece quando ele encontrar o padrão "ddddddddddddddd" e pare quando encontrar "hhhhhhhhhhhhhhh" o conteúdo do arquivo criado a partir do redirecionamento deve ser

ddddddddddddddd
eeeeeeeeeeeeeee
fffffffffffffff
ggggggggggggggg
hhhhhhhhhhhhhhh

Na codificação, estou pensando em algo assim. Mas eu não tenho idéia de como parar o redirecionamento quando ele encontrou o segundo padrão.

tail -f logfile > log.tmp
while grep "ddddddddddddddd" log.tmp
do
cat log.tmp > logfile
done
    
por nolram16 24.04.2015 / 10:03

3 respostas

4

Isso é exatamente o que retail faz. retail é a cauda com expressões regulares, uma ferramenta que escrevi exatamente para o caso de uso que você tem aqui. No seu caso, você usaria:

retail -f -r ddddddddddddddd -u hhhhhhhhhhhhhhh logfile > log.tmp

-f é a opção padrão tail -f . -r usa uma expressão regular para iniciar o intervalo de linhas a incluir e -u tem uma expressão regular para continuar até. Começa na última ocorrência do padrão -r e sai depois da impressão da primeira ocorrência do padrão -u depois disso.

Se você quiser começar da primeira instância do padrão, use -b em combinação com -r . Ambas as expressões regulares são EREs , sem nenhuma ancoragem implícita, mas você pode usar ^ e $ para ancorar a partida como de costume.

Você pode obter e criar retail com:

git clone https://github.com/mwh/retail.git
cd retail
./configure
make
make install

Ele é instalado em ~/.local/bin por padrão, mas você pode alterá-lo ou apenas copiar o executável onde quiser.

retail é totalmente compatível com POSIX , embora eu não recomende usar realmente como seu sistema tail .

    
por 24.04.2015 / 10:18
0

Se eu entendi suas demandas, corrija o que você espera:

awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1' infile | tail -f

awk funciona como filtro no arquivo "infile"; Ele imprime tudo entre os padrões dados em um "trecho" de arquivo, e também imprime todas as linhas para a saída padrão, que é processada por tail -f como de costume.

Caso você queira usá-lo com dados transmitidos:

some_process | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1'  | tail -f

(Nota: Como tail -f é um programa interativo, ele deve vir, se possível, sempre em um pipeline).

    
por 24.04.2015 / 11:41
0

Talvez você possa usar os padrões de intervalo de awk aqui:

tail -f logfile | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/'

Se você precisar contornar o problema SIGPIPE , use socat em vez de tail para o trabalho:

socat -u file:logfile,ignoreeof "system:'stdbuf -o0 awk /ddddddddddddddd/,/hhhhhhhhhhhhhhh/'" > logfile.new
    
por 24.04.2015 / 11:35