Sto provando a impostare uno script in cui viene generato un avviso quando una determinata stringa viene visualizzata in un file di registro.Come pipe tail -f in awk
La soluzione già presente esegue l'inceppamento dell'intero file di registro una volta al minuto e conta la frequenza con cui viene visualizzata la stringa, utilizzando il timestamp della riga di registro per contare solo le occorrenze nel minuto precedente.
ho pensato che sarebbe stato molto più efficiente di fare questo con una coda, così ho provato quanto segue, come un test:
FILENAME="/var/log/file.log"
tail -f $FILENAME | awk -F , -v var="$HOSTNAME" '
BEGIN {
failed_count=0;
}
/account failure reason/ {
failed_count++;
}
END {
printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count);
}
'
, ma questo solo si blocca e non fa nulla in uscita. Qualcuno ha suggerito questo piccolo cambiamento:
FILENAME="/var/log/file.log"
awk -F , -v var="$HOSTNAME" '
BEGIN {
failed_count=0;
}
/account failure reason/ {
failed_count++;
}
END {
printf("%saccount failure reason (Errors per Interval)=%d\n", var, failed_count);
}
' <(tail -f $FILENAME)
ma che fa la stessa cosa.
L'awk che sto utilizzando (ho semplificato nel codice sopra) funziona, come è utilizzato nello script esistente in cui i risultati di grep "^ $ TIMESTAMP" vengono reindirizzati.
La mia domanda è: come si può far funzionare la coda -f con awk?
Quando si 'tail -f', lo script awk non giunge mai a una FINE. Quindi continui a contare gli errori, ma non stampi mai nulla. È necessaria un'altra condizione (ad esempio, rilevare che si tratta di un nuovo giorno) che esegue la stampa e reimposta il contatore.Mostraci un esempio del tuo registro e possiamo suggerire una soluzione. – ghoti