Нанесите «текст» и напечатайте все строки до и после текста. каждый сеанс журнала разделяется 2 пустыми строками - PullRequest
1 голос
/ 19 февраля 2020
1  
1  
1  
1  
  Text  
11
1  
1  
1

Текст выше может быть где угодно, поэтому grep - C не поможет. Я пробовал это с помощью AWK, но я хочу сделать это с помощью grep

zgrep -C25 "Text" engine.*.log.gz

не работает, так как текст может появляться где угодно

Я знаю вариант awk, но это не так работать над файлом .gz, я должен преобразовать его в длительный процесс
awk -v RS= '/Text/' engine.*.log.gz

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020

Просто сделайте это тривиальным, очевидным, надежным, переносимым способом:

zcat engine.*.log.gz | awk -v RS= '/Text/{print; exit}'

Это также должно быть довольно эффективным, поскольку SIGPIPE, который zcat получает, когда awk выходит при поиске первого Text должен завершить zcat.

Или, если Text может появляться несколько раз на входе, и вы хотите, чтобы все связанные записи выводились:

zcat engine.*.log.gz | awk -v RS= -v ORS='\n\n' '/Text/' 
0 голосов
/ 20 февраля 2020

Большое спасибо за помощь, но я разобрался с решением

zgrep -C34 "text" engine.*.log.gz |awk '/20yy-mm-dd hh:mm:ss/,/SENT MESSAGES (asynchronous)/'

  1. Поиск "текст" вдоль боковых 34 строк до и после него, чтобы получить усреднить все необходимые строки
  2. Весь мой сеанс журналов всегда начинается с даты и времени, поэтому для этого используется AWK
  3. Весь мой сеанс журналов всегда заканчивается "SENT MESSAGES (асинхронный): "Так что AWK сделал этот трюк для меня.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...