Как передать вывод awk (с периодическим, непрерывным вводом) в выходной файл?

10

Я пытаюсь написать команду, которая направляет непрерывный вывод свободной команды (запускается каждую секунду) в команду awk, которая анализирует определенное значение (доступную свободную память) и выводит его в файл с отметкой времени. Вот мои текущие попытки команды:

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

И в качестве альтернативы, после небольшого поиска в Google

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

Каждый прогон создает пустые файлы. Любые предложения или, возможно, другие методы?

отметка
источник

Ответы:

13

Вы должны очистить буфер, чтобы увидеть что-то memOutво время выполнения:

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

Вот альтернативная версия:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut
Кир
источник
Это дало мне выходной файл, который я хотел. Спасибо!
Марк
3

Для старых версий awkвам, возможно, придется использовать system("").

На самом деле, fflush(stdout)это только для последних версий awkи gawk, как только в стандарте POSIX с декабря 2012 года.

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

Обратите внимание, что при использовании system("")сбрасывает каждый дескриптор файла, его полное описание находится в gawkруководстве, раздел «9.1.4 Функции ввода / вывода».

Стив Шнепп
источник
2

Просто чтобы убедиться, что вы получаете то, что вы на самом деле хотите, а не то, что вы конкретно просили.

Если вы хотите узнать доступную память в системе для программ, это может быть более подходящим:

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

В столбце «Используемая строка памяти» содержатся кэши и буферы, и в большинстве случаев, когда вы хотите отслеживать использование памяти для данного компьютера / задачи, это следует по крайней мере отметить.

Manwe
источник
2

В некоторых версиях awk(например, mawk 1.3.3) вам нужно добавить -W interactiveфлаг командной строки, чтобы включить небуферизованную работу с каналами.

Пирз
источник