「無料」という単語の前の値を見つける方法は?
top -n1 | grep Mem
Mem: 2054968k av, 2034120k used, 20848k free, 0k shrd, 186768k buff
まず試しました
top -n1 | grep Mem | awk '{print $7}'
ただし、これは自由値(ここでは20848k)が別のフィールドにある可能性があるため、これはお勧めできません。フィールド6の場合もあり、フィールド7の場合もあります。
LinuxとSolarisの両方で動作するにはこれが必要です。
答え1
$ top -bn1 | grep free
KiB Mem: 8117084 total, 6578888 used, 1538196 free, 302216 buffers
KiB Swap: 8060924 total, 26004 used, 8034920 free, 1564856 cached
$ top -bn1 | grep -oP '\S+(?=\s+free)'
1544132
8034920
GNU grepが必要ですが、「linux」タグを付けたので問題ありません。
「メン」のみ
top -bn1 | grep -oP 'Mem.*\s\K\S+(?=\s+free)'
答え2
awk -v RS="[, ]" '/free/{print a}{a=$0}'
説明する
- レコード区切り記号をに設定する
,
と、space
各文字列の前の数字自体がレコードで、文字列もレコードになります。 - すべてを独自の履歴として保持すると、awkは各項目を1つずつ処理します。
- すべての以前のレコードの条件は一致しないため、無視して
free
現在処理されているレコードを変数に保存することに移動します。{print a}
{a=$0}
a
- 一致すると、awkは
/free/
一致前のレコードを含む{print a}
場所のみを検索します。a
答え3
GNUを使用するsed
(Linuxのみ):
top -bn1 | sed -rn '/Mem/{s/.* ([^ ]*) free.*/\1/p;}'
次のいずれかを使用してくださいsed
。
top -bn1 | sed -n '/Mem/{s/.* \([^ ]*\) free.*/\1/p;}'
使用perl
:
top -bn1 | perl -lne '/Mem.* ([\d]+)\s*free/ && print $1'
作業用に設計されたツールを使用してください(Linuxでテストされていますが、free
Solarisで利用可能かどうかはわかりません)。
free | awk '/Mem/{print $4}'
タスク用に設計された別のツール(LinuxとSolarisで実行する必要があります):
vmstat 2 2 | tail -n 1 | awk '{print $4}'
ソースコードに移動します(Linuxでは動作しますがSolarisでは動作するかどうかはわかりません)。
awk '/MemFree/{print $2}' /proc/meminfo