J'ai écrit cette ligne pour montrer à MB en lecture / écriture toutes les 5 secondes.
#!/bin/bash
#iosum.sh
iostat -dmz 5 |\
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}}'
Lorsqu'il est exécuté à partir de la ligne de commande, il fonctionne parfaitement
./iosum.sh
# wait
1.1 0.0
0.0 0.1
0.0 0.0
3.0 3.0
0.0 0.0
# ctrl-c
Cependant, lorsque j'essaie de mettre la sortie dans un fichier, je ne reçois rien
./iosum.sh > out.txt
# wait
# ctrl-c
cat out.txt
# nothing!
Ce qui donne?
la source
fflush(stdout)
après l'impression a corrigé le problème.Awk met en tampon toutes les sorties et ne l'écrit qu'à la fin de la lecture des entrées ou lorsque la mémoire tampon est pleine. Utilisez
fflush(stdout)
(voir la page de manuel awk) dans votre script awk pour vous assurer que la sortie est correctement vidée sur le disque après chaque ligne imprimée. Comme ça:la source