Comment diriger la sortie awk (avec une entrée périodique et continue) vers un fichier de sortie?

10

J'essaie d'écrire une commande qui dirige la sortie continue d'une commande libre (exécutée toutes les secondes) vers une commande awk qui analyse une valeur spécifique (mémoire libre disponible) et la renvoie dans un fichier avec un horodatage. Voici mes tentatives actuelles de commande:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 }' >>memOut

Et alternativement, après un peu de recherche sur Google

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 >>"memOut"}'

Chaque exécution produit des fichiers vides. Des suggestions ou éventuellement des méthodes différentes?

marque
la source

Réponses:

13

Vous devez vider le tampon pour voir quelque chose memOutpendant l'exécution:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

Voici une version alternative:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut
cYrus
la source
Cela m'a donné le fichier de sortie que je voulais. Je vous remercie!
Mark
3

Pour les anciennes versions, awkvous devrez peut-être utiliser system("").

En fait, fflush(stdout)ne concerne que les versions récentes de awket gawk, comme c'est le seul dans la norme POSIX depuis décembre 2012.

free -mto -s 1 | awk '/Mem/ { 
    print strftime("%r") "," $4;
    system(""); # Flush output
}' >> memOut

Notez que l'utilisation de system("")vidages de chaque descripteur de fichier, sa description complète se trouve dans le gawkmanuel, section "9.1.4 Fonctions d'entrée / sortie".

Steve Schnepp
la source
3

Sur certaines versions de awk(par exemple mawk 1.3.3), vous devez ajouter l' -W interactiveindicateur de ligne de commande pour permettre un fonctionnement sans tampon avec les tuyaux.

Pierz
la source
2

Juste pour vous assurer que vous obtenez ce que vous voulez réellement et non ce que vous avez spécifiquement demandé.

Si vous souhaitez connaître la mémoire disponible sur le système pour les programmes, cela peut être plus approprié:

free -m -s 1 | awk '/buffers\/cache/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

La colonne Utilisé de la ligne Mem comprend des caches et des tampons et dans la plupart des cas, lorsque vous souhaitez surveiller l'utilisation de la mémoire pour un ordinateur / une tâche donnée, ceux-ci doivent au moins être notés.

Manwe
la source