コマンド出力から数字を抽出する方法は?

コマンド出力から数字を抽出する方法は?

2.60次の文字列(他のコマンドの出力lscpu)からのみ印刷するコマンドを作成するにはどうすればよいですか?

model name      : Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz

答え1

@<whitespaces>GHzlineで始まる行と行末の行の間に数字を印刷したいとしますmodel name

sed -nE 's/^model name.*@[[:space:]]*([.[:digit:]]+)GHz$/\1/p' /proc/cpuinfo

またはGNUを使用してくださいgrep

grep -Po '^model name.*@\s*\K[.\d]+(?=GHz$)' /proc/cpuinfo

については、lscpu以下も参照してください。

lscpu -J | jq -r '
  .lscpu[] |
  select(.field == "Model name:").data |
  match("@\\s*([\\d.]+)GHz$").captures[0].string |
  tonumber'

または:

lscpu -J | jq -r '.lscpu[]|select(.field == "CPU max MHz:").data|tonumber'

モデル名の基本周波数ではなく、MHz単位の最大周波数です。

答え2

sed(大文字と小文字を区別しない一致のためのフラグsedとしてGNU)を使用してください。I

$ lscpu | sed -En 's/^model name.* ([0-9.]+).*/\1/Ip'
2.60

答え3

次のように試すことができますawk

awk '{print int($NF*100)/100.0}' /proc/cpuinfo

awkこの行は書き直すことができますが、他の実装でこれをどのように処理するのかわかりません。

awk '{print $NF*1.0}' /proc/cpuinfo

2.60になるには、次のようにします。

awk '{printf "%4.2f",int($NF*100)/100.0}' /proc/cpuinfo

次のように使用したい場合lscpu

lscpu|awk '/odel name/ {print int($NF*100)/100.0}'

答え4

LANG=C lscpu | sed -rn "s/.*Model name.* @ (.*)GHz/\1/p"

LANG=C言語設定が英語に設定されていない場合は、このオプションが必要です。

sedの-nはデフォルトで出力を抑制します。 -rはキャプチャグループの入力を単純化します(バックスラッシュなし)。

条件Aが満たされると、「s / A / B / p」コマンドはAをBに置き換え、pは印刷を実行します(デフォルトでは出力を抑制するため、これが必要です)。

Aは正規表現であり、最初の\1(唯一の)キャプチャグループです。

関連情報