Я ожидаю, что несколько sed
сценариев делают работают с выводом tail -F
, но не так, как вы ожидаете.
Стандартные библиотеки ввода-вывода C будут выполнять буферизацию для повышения производительности. Библиотека IO не может выполнять (а) отсутствие буферизации (б) буферизацию строки (в) блочную буферизацию. Буферизация строки обычно выбирается, если выход идет на терминал. Но если вывод идет в файл или канал, тогда обычно выбирается блочная буферизация. (Это сложнее, чем это - поведение меняется, если рассматриваемый файловый дескриптор используется для stdout или stderr или другого файла. См. setvbuf(3)
для получения полной информации.)
Итак, хотя буферизация блоков, которую вы видите сейчас, вероятно, лучше для производительности , это означает, что вы можете подождать некоторое время, прежде чем увидите какой-либо вывод, поскольку каждая команда в конечном итоге накапливает блок данных. По крайней мере, grep(1)
позволяет опции командной строки --line-buffered
использовать буферизацию строки, а sed(1)
позволяет опции командной строки --unbuffered
чаще очищать выходные буферы. Итак, попробуйте это:
tail -f /var/log/system.log | grep --line-buffered "query=" | sed -u -e "s/.*query=//" | sed -u -e "s/\"//g" | sed -u -e "s/.$/ /"
(Я не нашел аналогичных опций для tail(1)
, но даже если он отправляет блоки данных другим, изменения в grep(1)
и sed(1)
окажут существенную помощь.)