我对grep和sed命令相当+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
命令,有些显然不喜欢以分号分隔的脚本。