【问题标题】:Extract using sed or grep使用 sed 或 grep 提取
【发布时间】:2013-09-09 16:01:03
【问题描述】:

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

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

【问题讨论】:

  • 对于需要提取的内容是否有更具体的规则?是否总是紧跟在Core 0: 之后但在( 之前?
  • 我只想提取 Core 0: 和 (.) 之间存在的任何内容。如果可能的话,消除 Core 0: 和 +50.0(动态)之间的额外空间

标签: regex linux sed awk grep


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    grep -e '^Core 0:' [input] | awk '{ print $3 }'
    

    或者,在 awk 中,

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

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

    【讨论】:

    • grep -e '^Core 0:' [input] | awk '{ print $3 }' 正在打印 device (crit (crit adapter +50.0°C +47.0°C 。我只需要+50.0
    • 看起来 grep 出于某种原因无法正常工作,并且 awk 代码只是在所有行上运行。但是不知道为什么会发生这种情况——两者都在我的机器上运行良好。
    • Don't use grep | awk anyway. Simply awk '/^Core 0:/ { print $3 }' input 更优雅、更简洁、更地道。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      为了完整起见,这里尝试修复您的 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 命令,有些显然不喜欢用分号分隔的脚本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-23
        • 2015-06-11
        • 1970-01-01
        • 2017-12-13
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多