Eu preciso encontrar uma maneira de grep
retornar conteúdo de tamanho de linha diferente após uma partida. Algumas partidas têm 4 linhas depois delas, outras têm 20. Eu preciso de todas.
A cada hora, estou procurando retornar as entradas de log da hora anterior, que têm carimbos de data/hora como:
time: 20200115132443
Para fazer isso, imagino que a cada hora um cronjob executará o timestamp da hora anterior como uma instrução grep:
grep "time: 2020011507"
O problema que estou tendo é que o log tem tamanhos diferentes para determinadas entradas após uma partida, então apenas coisas como grep -C 5
não funcionam o tempo todo.
Eu estou querendo saber se eu deveria estar retornando todo o conteúdo de uma correspondência até a próxima instrução grep correspondente (que perderia a última entrada) ou se existe alguma outra maneira de executar isso. Um snippet de arquivo de log de amostra se parece com:
time: 20200115132443
logging stuffs
time: 20200115134543
more logging
stuffs
like this
time: 20200115140201 # this should now not be returned
Talvez eu esteja complicando demais e possa apenas executar uma grep
declaração da hora atual e pegar tudo antes dessa hora e depois da hora anterior.
Possível abordagem:
Agora, tentando tornar isso um forro compacto:
Você pode redirecionar a saída para um arquivo temporário e trabalhar com ele.
Ou você pode simplesmente adicionar ao final de um forro um tubo e grep:
.
PS Dependendo do sistema operacional, o formato da data do comando pode ser diferente.
Linux que usamos aqui: date -d '1 hora atrás' +%Y%m%d%H
Linux que poderíamos usar: date -d @$(($(date +%s)-3600)) +%Y%m%d%H
MacOS X: data -r $(($(data +%s)-3600)) +%Y%m%d%H
etc.
Atualizado: descobri que a parte sed '$d' para excluir a última linha encontrada não funciona, então atualizei a linha sed para funcionar corretamente.