Voglio tail -f /var/log/syslog | grep
it con pattern "arpwatch" e invio ogni riga a me stesso tramite jabber:xmpp [email protected]
usando xargs
tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]
non funziona.
ma tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]
funziona bene.
Penso che sia qualcosa di fondamentale su xargs
e tail -f
che non capisco.
Risposta accettata:
xargs command
cerca di raccogliere quanti più elementi di input (righe, parole) possibile in una chiamata del comando , e non si preoccupa particolarmente della tempistica dei dati di input. Se la tail
il processo viene terminato o xargs
Se il buffer viene riempito, eseguirà comando con le argomentazioni ricevute fino a quel momento. Tuttavia, tail -f
di solito non finisce da solo e il limite per gli argomenti della riga di comando può essere grande, quindi sembra che non funzioni affatto.
Potresti usare xargs -n1
per fare in modo che passi solo un elemento di input alla volta per comandare , ma rimarrai colpito dal fatto che xargs
usa gli spazi bianchi per dividere l'input in elementi, quindi una riga di input di foo bar
comporterebbe l'esecuzione del comando due volte.
Con GNU xargs, xargs -n1 -d '\n'
dovrebbe fare quello che vuoi:esegui comando una volta per ogni riga di input, con l'intera riga passata come argomento singolo.
Prova, ad es. con e senza -d
e -n
e prendi nota dei tempi di uscita:
$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'
xargs -L 1
funzionerebbe anche, ma dividerà comunque la riga in argomenti separati, invece di passare l'intera riga come un argomento.