2017-02-21 5 views
1

У меня есть большое количество длинных нерегулярных журналов, которые выглядят так:Продолжая AWK или SED печать, включая ключевое слово до конечного рисунка достигается

###<date> errortext <errorcode-xxxxx> 
errortext 
errortext 
errortext 
errortext 
###<date> errortext <errorcode-yyyy> 
errortext 
errortext 
###<date> errortext <errorcode-<zzzzzzz> 
errortext 
errortext 
errortext 
errortext 
errortext 
errortext 
errortext 

и т.д.

Длина нерегулярно, и ошибки с одинаковыми кодами ошибок должны быть найдены с использованием методов grep/awk/sed или аналогичных методов.

Мне нужно разбить эти документы по коду ошибки, распечатав все ошибки одного кода в один документ.

Когда я пытаюсь найти весь код ошибки сегмент линии, как:

sed -n '/#</{:start /###/!{N;b start};/<errorcode-024332>/p}' file 

Проблема с линиями как выше, что он будет печатать только строку, которая включает в себя «ErrorCode-024332» и не весь код ошибки до начала следующего сегмента (с разделителем «###» в этом случае).

Как это достичь?

+1

https://stackoverflow.com/questions/38972736/how-to-select-lines-between-two-patterns может помочь, например: 'awk «/ ErrorCode-024332/{F = 1; Распечатать; next}/^ ###/{f = 0} f 'file' вы получите 'errorcode-024332' раздел – Sundeep

ответ

2

Ваша проблема возникает из-за того, что и #<, и ### соответствуют строке заголовка, поэтому вы печатаете ее и никогда не зацикливаете. Вы также присоединяетесь к буферу шаблонов, а не потребляете строки один за другим, поэтому заголовок всегда был бы согласован в любом случае.

Предполагая, что вы хотите, чтобы отобразить «заголовок» и «ErrorText» из «ERRORCODE-024332», вот как я бы это сделать:

sed -n '/#<.*<errorcode-024332>/{:start p;n;/###/!{b start}}' 
  1. , когда мы сопоставляем строка заголовка, соответствующие нашим код ошибки
  2. мы выводим его
  3. мы получаем следующую строку
  4. , если следующая строка не содержит ###, мы возвращаемся к шагу 2.

Быстрый тест, который я сделал с данными выборки:

$ echo "###<date> errortext <errorcode-xxxxx> 
errortext 
errortext 
[...] 
errortext 
errortext " | sed -n '/#<.*<errorcode-yyyy>/{:start p;n;/###/!{b start}}' 

###<date> errortext <errorcode-yyyy> 
errortext 
errortext 
+0

Добавление моего ключевого слова как такового: sed -n'/#/p} 'дал мне тот же результат, что и моя старая команда. Я неправильно понял, где это поставить? – Flowdorio

+1

@Flowdorio Я отредактировал его, пожалуйста, скажите, отвечает ли он на ваш вопрос. – Aaron

+0

Он делает! Спасибо! – Flowdorio

2

Вы можете использовать awk, как это:

awk -F'[<>-]' '/^#/{f=$(NF-1)}{print >> f; close(f)}' file.log 

Позвольте мне объяснить, как многострочные версии:

# Using this set of field delimiters it is simple to access 
# the error code in the previous last field 
BEGIN { FS="[<>-]"} 

# On lines which start with a '#' 
/^#/ { 
    # We set the output (f)ilename to the error code 
    f=$(NF-1) 
} 

# On all lines ... 
{ 
    # ... append current line to (f)ilename 
    print >> f; 

    # Make sure to close the file to avoid running out of 
    # file descriptors in case there are many different error 
    # codes. If you are not concerned about that, you may 
    # comment out this line. 
    close(f) 
} 
Смежные вопросы