sed+ は 1 行で単語の前の値を探します。

sed+ は 1 行で単語の前の値を探します。

「無料」という単語の前の値を見つける方法は?

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でテストされていますが、freeSolarisで利用可能かどうかはわかりません)。

free | awk '/Mem/{print $4}'

タスク用に設計された別のツール(LinuxとSolarisで実行する必要があります):

vmstat 2 2 | tail -n 1 | awk '{print $4}'

ソースコードに移動します(Linuxでは動作しますがSolarisでは動作するかどうかはわかりません)。

awk '/MemFree/{print $2}' /proc/meminfo 

関連情報