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ます(少なくともほとんどのLinuxディストリビューションでは同様であり、OSXでも同様であると推測されます)。grepgrep --color=auto/etc/bash.bashrc

  • 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'

psこれはコマンドではなくコマンド(のようなg)のフラグpであり、置換が発生するとパターンスペースを印刷することを意味します。gパターンは一度だけ一致できるため、ここでは必要ありません。

関連情報