Команды Bash, переданные в awk, иногда буферизуются
Система: Linux 4.13.0-43-generiC#48~16.04.1-Ubuntu BASH_VERSION='4.3.48(1)-релиз'
Команда:
while sleep 5
do
date +%T
done | awk -F: '{print $3}'
Должно быть напечатано 3-е поле (секунды) вывода "date", по одной строке каждые 5 секунд. Проблема: awk читает из канала и обрабатывает его ввод, только когда буфер канала заполнен. т.е. когда генерируется более 4К входных данных.
Когда awk заменяется на cat, строка печатается каждые 5 секунд, как и ожидалось.
Этот фрагмент кода упрощен из сценария оболочки, который хорошо работал на других системах, поэтому в этой системе должно быть что-то вроде bash, awk и их конфигурации.
Короче говоря, есть ли способ убедить awk вести себя как кошка при чтении из трубы?
@Ed Morton: я пытался добавить fflush() после каждой печати, но он не работает - вот что показало, что проблема в вводе awk, а не в выводе. Я также попытался добавить вызовы в систему ("дата"), которые показали, что действительно awk получает все входные строки сразу, а не сразу, когда они производятся.
Для тех, кто спросил:
$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits:
max NF 32767
sprintf buffer 2040
1 ответ
Пытаясь выяснить, как заставить awk печатать свою версию, я обнаружил, что это действительно mawk и имеет следующий флаг:
-W interactive -- sets unbuffered writes to stdout and line buffered reads from stdin.
Records from stdin are lines regardless of the value of RS.
Кажется, это решает проблему!
Спасибо всем ответчикам.