使用sed linux输出具有特定字符串的行中的数字

时间:2012-11-14 10:46:27

标签: regex linux sed compare

我有一个像下面这样的输入。

Curveplot
Time
Maxima of Curve
Part no.
13 #pts=2
* Minval=   0.000000e+000 at time=        0.000000
* Maxval=   2.237295e+000 at time=        0.001000
   0.000000e+000       0.000000e+000
   9.999999e-004       2.237295e+000
endcurve

我想从这个文件中获取最大值,这是Maxval

之后的值
* Maxval=   2.237295e+000 

有人可以建议如何使用linux sed吗? 我的输出只有2.237295e + 000。

5 个答案:

答案 0 :(得分:5)

使用以下单行仅显示2.237295e+000

sed -nr 's/.*Maxval= *([^ ]*).*/\1/p'

正则表达式:

Match:
.*      # match any characters
Maxval= # upto 'Maxval='
 *      # match multiple spaces (that is a space followed by *)
([^ ])  # match anything not a space, use brackets to capture (save this) 
.*      # match the rest of line

Replace with:
\1      # the value that a was captured in the first set of brackets. 

因此,我们有效地将包含单词Maxval=的整行替换为Maxval的值。

注意:根据sed的平台和/或实施情况,您可能需要使用-E代替-r

答案 1 :(得分:2)

一种方式:

sed -n 's/.*Maxval=\s*\([^ ]*\).*/\1/p' file.txt

结果:

2.237295e+000

答案 2 :(得分:0)

提案:

cat test.txt | grep Maxval | sed -e 's/^.*Maxval= *//' -e 's/ at.*$//' 2.237295e+000

  • cat将文件显示为stdout
  • grep只保留有趣的行
  • 第一个sed正则表达式删除行的开头直到空格结束
  • 第二个sed正则表达式删除'at'直到行尾

答案 3 :(得分:0)

awk '/Maxval=/{print $3}' your_file

测试如下:

> cat temp
Curveplot
Time
Maxima of Curve
Part no.
13 #pts=2
* Minval=   0.000000e+000 at time=        0.000000
* Maxval=   2.237295e+000 at time=        0.001000
   0.000000e+000       0.000000e+000
   9.999999e-004       2.237295e+000
endcurve
> awk '/Maxval=/{print $3}' temp
2.237295e+000

答案 4 :(得分:0)

你也可以用grep:

来做
<infile grep -o 'Maxval= *[^ ]\+' | grep -o '[^ ]\+$'

输出:

2.237295e+000