【问题标题】:AWK--Print From End of Line till string is foundAWK——从行尾打印直到找到字符串
【发布时间】:2014-03-17 19:57:13
【问题描述】:

使用 awk 或 sed,如何从行尾开始打印,直到找到字符串(的第一个实例)。例如,如果flow 是字符串,那么flow.com 将从www.stackoverflow.com 中解析出来,www.flow.stackoverflow.com 也类似

【问题讨论】:

    标签: linux sed awk


    【解决方案1】:

    sed 是在单行上进行简单替换的出色工具:

    sed 's/.*\(flow\)/\1/' file
    

    【讨论】:

      【解决方案2】:

      试试这条线,如果它适合你:

      awk -F'flow' 'NF>1{print FS$NF}' file
      

      替代单线:

      awk 'sub(/.*flow/,"flow")' file
      

      测试(我在 EOL 中添加了一些数字,以便我们知道输出来自哪里):

      kent$  cat f
      www.stackoverflow.com1
      and similarly for 2 
      www.flow.stackoverflow.com3
      
      kent$  awk -F'flow' 'NF>1{print FS$NF}' f
      flow.com1
      flow.com3
      
      kent$  awk 'sub(/.*flow/,"flow")' f
      flow.com1
      flow.com3
      

      请注意,如果字符串具有某些特殊含义(对于正则表达式)字符,例如 *, |, [ ...,您可能需要转义这些字符。

      【讨论】:

      • 最后一个使用 sub 的答案特别有用。你介意解释一下它背后的逻辑吗?
      • @stat_novice awk 的sub(..) 返回一个数字,替换完成的次数。如果为 0,则表示在该行中没有找到“字符串”,我们忽略它。否则,我们从第一个字符切到最后一次出现的字符串。
      【解决方案3】:

      GNU grep 可以做到:

      grep -oP 'flow(?!.*flow).*' <<END
      www.stackoverflow.com
      nothing here
      www.flow.stackoverflow.com
      END
      
      flow.com
      flow.com
      

      该正则表达式找到“flow”,向前看,没有找到“flow”,然后是该行的其余部分。

      这也可以:更简单的正则表达式,但更多的努力:

      rev filename | grep -oP '^.*?wolf' | rev
      

      【讨论】:

        猜你喜欢
        • 2013-06-10
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        相关资源
        最近更新 更多