检测匹配范围 - shell脚本

时间:2015-11-19 13:53:14

标签: shell unix awk logfile

我有一个文件A和B.

  • A包含日志条目
  • B包含一些行号,而这些行号又是某些特定的行号

引用日志文件

我有一个像这样的awk程序:

echo "($(awk 'NR==1{r1=$1;next}
              NR>2{printf"||"}
              {printf"(NR>%d&&NR<%d)",r1,$1;r1=$1}' B))&&/mypattern/"|
  awk -f- A
       ---> (courtesy jeff y from stack flow )

in this link you can find the requirement for which the above script is born

“|”之前的部分生成要在文件A中搜索的范围。 例如:(NR>385&&NR<537)||(NR>537&&NR<539)||(NR>539&&NR<547)|
这些是“|”之前部分可以生成的一些范围 我需要将“mypattern”匹配的范围存储在sep文件中,或者最后变量 比如说NR>385&&NR<537 - &gt;根据我的模式,文件A上的这个范围可能没有匹配,因为(NR>539&&NR<547这可能有 所以任何想法都要检查是否发生了匹配,如果是,则将NR对应的NR值存储在文件的旁边。

1 个答案:

答案 0 :(得分:0)

鉴于你在评论中的澄清,我建议一个解决方案只需要通过FILE_A一次通过awk,而不是尝试在多个通道中以数字方式提取和使用行号和范围(FILE_B):

awk '/Exception/ && !/ExceptionUnparseable date/ {
       haveEx="yes"; ex=$0; exDate=last; haveMatch=""}
     haveEx && /tms/ {
       haveMatch="yes"; print exDate; print ex; haveEx=""}
     haveMatch && /tms/ {print}
     {last = $0} ' FILE_A

或者,如果您不需要查看与该模式匹配的行:

awk '/Exception/ && !/ExceptionUnparseable date/ {
       haveEx="yes"; ex=$0; exDate=last}
     haveEx && /tms/ {
       print exDate; print ex; haveEx=""}
     {last = $0} ' FILE_A