Jeśli chcesz, aby ostatnie 10 linii:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Ale w GNU xargsmożesz również ustawić separator na nowy wiersz za pomocą:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0jest skrótem od -d '\0').
Przenośnie możesz po prostu uciec każdej postaci:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Lub zacytuj każdą linię:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Jeśli chcesz 10 ostatnich rozdzielonych NUL-em rekordów myFile.txt(ale wtedy nie byłby to plik tekstowy), musiałbyś przekonwertować go \nna \0przed wywołaniem, tailco oznaczałoby, że plik będzie musiał zostać w pełni odczytany:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Edit (ponieważ zmienił tailsię tail -fw swoim pytaniu):
Ostatni powyżej oczywiście nie ma sensu tail -f.
Ten xargs -d '\n'będzie działał, ale w przypadku innych będziesz mieć problem z buforowaniem. W:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
trbuforuje dane wyjściowe, gdy nie przechodzi ono do terminala (tutaj potoku). IE nie zapisuje niczego, dopóki nie zgromadzi pełnego bufora (coś w rodzaju 8kiB) danych do zapisania. Co oznacza, myCmdże będą wywoływane partiami.
W systemie GNU lub FreeBSD, można zmienić zachowanie buforujące trz stdbufpoleceniem:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2