我需要帮助在每第3次出现模式之后提取/打印4行直到文件结尾。请考虑以下是日志文件的示例
ERROR_FILE_NOT_FOUND
ERROR_FILE_NOT_FOUND
ERROR_FILE_NOT_FOUND
Extract line 1
Extract line 2
Extract line 3
Extract line 4
ERROR_FILE_NOT_FOUND
ERROR_FILE_NOT_FOUND
ERROR_FILE_NOT_FOUND
Extract line 5
Extract line 6
Extract line 7
Extract line 8
ERROR_FILE_NOT_FOUND
ERROR_FILE_NOT_FOUND
ERROR_FILE_NOT_FOUND
Extract line 9
Extract line 10
Extract line 11
Extract line 12
答案 0 :(得分:1)
只需使用一些标记来跟踪出现的内容和次数:
awk -v patt="ERROR_FILE_NOT_FOUND"
'lines==3 {print; appeared++}
appeared==4 {lines=0;appeared=0}
patt~$0 {lines++}' file
这会随着匹配的行数加载lines
。达到3
后,开始打印。它准确打印4
次。
-v patt="ERROR_FILE_NOT_FOUND"
这提供了要查看的模式lines==3 {print; appeared++}
如果计数器lines
为3
,请打印该行并开始计算出现了多少行。appeared==4{lines=0;appeared=0}
如果已打印的行数已为4
,请将标记重置为0
。patt~$0 {lines++}
如果该行与给定的模式匹配,则增加变量lines
。请注意,所有这些常量3
和4
也可以放在-v
之外,以使其更通用:
awk -v patt="ERROR_FILE_NOT_FOUND" -v matches=3 -v lines_to_print=4
'lines==matches {print; appeared++}
appeared==lines_to_print {lines=0;appeared=0}
patt~$0 {lines++}' file
$ awk -v patt="ERROR_FILE_NOT_FOUND" 'lines==3 {print; appeared++} appeared==4 {lines=0;appeared=0} patt~$0 {lines++}' file
Extract line 1
Extract line 2
Extract line 3
Extract line 4
Extract line 5
Extract line 6
Extract line 7
Extract line 8
Extract line 9
Extract line 10
Extract line 11
Extract line 12