egrep определенный абзац от строки поиска до строки происхождения до - PullRequest
0 голосов
/ 01 ноября 2018

Сейчас я ищу в архивных файлах GZIP 3.297 следующую команду:

zegrep -B 60 -E 'DMAStatus.*nError\ {13}.{3,5}\ $' collector_2018-*

Что я хотел бы осознать: Для замены опции -B 60 с определенным шаблоном поиска.

Это означает, что сейчас я извлекаю 60 строк перед каждым результатом поиска. Тем не менее, 60 строк может быть слишком мало, но и слишком много. (В зависимости от того, что, а точнее, сколько строк записывается в журнал до 'DMAStatus.*nError\ {13}.{3,5}\ $' записано)

Кстати, конечный шаблон: '\ {13}.{3,5}\ $' - это просто конкретная строка, которую я ищу в конце файлов.

\ {13} = Искать 13 пробелов

.{3,5} = Искать любую строку длиной 3-5 символов

\ $' = Далее следует еще один символ пробела, заканчивающийся EOL $

Я знаю, что каждое сообщение об ошибке вызывается одним конкретным набором символов: 01TNL

Как запустить команду zegrep для поиска шаблона поиска, указанного выше, а затем распечатать любую строку, начиная с 01TNL, до шаблона поиска?

Я добавляю здесь пример четырех разных файлов журнала, скопированных вместе в один файл в Notepad ++. Я забыл добавить важную информацию, к сожалению. Боюсь, именно поэтому подход с использованием awk не сработал.

Строка 01TNL появляется несколько раз в каждом файле журнала. Если строка постоянно 01TNL000, это не ошибка, и файл журнала продолжает расти. Любая другая комбинация, кроме трехкратных 000, обрабатывается как ошибка. Файлы журнала без ошибок в конце должны игнорироваться, для любых других случаев вся информация о файле журнала, например, из. строка 01TNL020 до конечной строки DMAStatus->nError и все, что между ними должно быть напечатано.

############   Logfile 2018-10-16_10-23-25 started pid 88108  
10:23:53.987   FIO:  rcvd ".01TNL000"  
10:24:12.803   FIO:  rcvd ".01TNL000"  
10:24:30.934   FIO:  rcvd ".01TNL000"  
10:24:49.040   FIO:  rcvd ".01TNL0**2**0"  
10:24:49.702   DMSG: DMAStatus->nError             2329


############   Logfile 2018-10-17_20-35-08 started pid 187491  
20:36:47.838   FIO:  rcvd ".01TNL000"  
20:36:53.487   FIO:  rcvd ".01TNL000"  
20:36:58.418   FIO:  rcvd ".01TNL000"  
20:37:02.329   FIO:  rcvd ".01TNL000"  
21:24:51.060   FIO:  rcvd ".01TNL000"  
21:24:54.864   FIO:  rcvd ".01TNL000"  
21:24:58.773   FIO:  rcvd ".01TNL000"  
21:25:03.175   FIO:  rcvd ".01TNL000"  
21:25:03.340   DMSG: DMAStatus->nError             0 


############   Logfile 2018-10-15_18-45-08 started pid 42128  
18:46:49.656   FIO:  rcvd ".01TNL000"  
18:46:55.980   FIO:  rcvd ".01TNL000"  
18:47:01.407   FIO:  rcvd ".01TNL000"  
18:47:05.266   FIO:  rcvd ".01TNL000"  
18:47:09.130   FIO:  rcvd ".01TNL000"  
18:52:57.211   FIO:  rcvd ".01TNL000"  
18:53:01.146   FIO:  rcvd ".01TNL000"  
18:53:05.006   FIO:  rcvd ".01TNL000"  
18:53:09.611   FIO:  rcvd ".01TNL000"  
18:53:16.078   DMSG: DMAStatus->nError             0 


############   Logfile 2018-10-18_03-32-00 started pid 12504  
03:33:52.948   FIO:  rcvd ".01TNL000"  
03:33:55.429   FIO:  rcvd ".01TNL00**1**"  
03:34:01.823   DMSG: DMAStatus->nError             2288 

Большое спасибо.

1 Ответ

0 голосов
/ 02 ноября 2018

Grep - неправильный инструмент. Awk будет лучше подойдет. Что-то вроде:

zcat foo.gz | awk '/^01TNL/, /DMAStatus.*nError {13}.{3,5} $/ { print }'

Редактировать: больше чтения в соответствующих диапазонах в awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...