如何仅显示来自“免费”的特定信息?

如何仅显示来自“免费”的特定信息?

我正在使用这个命令

free --mega

显示可用内存和可用交换。它显示、、、total和。如何让它只显示两者的可用内存?usedfreesharedbuff/cacheavailable

答案1

解析free

我怎样才能让它仅显示两者的可用内存?

没有选项可以做到这一点。您需要解析输出。

freePOSIX 没有指定。根据您的描述,我假设free --mega您得到的内容如下:

              total        used        free      shared  buff/cache   available
Mem:           4126        1624         116           5        2386        2227
Swap:          2146        1554         592

但不同之处在于这个问题来自 2013 年

             total       used       free     shared    buffers     cached
Mem:          2496       2260        236          0          5        438
-/+ buffers/cache:       1816        680
Swap:         1949         68       1881

我不知道free有多少种实现。一般来说,不同的实现可能使用不同的格式。问题被标记为ubuntu,这将其缩小到某个实现。但格式将来可能会改变。因此,解析的输出free并不完全可靠。

为了仅获取下面的两个数字free,请从除第一行之外的所有行中选择第 4 列:

free --mega | awk 'NR!=1 {print $4}'

也许您想保留标题。free第一行中的字符串在视觉上位于第 4 列,但形式上(在理解中awk)它位于第 3 列。使用以下命令:

free --mega | awk '{print NR==1?$3:$4}'

也许你想保留第一列:

free --mega | awk '
  NR==1 {$0="dUm "$0}
  {print $1" "$4}
' | column -t | sed 's/^dUm/   /'

dUm是用于移动第一行的虚拟字符串,因此free最终位于正式的第 4 列。 上面我们awk没有使用这个技巧,但现在column -t需要它。

以下代码使用很少 更多的技巧并允许您选择或重新排列列,甚至计算自定义列,所有这一切都通过引用它们的名称来实现:

LC_ALL=C free --mega | awk '
  NR==1 {
    $0="dUm"$0
    for (i=1; i<=NF; i++) { lbl=$i; sub(" *$", "", lbl); ix[lbl]=i}
  }
  { $0=$0" dUm dUm dUm"
    print "x "$1" "$ix["free"]" "(NR==1?"%free":int(100*$ix["free"]/$ix["total"])"%")" "$ix["available"]" "$ix["total"]
  }' | rev | column -t | rev | sed -e 's/dUm/   /g' -e 's/^x  //'

LC_ALL=C以防万一free是本地化的。


阅读/proc/meminfo

或者你可以从中读取值/proc/meminfo。它的格式更容易解析,而且应该是稳定的(即将来不会改变)。例如:

</proc/meminfo grep -E '^(Mem|Swap)Free:'

输出将会像这样:

MemFree:          118380 kB
SwapFree:         531196 kB

kB有些文档说这些值是“以千字节为单位”,但实际上这些是千字节. 这种歧义不会被修复

如果您想要兆字节(free --mega在您的问题中使用兆字节),那么您应该相应地重新计算:

</proc/meminfo awk '$1~"^(Mem|Swap)Free:" {$2=$2*1024/1000000; $3="MB"; print}' | column -t

或者可能只是:

</proc/meminfo awk '$1~"^(Mem|Swap)Free:" {$2=int($2*1024/1000000); $3=""; print}' | column -t

答案2

作为替代方案

cat /proc/meminfo | grep "MemFree\|SwapFree"

答案3

另一种选择:

free -h | awk '{print NR==1?$3:$1$4}'

会给你:

free  
Mem:30G  
Swap:14G  

相关内容