使用sed或grep解压

我对grepsed命令相当+50.0如何在bash脚本中使用grep或sed,从Core 0: +50.0°C (high = +80.0°C, crit = +90.0°C)提取+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) 

Bash脚本:

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

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

 grep -oP 'Core 0: +\K[+-]\d+\.\d+' ~/Desktop/sensors.txt +50.0 
 grep -e '^Core 0:' [input] | awk '{ print $3 }' 

或者,在awk中,

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

这两个将打印您似乎正在寻找的领域,消除周围的空白。

使用传递perl-regex标志的grep,并使用\ K丢弃该行不需要的部分

  grep -oP '^Core 0:\s+\K\+\d+[.]\d+?' 

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

sed是面向行的,所以你的尝试将从匹配第一个表达式(永远不会匹配)的任何东西打印到匹配第二个的下一行。

(所以,换句话说, sed -n '/first/,/last/p' file将从file匹配中的第一行开始打印,并在file的后续输入行中找到last一行时停止。

试试这个:

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

这将会替换第一个表达式。 如果替换没有发生, T跳转到脚本的末尾(隐含地不做任何事情,只是从下一个输入行开始)。 否则,我们有一场比赛,所以我们也没有任何东西替换尾巴,并打印。

…然而,并不是所有的sed方言都有T命令,有些显然不喜欢以分号分隔的脚本。