2013-09-05 32 views
5

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

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 
+0

你有什么需要提取的更具体的规则?它是否总是在Core 0之后立即在'之前'('? –

+0

我只想提取Core 0之间的任何内容:(如果可能的话,消除Core 0:和+50.0之间的额外空间动态) –

回答

2

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

grep -oP 'Core 0: +\K[+-]\d+\.\d+' ~/Desktop/sensors.txt 
+50.0 
+0

谢谢..它的工作 –

+0

不客气,很高兴它为你工作 – anubhava

2
grep -e '^Core 0:' [input] | awk '{ print $3 }' 

或者交替,只是在awk中,

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

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

+0

'grep -e'^核心0:'[input] | awk'{print $ 3}''正在打印'device (暴击(暴击适配器+ 50.0°C + 47.0°C),我只需要+50.0 –

+0

看起来grep并不是因为某些原因而工作的,awk代码只是在所有行上运行,不知道为什么会这样但是 - 两者在我的机器上都运行良好 – qaphla

+0

[不要使用'grep | awk'](http://partmaps.org/era/unix/award.html#grep)只要'awk'/^ Core 0:/ {print $ 3}'input'可以更加优雅,简洁和地道。 – tripleee

2

使用grep传入Perl的正则表达式标志和使用\K丢弃该行的非必要部分向左

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

谢谢..它的工作。 –

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命令,有些显然不喜欢以分号分隔的脚本。