«Cut» зависает при использовании «tail -f» в сочетании с «tr»,

Я пытаюсь передать файлы журнала чата на какой-то речевой вывод и хочу удалить временные метки с cut и удалить специальные символы с помощью tr . К сожалению, cut кажется, останавливается при использовании его с tail -f в сочетании с tr :

 //works $ tail /path/to/chatlogs | cut -b18- test test //works, too $ tail /path/to/chatlogs | tr -C -d '[:alnum:][:cntrl:] ' test test // does not work $ tail -f /path/to/chatlogs | tr -C -d '[:alnum:][:cntrl:] ' | cut -b18- //no output 

Зачем? Как я могу обойти это?


Он даже зависает, когда трубопровод два раза в cut :

 $ tail -f file | cut -b5- | cut -b5- //no output 

Используемый вами синтаксис обрабатывает только новый вход в /path/to/chatlogs . Попробуйте запустить команду и зарегистрировать новую запись в /path/to/chatlogs и посмотреть, какой результат или попробовать:

 tail -1000f /path/to/chatlogs | tr -C -d '[:alnum:][:cntrl:] ' | cut -b18- 

чтобы обработать последние 1000 строк.

«Висячая» часть – это фактически tail процесс, который ожидает, что дальнейший ввод будет проходить через трубу.

Чтобы отключить буферизацию из команды tr используйте:

 tail -f /path/to/chatlogs | stdbuf -i0 -oL tr -C -d '[:alnum:][:cntrl:] ' | cut -b18- 

Вышеизложенное используется для выключения буферизации в трубе

При использовании нескольких труб я сталкиваюсь с проблемами буферизации stdio.

Эта проблема подробно описана на сайте http://www.pixelbeat.org/programming/stdio_buffering/ и, похоже, не существует решения.