Como continuamente seguir um log, encontrar todos os arquivos (sed) e exibir (cat) os arquivos encontrados

1

Como eu continuamente tail -f a log, localizo todos os arquivos ( sed ) e exibo ( cat ) os arquivos encontrados

dados de exemplo em registros de auditoria.

tail -f /var/log/httpd/modsec_audit.log | sed 's/[^\/]*/\./;s/].*$//g'

saída

./apache/20180508/20180508-1428/20180508-142802-WvH6QgoeANwAAMwsFZ4AAAAF
./apache/20180508/20180508-1428/20180508-142803-WvH6QgoeANwAAMwtFfcAAAAG
./apache/20180508/20180508-1428/20180508-142803-WvH6QwoeANwAAMwuFlUAAAAH
./apache/20180508/20180508-1513/20180508-151357-WvIFBQoeANwAAMwnE@4AAAAA
./apache/20180508/20180508-1513/20180508-151357-WvIFBQoeANwAAMwoFD8AAAAB
./apache/20180508/20180508-1516/20180508-151608-WvIFiAoeANwAAMz1FSwAAAAA
./apache/20180508/20180508-1516/20180508-151609-WvIFiQoeANwAAMz2FYIAAAAB
./apache/20180508/20180508-1516/20180508-151611-WvIFiwoeANwAAMz3FeEAAAAC
./apache/20180508/20180508-1516/20180508-151611-WvIFiwoeANwAAMz4Fj4AAAAD
./apache/20180508/20180508-2112/20180508-211205-WvJY9QoeANwAAM1MFCoAAAAA

trabalha com echo

echo "./apache/20180508/20180508-1428/20180508-142802-WvH6QgoeANwAAMwsFZ4AAAAF" | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat

trabalha com gato

cat /var/log/httpd/modsec_audit.log | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat

não funciona com a cauda ...

tail -f /var/log/httpd/modsec_audit.log | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat

Eu assumo que o tailing não funciona porque o script nunca termina e sed ainda está armazenando os resultados em cache até a finalização do script.

Existe uma maneira de fazer isso funcionar continuamente?

    
por Artistan 09.05.2018 / 05:28

2 respostas

1

O buffer está ficando no caminho.

Use um while read line do shell, que deve ler linha por linha e evitar a maioria dos problemas com o buffer:

tail -f /var/log/httpd/modsec_audit.log | while read line; do
    echo "$line" | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat
done

Embora você provavelmente possa fazer melhor do que isso, usando o shell (bash) para corresponder ao nome do arquivo da linha de log também:

tail -f /var/log/httpd/modsec_audit.log | while read line; do
    line=${line/*([^\/])/.}
    line=${line%]*}
    [[ -n "${line}" ]] && cat "${line}"
done
    
por 09.05.2018 / 07:59
1

tente com isso:

tail -f /var/log/httpd/modsec_audit.log | stdbuf -oL sed 's/[^\/]*/\./;s/].*$//g' | stdbuf -oL awk '{print $0}' | while IFS='' read -r file; do cat $file ; done
    
por 09.05.2018 / 07:58

Tags