Якщо потрібно останні 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