【问题标题】:Grepping only certain lines of files仅搜索某些文件行
【发布时间】:2010-08-16 07:19:06
【问题描述】:

我在一个目录中有一组文件,我想搜索一个特定的正则表达式(=([14-9]|[23][0-9]),碰巧)。但我只关心这种模式何时落在第二、六、十、...、4n+2 行。

有什么好办法吗?

【问题讨论】:

    标签: regex shell grep


    【解决方案1】:

    在不使用额外 grep 的情况下修改答案,

    awk '/(=([14-9]|[23][0-9])/ && FNR % 4==2{print FNR":"$0}}' inputFile 
    

    【讨论】:

      【解决方案2】:

      您应该首先将其传递给awk 以删除不需要的行(并且可以选择添加行号,以便您仍然可以分辨出真正的行是什么):

      pax> echo 'L1
      ...> L2
      ...> L3
      ...> L4
      ...> L5
      ...> L6
      ...> L7
      ...> L8
      ...> L9
      ...> L10
      ...> L11
      ...> L12' | awk '{if ((FNR % 4)==2) {print FNR":"$0}}'
      2:L2
      6:L6
      10:L10
      

      (如果您不关心行号,只需使用'{if ((FNR % 4)==2) {print}}')。所以像:

      awk '{if ((FNR % 4)==2) {print FNR":"$0}}' inputFile | grep '(=([14-9]|[23][0-9])'
      

      应该可以解决问题。

      【讨论】:

      • 谢谢!稍作修改,awk '{if ((FNR % 4)==2) {print FNR":"$0}}' * | egrep '=([14-9]|[23][0-9])' 效果很好。
      【解决方案3】:

      尝试使用 awk 执行此操作。有点像

      BEGIN     {i=0; n=0; }
      
      /yourregegex/  {
                     if(i==n) { print $0; n= 4*i+2;}
                     }
      
                     {
                     i++;
                     }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 2010-12-17
        • 2014-07-10
        • 1970-01-01
        • 2012-11-22
        • 1970-01-01
        相关资源
        最近更新 更多