Это проблема буферизации. Awk ведет себя по-разному в зависимости от того, интерактивен он или нет. \n
очищает выходной буфер только в последнем случае, иначе, как вы уже видели, буферизация происходит до тех пор, пока выходной буфер не заполнится или не будет явно сброшен командой fflush.
В конце концов, в выходном файле будет что-то, если вы будете ждать достаточно долго.
В противном случае вывод должен быть сброшен, если вы убьете iostat
, а не сам скрипт.
В качестве альтернативы вот простой обходной путь:
script -c iosum.sh out.txt
Обратите внимание, что отключение буферизации (с помощью script
или явного fflush
) влияет на производительность, поэтому лучше убить процесс iostat
(pkill -f "iostat -dmz 5"
) или установить его для завершения через определенный промежуток времени, если вы не необходимо контролировать содержимое файла, например, с двухминутным периодом захвата:
iostat -dmz 5 120 |\
awk 'BEGIN{rx=wx=0}{if($0 == ""){printf"%.1f %.1f\n",rx,wx}else if($0~/^Device:/){rx=wx=0}else{rx+=$3;wx+=$4}}'