我正在使用这个命令
free --mega
显示可用内存和可用交换。它显示、、、total
和。如何让它只显示两者的可用内存?used
free
shared
buff/cache
available
答案1
解析free
我怎样才能让它仅显示两者的可用内存?
没有选项可以做到这一点。您需要解析输出。
free
POSIX 没有指定。根据您的描述,我假设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