Unix帮助在每第3次出现模式之后提取/打印50行直到文件结束

时间:2014-10-01 14:43:49

标签: unix awk sed command

我需要帮助在每第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

1 个答案:

答案 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++}如果计数器lines3,请打印该行并开始计算出现了多少行。
  • appeared==4{lines=0;appeared=0}如果已打印的行数已为4,请将标记重置为0
  • patt~$0 {lines++}如果该行与给定的模式匹配,则增加变量lines

请注意,所有这些常量34也可以放在-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