Wie kann ich eine awk-Ausgabe (mit periodischer, kontinuierlicher Eingabe) in die Ausgabedatei leiten?

10

Ich versuche, einen Befehl zu schreiben, der die kontinuierliche Ausgabe eines freien Befehls (wird jede Sekunde ausgeführt) an einen awk-Befehl weiterleitet, der einen bestimmten Wert (verfügbaren freien Speicher) analysiert und diesen in eine Datei mit einem Zeitstempel ausgibt. Hier sind meine aktuellen Versuche mit dem Befehl:

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

Und alternativ nach ein bisschen googeln

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

Jeder Lauf erzeugt leere Dateien. Irgendwelche Vorschläge oder möglicherweise andere Methoden?

Kennzeichen
quelle

Antworten:

13

Sie müssen den Puffer leeren, um memOutwährend der Ausführung etwas zu sehen :

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

Hier ist eine alternative Version:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut
cYrus
quelle
Dies gab mir die Ausgabedatei, die ich wollte. Vielen Dank!
Mark
3

Für alte Versionen müssen awkSie möglicherweise verwenden system("").

Eigentlich fflush(stdout)ist nur für aktuelle Versionen von awkund gawk, wie es nur im POSIX-Standard seit Dezember 2012 ist.

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

Beachten Sie, dass bei Verwendung von system("")Flushes für jeden Dateideskriptor die vollständige Beschreibung im gawkHandbuch, Abschnitt "9.1.4 Eingabe- / Ausgabefunktionen", enthalten ist.

Steve Schnepp
quelle
2

Nur um sicherzustellen, dass Sie das bekommen, was Sie tatsächlich wollen und nicht das, was Sie speziell gefragt haben.

Wenn Sie den verfügbaren Speicher auf dem System für Programme kennen möchten, ist dies möglicherweise besser geeignet:

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

Die Spalte Verwendet in der Mem-Zeile enthält Caches und Puffer. In den meisten Fällen sollten diese zumindest notiert werden, wenn Sie die Speichernutzung für einen bestimmten Computer / eine bestimmte Aufgabe überwachen möchten.

Manwe
quelle
2

In bestimmten Versionen von awk(z. B. mawk 1.3.3) müssen Sie das -W interactiveBefehlszeilenflag hinzufügen , um den ungepufferten Betrieb mit Pipes zu ermöglichen.

Pierz
quelle