【问题标题】:Read lines between two keywords读取两个关键字之间的行
【发布时间】:2012-02-16 16:58:17
【问题描述】:

如果我必须在两个关键字(如

)之间阅读,有人可以建议我该怎么做吗?
*System_Power
1
1.2
1.8
2
*System_Terminate

在这种情况下,答案是

1
1.2
1.8
2

我试过像 awk 一样使用

awk '$0 =="*System_Power"               #  start printing when 1st field is *System_Power
$0 != "*System_Terminate"{              #  until reach the  *System_Terminate
print;   } ' powerSummary > reportedFailure.k    # Read from file powerSummary and pipe to reportedFailure.k
exit

上述数据位于文件 powerSummary 中间的某处。

感谢您的指正。

【问题讨论】:

    标签: linux bash sed awk


    【解决方案1】:

    这对你有用:

    $ awk '/\*System_Power/{f=1;next}/\*System_Terminate/{f=0}f' infile
    1
    1.2
    1.8
    2
    

    【讨论】:

    • 它对我有用,但我无法找到一般的 awk-ing 方式。每次我得到一种很难消化的新格式的解决方案。试图得到它。
    【解决方案2】:

    您可以使用sed 简单地选择两个匹配行之间的文本,但这也将包括匹配行本身......所以我们明确删除那些:

    sed -n '/System_Power/,/System_Terminate/ { 
        /^\*/ d
        p
    }' < input
    

    awk 还可以选择匹配行之间的文本:

    awk '/System_Power/,/System_Terminate/ {print}' < input
    

    ...但是像sed 这将包括开始/结束终止符。您可以使用awk 解决此问题,但我认为使用sed 可以获得更简洁的解决方案。

    【讨论】:

    • 您使用重定向而不是 sed/awk 参数是否有原因?对我来说,那些可以写成sed ... inputawk ... input 没有&lt;
    • 不,没有理由。只是处于一种过滤的心情。
    【解决方案3】:

    这是另一个:

    awk '$1=="*System_Power",$1=="*System_Terminate" {if (!/System*/) print}' in.txt
    

    【讨论】:

      【解决方案4】:

      这可能对你有用:

      sed '/^\*System_Power/,/^\*System_Terminate/!d;//d' file
      

      或者这个:

      awk '/^\*System_Terminate/{p=0};p;/^\*System_Power/{p=1}' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-27
        • 1970-01-01
        • 2018-07-09
        • 2012-07-28
        • 1970-01-01
        • 2013-05-11
        相关资源
        最近更新 更多