Команды 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.

Кажется, это решает проблему!

Спасибо всем ответчикам.

Другие вопросы по тегам