如何为 grep 输出中的每一行添加不同的前缀?

如何为 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 循环中逐一定位这些行。

那么,我该怎么做呢?

答案1

让我们awk为您做这一切:

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

答案2

cat /proc/cpuinfo | awk '/MHz/ {print "Core", i++, $NF "Mhz"}'给出,

Core 0 800.000Mhz
Core 1 800.000Mhz

答案3

我做了一个稍微不同的 awk 版本,但是一旦你熟悉了 awk,它就会成为这个问题的自然解决方案。我使用了以下内容:

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

它使用稍微不同的方法来保存“处理器”字段的值,然后在遇到 cpu MHz 字段时调用它。如果您知道您感兴趣的字段最后出现,您可以用这种方式做一些更一般的事情。在这种情况下,我们知道“cpu MHz”位于“processor”字段之后,因此我们知道当遇到“cpu MHz”时,存储在变量 x 中的值将是正确的。

输出看起来像:

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

相关内容