Conte novas linhas no arquivo por último 1 minuto

0

Com o bash, como contar novas linhas anexadas ao arquivo no último minuto 1?

O que seria mais inteligente se você quiser contar novas linhas para o último minuto em vários arquivos simultaneamente e obter a saída?

Eu tentei algumas coisas, mas não consigo encontrar uma boa solução.

Eu poderia tentar usar uma linguagem de programação em vez do Bash

    
por Adionditsak 20.01.2015 / 12:51

3 respostas

3

Use wc -l duas vezes e subtraia os resultados.

before=$(wc -l < yourfile)
sleep 60
after=$(wc -l < yourfile)
let dif=after-before
echo "$dif"

Você também pode imprimir apenas as últimas $dif linhas:

tail -n$dif yourfile

Embora mais linhas possam ter sido acrescentadas nesse meio tempo, nenhuma das operações é atômica aqui.

Se você quiser acompanhar as alterações incrementais (pelo menos o número de linhas adicionadas), registre a saída de wc -l a cada minuto. No entanto, não há como fazer isso sem saber com antecedência que você precisará disso. A menos que você tenha registros de data e hora em todas as linhas, não é possível saber qual parte do arquivo foi adicionada quando.

    
por 20.01.2015 / 13:07
2
{
  tail -c 1 > /dev/null
  sleep 60
  wc -l
} < your-file

com ksh93 :

{ sleep 60; wc -l; } < your-file <#((EOF))

Isso abre o arquivo, busca até o fim (na primeira leitura e descarte de um byte), depois dorme por 60 segundos e depois chama wc -l para contar o número de caracteres de nova linha entre a posição em que estávamos 1 minuto atrás e o (novo) final do arquivo (se for maior).

Observe que ele apenas lê a seção que foi adicionada nesses 60 segundos. Se o arquivo foi reescrito completamente, isso não levará em conta uma eventual alteração no número de caracteres de nova linha na parte original do arquivo.

Além disso, ele verifica as alterações no arquivo original mesmo que esse arquivo tenha sido excluído e / ou um arquivo com o mesmo nome tenha sido recriado ou vinculado ao diretório em que o arquivo foi originalmente aberto.

Se você quiser saber em quais linhas de taxa estão sendo adicionadas a um arquivo de log, outra opção é usar pv -l com tail -f :

for f in *access_log; do
  tail -fn0 -- "$f" | pv -cN "$f" -ral > /dev/null &
done
wait

-ra para taxa atual e média. -l , então a taxa é expressa em número de linhas por segundo.

    
por 20.01.2015 / 13:05
1

Esta é minha solução final:

#!/bin/bash

for i in *access_log; do
        (
        before=$(wc -l < $i)
        sleep 10
        after=$(wc -l < $i)
        let dif=after-before
        echo "$i: $dif"
        ) &
done
    
por 20.01.2015 / 13:45