awk出力を(定期的で連続的な入力で)出力ファイルにパイプする方法は?


10

特定の値(使用可能な空きメモリ)を解析してタイムスタンプ付きのファイルに出力するawkコマンドに、空きコマンド(毎秒実行)の連続出力をパイプするコマンドを記述しようとしています。コマンドでの現在の試みは次のとおりです。

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

そして代わりに、少しググリングした後

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

これにより、必要な出力ファイルが得られました。ありがとうございました!
Mark

3

古いバージョンでawkは、を使用する必要がある場合がありますsystem("")

実際にfflush(stdout)は、2012年12月以降のPOSIX標準でのみ、awkとの最近のバージョンのみが対象gawkです。

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

Mem行の[Used]列にはキャッシュとバッファーが含まれ、ほとんどの場合、特定のコンピューター/タスクのメモリ使用量を監視する場合は、少なくとも注意が必要です。


2

の特定のバージョンawk(例:mawk 1.3.3)では-W interactive、パイプを使用したバッファなしの操作を有効にするためにコマンドラインフラグを追加する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.