【问题标题】:Filtering output lines that are between certain lines过滤特定行之间的输出行
【发布时间】:2013-07-06 23:32:10
【问题描述】:

我有一个从 bash shell 启动的命令,它输出一大堆行。

我想查看它的所有输出,除了“寻找更改”和“等待来自服务器的更改”之间的行

假设实际输出是 -

1号线 2号线 寻找变化 3号线 4号线 等待来自服务器的更改 5号线 6号线

我只想看看-

1号线 2号线 寻找变化 等待来自服务器的更改 5号线 6号线

我可以编写一个快速的 python 脚本,我可以通过管道处理它,但我想知道它是否可以用开箱即用的东西来完成,比如 grep 或 awk。

【问题讨论】:

    标签: shell awk grep stdout output


    【解决方案1】:

    我想出了这个解决方案:

    $ sed -n -e '1,/Looking/p' -e '/Waiting/,$p' file
    Line 1
    Line 2
    Looking for changes
    Waiting for changes from server
    Line 5
    Line 6
    
    • '1,/Looking/p' 从文件开头打印到包含 Looking 的行。
    • '/Waiting/,$p' 从包含 Waiting 的行开始打印到文件末尾。
    • sed -e 是让 sed 执行不同块的方法:sed -e 'something' -e 'other thing'

    【讨论】:

      【解决方案2】:

      这是一个 awk one 班轮:

      ... | awk '/^Waiting for changes from server$/{p=0}p==0{print}/^Looking for changes$/{p=1}'
      

      我们使用变量 p 作为标志。如果它为零,我们打印该行,否则我们不打印。当我们匹配指定的行时,标志会改变值。

      【讨论】:

      • 谢谢..这行得通。但是我选择了另一个答案,因为这会导致输出缓冲,并且只有在命令完成执行时才会显示所有内容
      猜你喜欢
      • 2014-10-05
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 2021-06-21
      • 2017-07-10
      相关资源
      最近更新 更多