Estou tentando ver quantas vezes foo bar
aparece /var/log/foo.log
dentro de um período arbitrário em um servidor remoto, mas nada que eu tentei até agora funcionou.
Eu já tenho um script de cronômetro que eu uso para acompanhar quanto tempo se passou desde que comecei a seguir /var/log/foo.log
e agora gostaria de saber como quantas vezes foo bar
apareceram na saída de cauda.
Pesquisei no google, mas não encontrei nada pertinente nas primeiras 10 páginas de resultados.
Aqui está o que eu tentei com resultados frustrantes:
## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'
Eu até tentei escrever um script sed que agisse assim tail -f
, mas fiz um progresso limitado a nenhum com isso.
NOTA
o servidor remoto está executando uma versão mais antiga do coreutils e a atualização é uma opção, mas NÃO é de forma alguma a solução desejada.
fonte
--line-buffered
opção paragrep
. Outail -f ... | awk '/foo bar/{print ++n, $0}'
tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'
Respostas:
funciona para mim e é o primeiro que eu pensei - ou seja, se você realmente deseja as linhas numeradas de 1 e não com o número real da linha do arquivo assistido. Opcionalmente, adicione
grep
se necessário ao local apropriado (antes ou depoisnl
). No entanto, lembre-se de que pode ocorrer buffer. No meu caso particular,grep
tem a--line-buffered
opção, masnl
armazena em buffer a saída e não tem a opção de desativá-la. Portanto, otail | nl | grep
combo não flui muito bem.Dito isto,
funciona para mim também. A numeração começa novamente a partir do início do "final" em vez de iniciar o arquivo de log inteiro.
fonte
-n
opção.--line-number
:tail -f /var/log/foo.log | grep foo\ bar --line-number
funciona!Eu acho que isso é melhor ..
fonte
Você também pode canalizar a saída para
less
, pois ela possui um recurso de número de linha, o-N
que permitiria rolar para frente e para trás no log.Exemplo
NOTA: Observe a saída. Você pode ou não gostar desse recurso, mas ele terá linhas longas e as cortará para que continuem na próxima linha, mas ainda mantenha o mesmo número de linha correspondente. Acho esse recurso inestimável ao analisar arquivos de log que são amplos! Você pode ver o efeito desse recurso nas linhas 6 e 8 .
fonte
tail
. Quanto às longas filas, esse comportamento é alternado noless
uso-S
.Para grep novas linhas apenas no arquivo de log como elas vêm com o número de linha, você pode:
(com
mawk
, você desejará adicionar a-Winteractive
opção para impedir seu buffer de entrada (!)).wc -l
lê as linhas que já estavam lá e as conta (os caracteres de nova linha, o que significa que ainda funciona mesmo que a última linha ainda não esteja cheia), e depoistail -f
o resto (a partir de ondewc
parou de ler) e dizawk
qual é o número da linha de o primeiro que vê.fonte
l
o nome da variável me fez apertar os olhos para $ 1, pensando que era$1
^^ (mas como eu conheço (e 100% confio) em você, reli e vi a verdade). Apenas por curiosidade: para evitar alguma "condição de corrida" entre owc -l
e otail -f
(se o arquivo cresce rapidamente, pode-se descartar algumas linhas e, assim, o NR começa com o número errado), é possível pular as$l
linhas? (e que limite existe para a cauda-n
no posix e no gnu?). Talvez com um arquivo intermediário temporário?tail -n +1
(leia qualquer coisa da posição inicial) aborda as preocupações das condições da corrida. Ele lerá as linhas que não estavam no arquivo no momentowc -l
finalizado, na posição exata que owc
deixou. Portanto, a NR terá a posição correta, independentemente de quantas linhas foram escritas entre owc
final e otail
início. É se você dissertail
para começar de alguma posição em relação ao final do arquivo que você terá problemas.tail -n +1
aqui), para arquivos regulares, a maioria das implementações não tem uma, pois podem começar do final eseek
voltar até encontrar a enésima nova linha sem precisar armazenar mais de um buf de dados na memória. Para entradas não procuráveis, é aí que você pode encontrar limites. O POSIX exige implementações para poder armazenar pelo menos 10 x LINE_MAX bytes (LINE_MAX sendo pelo menos 2048). Cauda GNU não tem limite diferente de memória AFAIKSe você quiser numerar desde o início, precisará do grep -n para aplicar a todas as linhas.
Se você quisesse mostrar apenas os últimos 10, eu pensaria que você poderia refazer o arquivo:
O primeiro é útil, mas mostra muita saída. Não sei por que o segundo não funciona.
fonte
tail -n +1 -f
para seguir desde o início.tail
não pode produzir nada até que tenha visto a última linha de sua entrada (como saberia qual é a décima última linha?) Que nunca acontecerá comotail -f
nunca para.O comando
cat -n [filename] | tail
obterá uma contagem rápida e a exibição dos registros mais recentes, se é isso que você está procurando.A
-f
opção torna persistente até a fuga - o que realmente não parece aplicável no seu cenário ou é redundante.wc -l [filename]
receberá uma contagem das linhas no alvowc -l [filenameprefix]*
contará todas as linhas em todos os arquivos correspondentes ao padrão e até relatará um total de resumo no final.Detalhes mais completos podem gerar respostas mais completas.
fonte
É o argumento
n
ou--lines
(usado de maneiras ligeiramente diferentes, veja abaixo):Veja também a ajuda:
fonte