【问题标题】:get range out using sed or awk, only if given pattern match仅当给定模式匹配时才使用 sed 或 awk 获取范围
【发布时间】:2017-09-23 07:14:50
【问题描述】:

输入:

START
OS:: UNIX
Release: xxx
Version: xxx
END
Description about UNIX
  <Multiline>
START
OS:: LINUX
Release: xxx
Version: xxx
END
Description about LINUX
  <Multiline>
START
OS:: Windows
Release: xxx
Version: xxx
END
Description about Windows
  <Multiline>

这里我试图获取 START 和 END 之间的所有信息,前提是我可以匹配操作系统类型。

我可以获取范围 START 和 END 之间的所有数据,但是我不知道如何匹配模式

使用 SED

sed -n '/START/,/END/p'

使用 AWK

awk '/START/,/END/'

预期输出

在搜索 Linux 时

START
OS:: LINUX
Release: xxx
Version: xxx
END

需要帮助!!

提前致谢

【问题讨论】:

    标签: shell awk sed


    【解决方案1】:
    $ awk 'last~/START/ && /LINUX/ {print last; f=1} f{print} /END/{f=0} {last=$0}' file
    START
    OS:: LINUX
    Release: xxx
    Version: xxx
    END
    

    即使输入中有位于 START-END 块之外的行,这种方法也可以工作。

    工作原理

    • last~/START/ &amp;&amp; /LINUX/ {print last; f=1}

      如果最后一行匹配START且当前行匹配LINUX,则打印最后一行并将变量f设置为1。

    • f{print}

      如果f 不为零,则打印当前行。

    • /END/{f=0}

      如果当前行匹配END,则将f 设置为零。

    • last=$0

      将当前行保存在变量last中。

    【讨论】:

    • 谢谢约翰,效果很好..我正在寻找如下更简单的.. :)
    【解决方案2】:
    $ awk 'BEGIN{RS=ORS="END\n"}/LINUX/' file
    START
    OS:: LINUX
    Release: xxx
    Version: xxx
    END
    

    它将输入和输出记录分隔符设置为END\n,所以基本上每条记录都有一个START-END块(嗯,技术上START-不是END,因为它是一个记录分隔符),并打印出包含LINUX 的块。修改匹配的正则表达式部分 (/LINUX/) 以满足您的需要。

    【讨论】:

    • 谢谢詹姆斯,它可以工作.. 但是,如果我有如下数据,这将失败: START OS:: UNIX Release: xxx Version: xxx END ------- ...... .. START OS:: LINUX Release: xxx Version: xxx END ----------- ......
    • 如果您的数据是您在 OP 中呈现的其他数据,那么它有可能会失败,是的。我向您展示了一个处理以END\n 结尾的数据块的脚本。请将该数据更新到 OP,我也许可以修复它。
    • 更新输入,预期输出相同。描述可以是任意行数:)
    【解决方案3】:

    awk解决方案:

    awk '/START/{pr=$0}/LINUX/{ print pr; n=NR+3 }NR<=n{print}' file
    

    输出:

    START
    OS:: LINUX
    Release: xxx
    Version: xxx
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2021-09-05
      • 2014-10-20
      • 2011-07-20
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多