Якщо потрібно останні 10 рядків:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
Але за допомогою GNU xargs
ви також можете встановити роздільник на новий рядок за допомогою:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
( -0
скорочено для -d '\0'
).
Портативно, ви також можете просто уникнути кожного персонажа:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
Або цитуйте кожен рядок:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
Якщо ви хочете 10 останніх NUL роздільником записи myFile.txt
(але тоді це буде не текстовий файл), вам доведеться конвертувати \n
в \0
перед викликом , tail
який буде означати , що файл потрібно буде повністю прочитати:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
Редагувати (оскільки ви змінили tail
на tail -f
у своєму запитанні):
Останнє вище, очевидно, не має сенсу tail -f
.
xargs -d '\n'
Один буде працювати, але і для інших, ви будете мати проблеми буферизації. В:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
буферизує свій вихід, коли він не переходить до терміналу (тут, труба). IE, він нічого не запише, поки не накопичить повний буфер (щось на зразок 8kiB) даних для запису. Які засоби myCmd
будуть називатися партіями.
У системі GNU або FreeBSD ви можете змінити буферну поведінку за tr
допомогою stdbuf
команди:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2