提取两个相同分隔符之间的行(多实例分隔符)

时间:2018-05-10 14:07:53

标签: regex linux awk sed

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

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 当然,它不会起作用

1 个答案:

答案 0 :(得分:-1)

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