Команды Bash, переданные в awk, иногда буферизуются - PullRequest
0 голосов
/ 06 июня 2018

Система: 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

1 Ответ

0 голосов
/ 07 июня 2018

Пытаясь выяснить, как заставить 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.

Это, похоже, решает проблему!

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

...