5

我对 grep 和 sed 命令相当陌生。如何在 bash 脚本中使用 grep 或 sed+50.0提取?Core 0: +50.0°C (high = +80.0°C, crit = +90.0°C)

acpitz-virtual-0
Adapter: Virtual device
temp1:        +50.0°C  (crit = +89.0°C)
temp2:        +50.0°C  (crit = +89.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +50.0°C  (high = +80.0°C, crit = +90.0°C)
Core 2:       +47.0°C  (high = +80.0°C, crit = +90.0°C)

重击脚本:

#!/bin/bash

temp=`sed -n '/^Core 0:      $/,/^(high/p' ~/Desktop/sensors.txt`

echo $temp
4

4 回答 4

2

使用grep -oP(PCRE 正则表达式):

grep -oP 'Core 0: +\K[+-]\d+\.\d+' ~/Desktop/sensors.txt
+50.0
于 2013-09-05T17:51:21.573 回答
2
grep -e '^Core 0:' [input] | awk '{ print $3 }'

或者,就在 awk 中,

awk '{ r = "^Core 0:" } { if(match($0,r)) { print $3 } }' [input]

这两个都将打印您似乎正在寻找的字段,并消除周围的空白。

于 2013-09-05T17:51:33.287 回答
2

使用 grep 传入 perl-regex 标志并使用\K丢弃左侧行中不需要的部分

 grep -oP '^Core 0:\s+\K\+\d+[.]\d+?' 
于 2013-09-05T17:54:15.003 回答
1

为了完整起见,这里尝试修复您的sed脚本。

sed是面向行的,因此您的尝试将从与第一个表达式匹配的任何内容(无论如何都不会匹配)打印到与第二个匹配的下一行。

(因此,换个说法,sed -n '/first/,/last/p' file将从file匹配的第一行开始打印,并在文件的后续输入行中first找到时停止。)last

试试这个:

sed -n 's/^Core 0: *//;T;s/ (high.*//p' ~/Desktop/sensors.txt

这将用任何内容替换第一个表达式。如果替换没有发生,T跳转到脚本的末尾(隐式不做任何事情,只是从下一个输入行重新开始)。否则,我们有一个匹配,所以我们也将尾部替换为空,然后打印。

...但是,并非所有sed方言都有T命令,有些方言显然不喜欢用分号分隔的脚本。

于 2013-09-05T19:26:35.563 回答