Se vuoi le ultime 10 righe:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Ma con GNU xargs
, puoi anche impostare il delimitatore su newline con:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
è l'abbreviazione di -d '\0'
).
Portabilmente, puoi anche semplicemente sfuggire a ogni personaggio:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Oppure cita ogni riga:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Se desideri gli ultimi 10 record delimitati da NUL di myFile.txt
(ma non si tratterebbe di un file di testo), dovresti convertirlo \n
in \0
prima di chiamare, il tail
che significa che il file dovrà essere letto completamente:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Modifica (poiché hai modificato il tail
in tail -f
nella tua domanda):
L'ultimo sopra ovviamente non ha senso tail -f
.
L' xargs -d '\n'
uno funzionerà, ma per gli altri avrai un problema di buffering. Nel:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
buffer il suo output quando non va a un terminale (qui, una pipe). IE, non scriverà nulla fino a quando non avrà accumulato un buffer pieno (qualcosa come 8 kB) di dati da scrivere. Il che significa myCmd
che verrà chiamato in batch.
Su un sistema GNU o FreeBSD, puoi modificare il comportamento del buffering tr
con il stdbuf
comando:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2