代码之家  ›  专栏  ›  技术社区  ›  papigee

两个字符串(或行)之间的正则表达式行,并在Bash中使用多个函数处理每个匹配事件

  •  -1
  • papigee  · 技术社区  · 9 年前

    这个问题不是关于匹配字符串(或行)之间的多行。挑战在于我需要能够分别对每一场比赛执行一些操作。例如,如果这是我的日志文件:

    string 1
    string 2
    START HERE
    string 4
    string 5
    string 6
    string 7-8
    END HERE
    string 9
    string 10
    START HERE
    string 6
    string 3
    string 9
    string 1
    HERE END
    string 9
    string 1
    

    我是从 START HERE END HERE HERE END (但它总是从 ). e、 g对于第一场比赛,我需要:

    string 4 
    string 5
    string 6
    string 7
    

    我想对第一次匹配执行一些操作或调用一些函数(例如,计数 string 4 ,正则数如下 string 7 等),然后获得第二匹配,即:

    string 6
    string 3
    string 9
    string 1
    

    然后,我也将在第二场比赛中执行相同的操作(与第一场比赛不同)。

    总结一下,我想将每一场比赛与另一场比赛分开处理。 除了awk、sed和grep之外,我使用的bash没有其他依赖项。要获得起始行和结束行之间的行,我使用awk的方式如下:

    awk '/START HERE/,/END HERE\|HERE END /' logFile.log > matchedLines.log
    

    基本上,这将抓住所有之间的界线 从这里开始 到此为止 到此为止 从…起 logFile.log 并将其存储在 matchedLines.log .

    但我不能单独对每个匹配执行任何操作,它会将所有匹配转储到文件中。我希望能够将第一场比赛与第二场比赛和第三场比赛分开,以此类推。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Barmar    9 年前

    awk '/START HERE/ { in_block = 1; count4 = 0; next; }
         /END HERE|HERE END/ { in_block = 0; print count4; }
         in_block && /string 4/ { count4++; }' logFile.log
    
        2
  •  0
  •   Roman Czyborra    9 年前

    您可能希望将每个匹配外包到自己的文件中,如中所示

     awk '/START HERE/{match++}
          /START HERE/,/END HERE|HERE END/{print>match}' logFile.log
     for match in $(ls [1-9]*); do process $match; rm $match; done
    
    推荐文章