Если вы хотите, чтобы последние 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
Edit (так как вы изменили , tail
чтобы tail -f
в вашем вопросе):
Последнее выше, очевидно, не имеет смысла tail -f
.
xargs -d '\n'
Один будет работать, но и для других, вы будете иметь проблемы буферизации. В:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
буферизует его вывод, когда он не идет к терминалу (здесь, канал). То есть, он не будет ничего писать, пока не накопит полный буфер (что-то вроде 8 кБ) данных для записи. Какие средства myCmd
будут называться партиями.
В системе GNU или FreeBSD вы можете изменить поведение буферизации tr
с помощью stdbuf
команды:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2