Как напечатать 5 строк до и после регулярного выражения с помощью команды awk - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу использовать awk для печати 5 строк до и 5 строк после регулярного выражения совпадения (Начните с ОШИБКИ и завершите sh с включением INFO | WARN | DEBUG | TRACE). Также мне нужно напечатать номер строки. Мне просто удалось напечатать номер строки

cat  foo |  awk '/\[ERROR\]/,/\[(INFO |WARN |DEBUG|TRACE)/{print NR":"$0}'

Мне не важно найти решение с помощью команды grep

Например, файл содержит:

DEBUG
DEBUG
DEBUG
TRACE
TRACE
INFO 
INFO 
ERROR
INFO 
INFO 
INFO 
DEBUG
DEBUG
DEBUG
DEBUG

Выходные данные должны быть:

3: DEBUG
4: TRACE
5: TRACE
6: INFO 
7: INFO 
**8: ERROR
9: INFO** 
10: INFO 
11: INFO 
12: DEBUG
13: DEBUG
14: DEBUG

Звезды отмечают регулярное выражение совпадения (начало в ОШИБКЕ, конец в ИНФО)

Ответы [ 3 ]

2 голосов
/ 05 апреля 2020
$ cat tst.awk
{ buf[NR%6] = $0 }
/ERROR/ { tgt=NR; f=1 }
tgt == NR {
    for (i=1; i<=6; i++) {
        print (NR+i-6) ":", buf[(NR+i)%6]
    }
}
f && /INFO|WARN|DEBUG|TRACE/ { tgt=NR+5; f=0 }

.

$ awk -f tst.awk file
3: DEBUG
4: TRACE
5: TRACE
6: INFO
7: INFO
8: ERROR
9: INFO
10: INFO
11: INFO
12: DEBUG
13: DEBUG
14: DEBUG
0 голосов
/ 05 апреля 2020

Я отправляю этот awk для рецензирования, превратил мой мозг в миску спагетти (даже не могу правильно написать спагетти ):

$ awk '{
    $0=NR " " $0                     # prepend NR to record
}
!f {
    b[6]=$0                          # buffer to hold 5 previous lines
    for(i=1;i<=5;i++) {
        if(/ERROR/)                  # print previous buffer at ERROR
            print b[i]
        b[i]=b[i+1]
    }
}
/ERROR/,/(INFO|WARN|DEBUG|TRACE)/ {  # between markers arm the output flag
    f=5
}
f&&f--' file                         # keeps negative valued flags out
0 голосов
/ 05 апреля 2020

Попробуйте grep и sed

grep -n -A5 -B5 ERROR file.txt | sed 's/:/: /;s/-/: /'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...