【问题标题】:Removing text between two strings over multiple lines在多行中删除两个字符串之间的文本
【发布时间】:2014-07-23 00:33:59
【问题描述】:

我有一个日志文件,它在不同的行上生成时间戳和命令日志记录。我想去掉时间戳并只保存“用户:命令”列表。我尝试了几种 sed 排列来替换或删除字符串之间的数据,但它总是超出命令的范围。当前日志输出类似于:

USER 001
6:32am
USER 001
random bash command or output 001
USER 002
7:41am
USER 002
random bash command or output 002
USER 001
7:43am
USER 001
random bash command or output 003
USER 002
7:43am
USER 002
random bash command or output 004

期望的输出:

USER 001
random bash command or output 001
USER 002
random bash command or output 002
USER 001
random bash command or output 003
USER 002
random bash command or output 004

【问题讨论】:

    标签: bash sed lines


    【解决方案1】:

    看起来会这样:

    sed -ri 'N; /^.*\n[0-9]/d'
    

    (假设 GNU sed。)

    它一次处理两行文件。
    在每个周期:

    • sed 自动将一行读入模式空间。
    • N 命令将一个换行符和下一行附加到模式空间。
    • 如果模式空间匹配“任何文本、换行符、数字”,则删除 它(因此不要自动打印)。
    • 否则,自动打印。

    【讨论】:

      【解决方案2】:

      如果文件一直是相同的格式,您可以像这样删除该行:

      awk 'NR%4!=1 && NR%4!=2' file
      USER 001
      random bash command or output 001
      USER 002
      random bash command or output 002
      USER 001
      random bash command or output 003
      USER 002
      random bash command or output 004
      

      或者你可以这样使用它:

      awk '!(NR%4==1 || NR%4==2)' file
      

      【讨论】:

        猜你喜欢
        • 2019-01-24
        • 2017-12-04
        • 1970-01-01
        • 2015-11-10
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        相关资源
        最近更新 更多