在 OS X 上,system_profiler SPHardwareDataType
输出:
Hardware Overview:
Model Name: MacBook Pro
Total Number of Cores: 4
L2 Cache (per Core): 256 KB
L3 Cache: 8 MB
Memory: 8 GB
我想获取Memory
去掉空格的值。
这就是我所拥有的:
system_profiler SPHardwareDataType | grep --color=never -E '^ +Memory: ' | cut -d ':' -f 2
不好。它保留了空白。
我切换到这个:
system_profiler SPHardwareDataType | perl -ne 'if(/^ +Memory: (.*)$/){print $1;}'
我想问:
- 在 Perl 中这可以变得更简洁吗?
大括号让我很恼火,我经常打错它们。必须加上条件()
也很麻烦。分号很麻烦。
- 是否可以使用更基本的 UNIX 工具来简洁地完成此操作? (grep/sed/awk)?
注意:我不使用我喜欢的这条线..
system_profiler SPHardwareDataType | sed -Ene 's/^ +Memory: (.*)$/\1/g p'
因为扩展的正则表达式(在某些平台上?可能吗?),从根本上说,因为虽然我知道它可以-E
在行上工作,但除非我显式打印它,否则会抑制输出,这是一个普通的正则表达式..并且 a 之后的命令仅在匹配的行上执行。 .我对事实上它本身就是一个动作感到困惑..所以我希望在它之前需要一个..奇怪的是你可以替换并使用匹配作为执行命令的条件..是那一行完全正确吗?-r
sed
-n
p
s//g
substitute
match
s//g
p
;
答案1
Awk 会让它变得最简洁:
system_profiler SPHardwareDataType | awk -F': ' '/Memory:/{print $2}'
答案2
这就是 Perl 真正需要的一切:
system_profiler SPHardwareDataType | perl -nle '/ry:\s*(.*)/ && print $1'
其他一些选择:
system_profiler SPHardwareDataType | /bin/grep Me | gawk '{print $2,$3}'
使用 /bin/grep 消除了对
--color=never
.grep
被定义为grep --color=auto
in的别名/etc/bash.bashrc
(至少在大多数 Linux 发行版上是这样,我猜在 OSX 上也是如此)。system_profiler SPHardwareDataType | /bin/grep Me | /bin/egrep -o '[1-9]+.+'
这
-o
导致 grep 仅打印匹配的字符。system_profiler SPHardwareDataType | tail -n 1 | cut -d ' ' -f 4,5
system_profiler SPHardwareDataType | tail -n 1 | sed 's/.*: //g'
答案3
system_profiler SPHardwareDataType | sed -n 's/^ *Memory: //p'
p
这是命令的标志s
(如g
),而不是命令p
,意味着如果发生替换则打印模式空间。这里不需要g
,因为模式只能匹配一次。