извлечь строки между двумя одинаковыми разделителями (разделители нескольких экземпляров) - PullRequest
0 голосов
/ 10 мая 2018

То, что я хочу, это от первого вхождения разделителя до последнего вхождения того же самого разделителя, включая все, что находится между ними, разделитель может появляться несколько раз в файле журнала.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 command.because это файл журнала на сервере linux.Я пробовал с awk / 'i8732jddcd234', 'i8732jddcd234' / test.log, конечно, это не будет работать

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Это может сработать для вас (GNU sed):

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

Удалить все строки, пока не найдется строка, содержащая i8732jddcd234. Напечатайте строку, содержащую i8732jddcd234, а затем проверьте, чтобы убедиться, что следующая строка тоже, и если это так, повторите. В противном случае собирайте строки до следующего появления i8732jddcd234 или до конца файла, и в этом случае накопленные строки можно удалить.

0 голосов
/ 10 мая 2018
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
0 голосов
/ 10 мая 2018

только оболочка ...

    #!/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
0 голосов
/ 10 мая 2018

После 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
...