Если вы хотите, чтобы последние 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
tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"
, Кажется, работает! Спасибо.-i
опция принимает необязательный аргумент, поэтому-i0
не будет работать. Все они должны работать,tail -f
кроме последнего, но имейте в виду, что из-за буферизации будет задержка, прежде чем онxargs
получит свои данныеtr
. Вы можете изменить это, запустивstdbuf -o0 tr '\n' '\0'
вместоtr '\n' '\0'
.