使用sed或grep提取

时间:2013-09-05 17:47:01

标签: regex linux sed awk grep

我对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)

Bash脚本:

#!/bin/bash

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

echo $temp

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

或者,只是在awk中,

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

(因此,换句话说,sed -n '/first/,/last/p' file将从匹配file的{​​{1}}的第一行打印,并在其后续输入行中找到first时停止文件)。

请改为尝试:

last

这将替换第一个表达式。如果没有发生替换,sed -n 's/^Core 0: *//;T;s/ (high.*//p' ~/Desktop/sensors.txt 跳转到脚本的末尾(隐式地什么也不做,只是从下一个输入行重新开始)。否则,我们有一个匹配,所以我们也没有替换尾部,并打印。

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