Isso é tudo que você precisa:
five_min=$( date -d "5 minutes ago" +"%F %T" )
while IFS= read -r line; do
[[ "$five_min" < "$line" ]] && echo "$line"
done < output.log
Então, é um arquivo enorme. Em seguida, use tac
para gerar o arquivo pela primeira vez:
five_min=$( date -d "5 minutes ago" +"%F %T" )
tac output.log | while IFS= read -r line; do
[[ "$five_min" < "$line" ]] && echo "$line"
done | tac
O comando while
, assim como outras linguagens, executa seu corpo enquanto a condição é verdadeira. Em shells POSIX, a "condição" dos comandos if
e while
é em si um comando. A "verdade" da "condição" é que o comando sai com um status de saída zero. É muito importante perceber que as palavras [
e [[
são realmente comandos, não apenas sintaxe (de um tipo de shell bash help [[
e help [
)
Nessa resposta, a condição é IFS= read -r line
, que é a maneira canônica de ler uma linha de um arquivo e manter intactas todas as sequências de espaço em branco e de barra invertida. read
retornará com um status de saída diferente de zero se não houver mais nada para ler em seu fluxo de entrada. Na minha primeira resposta, redirecionei o conteúdo do arquivo de log para a entrada padrão do comando while
e read
lerá esses dados.