Как добавить другой префикс для каждой строки в grep-выходе?

У меня есть этот код:

cat /proc/cpuinfo | grep "MHz" | cut -d ':' -f2 | sed 's/.*/Core NUM&Mhz/' 

Что выводит следующие (для 8 ядер):

 Core NUM 1941.054Mhz Core NUM 1949.820Mhz Core NUM 2022.734Mhz Core NUM 1877.171Mhz Core NUM 1938.265Mhz Core NUM 1945.703Mhz Core NUM 1845.562Mhz Core NUM 1781.546Mhz 

Я хочу сделать замену «Core NUM» на фактические цифры (например, Core 0, Core 1, Core 2, Core 3 …) Я бы предпочел решение, которое можно выполнить в одной строке с остальной частью этой команды, но поскольку я в конце концов работаю из сценария bash, я не против решения с несколькими линиями / сценариями. Самая большая проблема, я думаю, состоит в том, что grep – это одна команда, выводящая много строк, и я не знаю, есть ли способ нацеливать эти строки один за другим на что-то вроде цикла for или while.

Итак, как я могу это сделать?

Пусть awk сделает все для вас:

 </proc/cpuinfo awk -F : '/MHz/{printf "Core %d%sMhz\n", n++, $2}' 

cat /proc/cpuinfo | awk '/MHz/ {print "Core", i++, $NF "Mhz"}' cat /proc/cpuinfo | awk '/MHz/ {print "Core", i++, $NF "Mhz"}' дает,

 Core 0 800.000Mhz Core 1 800.000Mhz 

Я сделал немного другую версию awk, но как только вы знакомы с awk, она будет выделяться как естественное решение для этого. Я использовал следующее:

 cat /proc/cpuinfo | awk -F : '/^processor/ { x = $2 } /^cpu MHz/ { print "CPU" x ":" $2 " MHz" }' 

который использует несколько иной подход для сохранения значения поля «процессор», а затем вызывает его, когда встречается поле cpu MHz. Вы можете сделать несколько более общие вещи таким образом, если вы знаете, какое из интересующих вас полей происходит последним. В этом случае мы знаем, что «cpu MHz» появляется после поля «процессор», поэтому мы знаем, что когда «cpu MHz» встречается, значение, сохраненное в переменной x, будет правильным.

Результат выглядит так:

 CPU 0: 887.597 MHz CPU 1: 818.359 MHz CPU 2: 887.597 MHz CPU 3: 803.222 MHz