たとえば、ここで説明します。
free -mコマンドで使用されている個々のメモリ情報を取得します。
free
コマンドの出力を切り取る方法。しかし、数秒ごとに実行してファイルに記録したいと思います。だから私は次のことを試みます:
free -g -s2 | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log
しかし、ファイルはまだ空です。なぜこれが起こり、どのように解決するのですか?
答え1
これは、私が知っている限り、入力がsed
最初にバッファリングされ、コマンドが終了しないために追加された部分(>>
)に到達できないために発生します。この問題を解決するには-u
/--unbuffered
フラグを使用してくださいsed
。
free -g -s2 | sed -u -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log
別の解決策はwhile
ループを使用することです。
while true; do free -g | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p'; sleep 1; done >> memory2.log
役に立ったことを願っています:)
答え2
より簡単なコマンドを書くには、awkを使いましょう。 Awkも出力バッファリングを使用しますが、mawk
私のUbuntuデスクトップはラインバッファリングを使用するオプションをサポートしています。
free -g -s2 | awk -W interactive '/^Mem:/ {print $2}'
(注:マイコンピュータではawk
Debian代替サブシステムを介して接続されています)mawk
シェルループ呼び出しを実行すると、free | awk
次のようになります。非常に簡単なコマンド:
while true; do
free -g | awk '/^Mem:/ {print $2}' >> /path/to/memory2.log
sleep 2
done