客观的
在Linux 上,我试图获得一个代表可用系统内存的最终用户友好字符串。
例子:
Your computer has 4 GB of memory.
成功标准
我认为这些方面最终用户友好(您可能不同意):
1G
比1.0G
(1
Vs1.0
)更具可读性1GB
比1G
(GB
VsG
)更具可读性1 GB
比1GB
(space-separated
度量单位)更具可读性memory
比RAM
,DDR
或DDR3
(没有行话)更具可读性
初始点
-h, --human
Show all output fields automatically scaled to shortest three digit unit
and display the units of print out. Following units are used.
B = bytes
K = kilos
M = megas
G = gigas
T = teras
If unit is missing, and you have petabyte of RAM or swap, the number is
in terabytes and columns might not be aligned with header.
所以我决定从那里开始:
> free -h
total used free shared buffers cached
Mem: 3.8G 1.4G 2.4G 0B 159M 841M
-/+ buffers/cache: 472M 3.4G
Swap: 4.9G 0B 3.9G
3.8G
听起来很有希望,所以我现在要做的就是......
所需步骤
过滤包含人类可读字符串的行的输出(即
Mem:
)从行中间挑出内存总量(即
3.8G
)解析出数量和度量单位(即
3.8
和G
)根据我的喜好格式化和显示字符串(例如
G
↝GB
,...)
我的尝试
free -h | \
awk '/^Mem:/{print $2}' | \
perl -ne '/(\d+(?:\.\d+)?)(B|K|M|G|T)/ && printf "%g %sB\n", $1, $2'
输出:
3.8 GB
所需的解决方案
我宁愿只使用gawk,但我不知道如何
使用更好的,甚至规范的方法来解析字符串中的“浮点数”
我不介意“只是公认的大小字母”的挑剔
(B|K|M|G|T)
匹配,即使这会因引入新尺寸而不必要地破坏匹配我习惯
%g
输出4.0
as4
,您可能不同意,这取决于您对这些评论的看法:https ://unix.stackexchange.com/a/70553/10283 。
我的问题,总结
- 你可以只做上面的
awk
吗? - 我
perl
能写得更优雅,保持严格吗?
记住:
I am a beginner robot. Here to learn. :]
我从安迪·莱斯特那里学到的
为了我自己的利益,在这里总结一下:如果可以的话,巩固学习。
例如,这个gawk:
echo foo bar baz | awk '{print $2}'
在perl中可以这样写:
echo foo bar baz | perl -ane 'print "$F[1]\n";'
除非有与 gawk 等价的东西,否则--field-separator
我想我还是更喜欢 gawk ,尽管在 perl 中做所有事情当然既干净又高效。(有没有等价物?)
编辑:实际上,这证明存在,-F
就像在gawk中一样:
echo ooxoooxoooo | perl -Fx -ane 'print join "\n", @F'
输出:
oo
ooo
oooo
- perl有一个
-l
选项,这真是太棒了:将其视为Python的str.rstrip(如果您不是Python负责人,请参阅链接)的有效性,会自动为您$_
重新附加\n
谢谢,安迪!