Система: Linux 4.13.0-43-generic # 48 ~ 16.04.1-Ubuntu BASH_VERSION = '4.3.48 (1) -release'
Команда:
while sleep 5
do
date +%T
done | awk -F: '{print $3}'
Должно печатать 3-е поле (секунды) вывода «дата», по одной строке каждые 5 секунд.Проблема: awk читает из канала и обрабатывает его ввод, только когда буфер канала заполнен.то есть, когда генерируется более 4K входных данных.
Когда awk заменяется на cat , строка печатается каждые 5 секунд, как и ожидалось.
Этот фрагмент кода упрощен от сценария оболочки, который хорошо работал в других системах, поэтому в этой системе должно быть что-то вроде bash, awk и их конфигурации.
Короче говоря, есть ли способ убедить awk вести себя как cat при чтении из канала?
@ Эд Мортон: Я пытался добавить fflush () после каждого отпечатка,но это не работает - вот что показало, что проблема в вводе awk, а не в выводе.Я также попытался добавить вызовы в system ("date") , что показало, что действительно awk получает все входные строки сразу, а не сразу, когда они производятся.
Для тех, кто спросил:
$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits:
max NF 32767
sprintf buffer 2040