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

时间:2016-10-13 22:44:47

标签: bash shell awk sed grep

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

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 HEREEND HEREHERE END匹配(但它始终以START HERE开头)。例如,对于第一场比赛,我需要:

string 4 
string 5
string 6
string 7

我想在第一次匹配时执行一些操作或调用一些函数(例如,string 4的出现次数,string 7之后的正则表达式次数等),然后才能获得第二次匹配:< / p>

string 6
string 3
string 9
string 1

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

总结是我希望将每个匹配与另一个匹配。 我使用bash没有其他依赖,除了awk,sed和grep。为了得到起始行和结束行之间的界限,我用这种方式使用awk:

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

基本上,这会抓住START HERE中所有END HEREHERE ENDlogFile.log之间的界限,并将其存储在matchedLines.log中。

但是我无法分别对每个匹配执行任何操作,它会将所有匹配转储到文件中。我希望能够将第一场比赛与第二场比赛和第三场比赛分开处理,等等。

2 个答案:

答案 0 :(得分:2)

不要使用范围,分别匹配起始行和结束行,并初始化将用于处理块中其余行的变量。

{{1}}

答案 1 :(得分:0)

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

 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