grep 结束正则表达式匹配

grep 结束正则表达式匹配

在 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 之后的命令仅在匹配的行上执行。 .我对事实上它本身就是一个动作感到困惑..所以我希望在它之前需要一个..奇怪的是你可以替换并使用匹配作为执行命令的条件..是那一行完全正确吗?-rsed-nps//gsubstitutematchs//gp;

答案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=autoin的别名/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,因为模式只能匹配一次。

相关内容