Como eu adiciono / prefixo um timestamp para a saída do grep?

2

Estou executando um pequeno servidor linux em casa, e estou escrevendo um script para registrar a temperatura dos núcleos da CPU a cada 5 segundos, mas eu preciso de timestamps para que seja útil. Até agora tenho algo que salva a saída do comando sensors em um arquivo e tenho um comando que imprime a data e a hora. Eu só preciso descobrir como combinar os dois.

sensors | grep ^Core* >> temps.log salva temps em temps.log no seguinte formato:

Core 0:       +39.0°C  (high = +76.0°C, crit = +100.0°C)
Core 1:       +40.0°C  (high = +76.0°C, crit = +100.0°C)

e para a data em que posso fazer date +%m/%d/%y-%H:%M:%S , que retorna

mm/dd/yy-hh:mm:ss

Eu pesquisei por aí e vi alguém sugerindo o uso de gawk , mas não tenho absolutamente nenhuma ideia de como gawk funciona.

    
por wes1099 26.11.2016 / 04:42

4 respostas

0

Se eu entendi corretamente, o que você quer realizar é prefixar a data atual em todas as linhas que são produzidas pelo grep. Esta é uma tarefa fácil para um script bash:

sensors | grep ^Core |\
(
  DATE=$(date +%m/%d/%y-%H:%M:%S)
  while read LINE
  do
    echo "$DATE $LINE"
  done
) >> temps.log
    
por 26.11.2016 / 04:47
6

a script to log […] every 5 seconds […] I need timestamps […] a loop […] the file gets to a certain size

Você deseja uma ferramenta que receba como entrada a saída de log do programa principal, que a grava em um arquivo de log com tamanho limitado e adicione registros de data e hora. Existem ferramentas que fazem isso e muito mais. O "mais" que eles fazem é a rotação automática do arquivo de log que também é acionável sob demanda, mantendo um diretório de log com tamanho reduzido dos arquivos de log atuais e antigos.

Você tem várias opções de ferramentas:

Suponha que um utilitário de longa execução imprima sua saída de log desejada a cada poucos segundos, algo como:

#!/bin/sh
# monitor-sensors
exec 2>&1
while true
do
    sensors
    sleep 5
done | grep --line-buffered -- '^Core'

O uso é tão simples como:

  • monitor-sensors | cyclog ./temps
  • monitor-sensors | multilog t ./temps

e pode ser facilmente ajustado:

  • monitor-sensors | cyclog --max-file-size 32768 --max-total-size 1048576 ./temps
  • monitor-sensors | s6-log t s32768 S1048576 ./temps
  • monitor-sensors | multilog t s32768 n5 ./temps

A partir daqui, usando conjuntos de ferramentas como daemontools-encore / runit / perp / s6 / nosh, é apenas um pequeno passo para mover os lados esquerdo e direito deste canal para run programas e executá-lo como um par vinculado dos daemons reais.

Mas todos eles podem, também, manipular o fato de ser convertido para saída única em diretórios de log existentes, se você quiser (digamos) executar invocações únicas a partir de uma linha de comando.

Algumas dessas ferramentas podem fazer outras formas de registro de data e hora, mas todas podem fazer registros de data e hora TAI64N. Os timestamps TAI64N são projetados para serem capazes de precisão de nanossegundos, embora alguns dos mencionados anteriormente não implementem bem isso; são projetados para lidar com coisas como segundos bissextos, contanto que seu banco de dados TZ saiba sobre eles; e são triviais para sort , ou mesmo sort -m .

Converta de timestamps TAI64N para a hora local do seu fuso horário atual (ou, dado que é apenas a variável de ambiente TZ , um fuso horário arbitrário à sua escolha) usando ferramentas como:

Assista a esses registros enquanto eles são escritos com:

  • tail -F , embora tail tenha problemas conhecidos quando há rotações muito rápidas. (Esse é um dos vários problemas conhecidos com tail . Outros problemas conhecidos, incluindo o truncamento no local de arquivos de log que são rapidamente seguidos por mais dados de log. Esse problema pode ser acionado por sistemas inferiores, como logrotate . as ferramentas acima mencionadas não truncam os arquivos depois de estarem totalmente gravados e não arriscam esses problemas adicionais tail .
  • Meu follow-log-directories do nosh, que "conhece" esse tipo de registra o diretório e usa um "cursor" (mantido persistentemente no disco) para rastrear de forma confiável a posição no diretório de log para continuar, mesmo que várias rotações aconteçam quando o seguidor de log não está procurando.

Outros tipos de processamento podem ser feitos com ferramentas como:

Leitura adicional

por 26.11.2016 / 12:34
4

@JdeBP já respondeu o que você provavelmente deveria estar fazendo. Mas essa não foi a pergunta que você fez. Então, para qualquer um que chegar aqui do Google tentando saber como adicionar / adicionar detalhes a uma saída de várias linhas, aqui está:

Primeiro, ^Core* provavelmente não faz o que você acha que faz. É uma expressão regular para combinar linhas que começam com "Cor" imediatamente seguido por qualquer número de "e" s: "Cor", "Core", "Coreeeee", etc.

Em segundo lugar, xargs é uma ótima ferramenta, especialmente para scripts simples e fáceis de usar. Você pode ter xargs para atuar em cada linha de entrada e emitir um comando para cada um deles com o parâmetro -I . Então você pode facilmente fazer algo assim:

sensors | grep '^Core*' | xargs -I{} echo "${stamp}: {}" >> temps.log

Coloque '^Core*' entre aspas porque você não quer expansões de shell inesperadas (embora altamente improváveis). O {} em -I informa xargs para substituir {} por cada linha de entrada nos argumentos do comando que ele estará executando. Você pode escolher outro padrão, é claro; Eu apenas gosto de imitar a sintaxe de find -exec . O ${stamp} assume que você salvou a data / hora em stamp .

Você também pode criar um subshell, executar o comando date (especificando o formato que quiser) e ter xargs usando sua saída padrão como parte de seus argumentos para echo :

sensors | grep '^Core*' | xargs -I{} echo "$(date): {}" >> temps.log

Novamente, o que você provavelmente deve estar fazendo é usar uma ferramenta testada e mantida para o registro. Mas estou respondendo aqui como acrescentar / adicionar um registro de data e hora ao grep, , não como fazer seus logs corretamente.

EDITAR : por favor, não faça downvote. Se você encontrar um erro nesta resposta, pelo menos me diga o que é.

    
por 26.11.2016 / 13:21
0

Eu provavelmente faria:

parallel --tagstring 'date -Iseconds' 'sensors | grep' ::: ^Core

É curta, legível e funciona bem.

    
por 26.11.2016 / 14:34