Назад | Перейти на главную страницу

Grep, чтобы найти строки, начинающиеся с шаблона A, пока не будет сопоставлен шаблон B

У меня есть журнал, в котором есть такие биты:

[2012-04-16 15:16:43,827: DEBUG/PoolWorker-2] {'feed': {}, 'bozo': 1, 'bozo_exception': URLError(error(110, 'Connection timed out'),), 'entries': []}
[2012-04-16 15:16:43,827: ERROR/PoolWorker-2] get_entries
Traceback (most recent call last):
  File "/opt/myapp/app.py", line 491, in get_entries
    logging.getLogger(__name__).debug("Title: %s" % doc.title)
  File "build/bdist.linux-x86_64/egg/feedparser.py", line 423, in __getattr__
    raise AttributeError, "object has no attribute '%s'" % key
AttributeError: object has no attribute 'title'
[2012-04-16 15:16:43,828: INFO/MainProcess] Task myapp.do_task[4fe968ff-e069-4cfe-9a81-aece0d97c289] succeeded in 21.0481028557s: None

Я хотел бы извлечь из него следующие разделы:

  1. Когда строка содержит «ОШИБКА» или «ПРЕДУПРЕЖДЕНИЕ», начать фильтрацию (и включить эту строку)
  2. Когда будет найдена следующая строка, начинающаяся с "[", прекратите фильтрацию (и не включайте эту строку).

Я почти уверен, что это слишком много для Grep, так как это сделать?

(Хорошо, вместо того, чтобы полениться, я разобрался - опубликую свое решение.)

Это сработало для меня - не совсем так, как описано выше, но достаточно близко:

awk '/ERROR|WARN/,/DEBUG|INFO/ { if ($0 !~ /(DEBUG|INFO)/) { print } }' < logfile

Очень удобно, что awk поддерживает это: /startpattern/,/stoppattern/ { }. К сожалению, если шаблон остановки совпадает с той же строкой, что и шаблон начала, он распечатывает только эту строку, следовательно, требуется другой шаблон остановки.

Попробуйте что-то вроде этого:

cat importantstuff.log | grep 'File .*, line .*, in .*' -B 1 -A 2

Точно не отвечает на вопрос, но, думаю, решает задачу.

В -A и -B флаги для контрольных строк контекста grep после или до вашего совпадения.

Это работает, потому что grep группирует смежные совпадения, поэтому вы получаете хорошо разделенные трассировки:

Traceback (most recent call last):
  File "sfquest.py", line 9, in b
    c()
  File "sfquest.py", line 15, in c
    d()
  File "sfquest.py", line 20, in d
    raise Exception('important information')
Exception: important information
--
Traceback (most recent call last):
  File "sfquest.py", line 9, in b
    c()
  File "sfquest.py", line 15, in c
    d()
  File "sfquest.py", line 20, in d
    raise Exception('important information')
Exception: important information
--
Traceback (most recent call last):
  File "sfquest.py", line 9, in b
    c()
  File "sfquest.py", line 15, in c
    d()
  File "sfquest.py", line 20, in d
    raise Exception('important information')
Exception: important information

Вот пример кода, который я использовал для создания примера трассировки:

import traceback                                                                

def a():                                                                        
    b()                                                                         

def b():                                                                        
    for i in range(10):                                                         
        try:                                                                    
            c()                                                                 
        except Exception, e:                                                    
            print 'bad stuff'                                                   
            print traceback.format_exc(e)                                       

def c():                                                                        
    d()                                                                         

def d():                                                                        
    for i in range(10):                                                         
        print 'random junk'                                                     
    raise Exception('important information')                                    

a()