【问题标题】:extract lines between two same delimiters ( multi instances delimiters)提取两个相同分隔符之间的行(多实例分隔符)
【发布时间】:2018-05-10 14:07:53
【问题描述】:

我想要的是从第一次出现的分隔符到最后一次出现相同的分隔符,包括它们之间的所有内容,分隔符可能会在日志文件中出现多次。

sample.log

[T=iaaaaaaaaa134]:SampleClass9: 
[T=iaaaaaaaaa134]:SampleClass7: 
[T=iaaaaaaaaa134]:SampleClass3: 
[T=iaaaaaaaaa134]:SampleClass1: 
[T=i8732jddcd234]:SampleClass1: 
[T=i8732jddcd234]:SampleClass2: 
[T=i8732jddcd234]:SampleClass3: 
[T=i8732jddcd234]:SampleClass4: 
Exception:NullPointerException:
    sampte 1
    sampte 1
    sampte 1
    sampte 1
    sampte 1
    
[T=i8732jddcd234]:SampleClass00: 
[T=i8732jddcd234]:SampleClass00: 
[T=i8732jddcd234]:SampleClass00: 
[T=i8732jddcd234]:SampleClass00: 
[T=i8732jddcd234]:SampleClass00: 
Exception:NullPointerException2:
    sampte 2
    sampte 2
    sampte 2
    sampte 2
    sampte 2
[T=i8732jddcd234]:SampleClass12: 
[T=i8732jddcd234]:SampleClass32: 
[T=i8732jddcd234]:SampleClass22: 
[T=2eeeeeeeee234]:SampleClass32: 
[T=2eeeeeeeee234]:SampleClass82: 
[T=2eeeeeeeee234]:SampleClass22: 
[T=2eeeeeeeee234]:SampleClass22: 

例如:我想提取从第一次出现的 i8732jddcd234(分隔符)到最近出现的 i8732jddcd234 的行以及它们之间的所有内容。可能使用 awk、sed、grep linux 命令。因为这是 linux 服务器上的日志文件。 我试过了

awk /'i8732jddcd234','i8732jddcd234'/ test.log

当然不行

【问题讨论】:

  • @RavinderSingh123 你能解释一下为什么取消删除并重新打开它吗?它似乎没有什么可兑换的价值,并且可以说是常见常见问题解答的副本。
  • @tripleee,对不起,我没有收到这条评论的通知(因为我没有被正确标记)。关于作为欺骗添加的链接在我看来并不确切,所以我投票打开,因为低质量的恕我直言 OP 已经表现出有问题的努力,所以我投票重新打开,谢谢。
  • 这似乎不是链接问题的欺骗。这个问题是不同的。

标签: linux awk sed


【解决方案1】:

关注awk 可能对您有所帮助。

awk '/i8732jddcd234/{if(!first){first=FNR};end=FNR} {a[FNR]=$0} END{for(i=first;i<=end;i++){print a[i]}}'  Input_file

现在也添加非单线形式的解决方案。

awk '
/i8732jddcd234/ {
   if (!first) {
      first = FNR
   }
   end = FNR
}
{
   a[FNR] = $0
}
END {
  for(i = first; i <= end; i++) {
     print a[i]
  }
}'  Input_file

【讨论】:

    【解决方案2】:
    last=$(nl sample.log | tac | awk '/i8732jddcd234/ {print $1; exit}')
    sed -n "/i8732jddcd234/,${last}p" sample.log
    

    或者,awk 需要 2 次通过文件:

    awk -v code=i8732jddcd234 '
        NR == FNR {
            if ($0 ~ code) {
                if (!first) first=FNR
                last=FNR
            }
            next
        } 
        first <= FNR && FNR <= last
    ' sample.log sample.log
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed '/i8732jddcd234/!d;:a;n;:b;//ba;$d;N;bb' file
      

      删除所有行,直到有一个包含i8732jddcd234。打印包含i8732jddcd234 的行,然后检查下一行是否也如此,如果是,则重复。否则,将这些行收集起来,直到下一次出现i8732jddcd234 或文件结尾,在这种情况下,可以删除累积的行。

      【讨论】:

        【解决方案4】:

        仅外壳...

            #!/bin/bash
        
            fileLength=`wc -l dat | cut -d' ' -f1`
        
            firstMatch=0
            lastMatch=0
        
            for i in `grep -n i8732jddcd234 dat | cut -d: -f1`; do
                if [ $firstMatch == 0 ] ; then
                    firstMatch=$i
                else
                    lastMatch=$i
                fi
            done
        
            diff=$(( lastMatch - firstMatch ))
            topOfMatch=$(( fileLength - firstMatch ))
        
            tail --lines=$topOfMatch dat | head --lines=$diff
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-10
          • 2016-01-03
          • 2021-02-23
          • 2012-06-23
          相关资源
          最近更新 更多