Jak potokować wyjście awk (z okresowym, ciągłym wprowadzaniem) do pliku wyjściowego?

10

Próbuję napisać polecenie, które przekazuje ciągły wynik polecenia wolnego (uruchamianego co sekundę) do polecenia awk, które analizuje określoną wartość (dostępną wolną pamięć) i wysyła to do pliku ze znacznikiem czasu. Oto moje obecne próby polecenia:

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

I alternatywnie po odrobinie googlingu

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

Każde uruchomienie generuje puste pliki. Wszelkie sugestie lub ewentualnie inne metody?

znak
źródło

Odpowiedzi:

13

Musisz opróżnić bufor, aby zobaczyć coś memOutpodczas wykonywania:

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

Oto alternatywna wersja:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut
Cyrus
źródło
To dało mi plik wyjściowy, który chciałem. Dziękuję Ci!
Mark
3

W przypadku starszych wersji awkmoże być konieczne użycie system("").

W rzeczywistości fflush(stdout)dotyczy tylko najnowszych wersji awki gawkjako jedyny w standardzie POSIX od grudnia 2012 r.

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

Zauważ, że używając system("")opróżnia każdy deskryptor pliku, jego pełny opis znajduje się w gawkinstrukcji, w rozdziale „9.1.4 Funkcje wejścia / wyjścia”.

Steve Schnepp
źródło
3

W niektórych wersjach awk(np. Mawk 1.3.3) musisz dodać -W interactiveflagę wiersza poleceń, aby umożliwić niebuforowaną pracę z potokami.

Pierz
źródło
2

Aby upewnić się, że otrzymujesz to, czego naprawdę chcesz, a nie to, o co konkretnie prosiłeś.

Jeśli chcesz poznać dostępną pamięć w systemie dla programów, może to być bardziej odpowiednie:

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

Kolumna Używany wiersz pamięci zawiera pamięci podręczne i bufory, a w większości przypadków, gdy chcesz monitorować wykorzystanie pamięci dla danego komputera / zadania, należy przynajmniej zauważyć.

Manwe
źródło