LINUX.ORG.RU
ФорумAdmin

Форматирование лог файла. Как убрать лишнее.

 , , ,


1

3

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

"1" 
"2" 
"3" 
и ошибки 
"17" 
867 150911174145 enclosure 1   alert no 045006 1126 Power Supply Fault type 2 
"18" 
"19" 
"20" 
2335 150903171330 node 2 node2  alert no 074002 2030 Internal error
"40" 
"41" 
"42" 
"43" 
226 150922135724 port 4        alert no 073305 1065 Fibre Channel Speed Change 
246 150922181938 node 3 node2  alert no 071705 1450 Fibre Channel I/O ports not operational 
248 150922184433 node 3 node2  alert no 071704 1061 Fibre Channel ports not operational 
15 2 2 fc 8Gb 3 node2 500507680225E032 AB0100 inactive_configured host local_partner 0 2 
"44" 
"45" 
"46" 
1500 150907134353 mdiskgrp 2 PRBDED  alert no 989001  Managed Disk Group space warning 
"47" 
"NO PING 10.47.3.232" 
"NO PING 10.47.3.233" 
"NO PING 10.47.3.234" 
2777 150825110513 mdiskgrp 2 PRBDED  alert no 989001  Managed Disk Group space warning
"48"

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

"44" 
"45" 
"46" 

В каком направлении продуктивней всего копать? А получить хочу допустим только ошибки:

"43" 
226 150922135724 port 4        alert no 073305 1065 Fibre Channel Speed Change 
246 150922181938 node 3 node2  alert no 071705 1450 Fibre Channel I/O ports not operational 
248 150922184433 node 3 node2  alert no 071704 1061 Fibre Channel ports not operational 
15 2 2 fc 8Gb 3 node2 500507680225E032 AB0100 inactive_configured host local_partner 0 2 
"46" 
1500 150907134353 mdiskgrp 2 PRBDED  alert no 989001  Managed Disk Group space warning 
"47" 
"NO PING 10.47.3.232" 
"NO PING 10.47.3.233" 
"NO PING 10.47.3.234" 
2777 150825110513 mdiskgrp 2 PRBDED  alert no 989001  Managed Disk Group space warning



Последнее исправление: lexlex361 (всего исправлений: 5)

Оберни свой пример в [code][/code] и добавь пример того, что надо получить. lorcode

salsa
()

Я не смог въехать как должна работать фильтрация сообщений. Это всё из одного приложения логи или это сборная солянка из нескольких? В последнем случае стоит настроить демона логирования, а не заморачиваться костыльной stateful фильтрацией.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

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

 
из 
"19" 
"20" 
2335 150903171330 node 2 node2  alert no 074002 2030 Internal error
"40" 
"41" 
мне нужно только

"20" 
2335 150903171330 node 2 node2  alert no 074002 2030 Internal error

lexlex361
() автор топика
Ответ на: комментарий от true_admin

не особо владею, но сейчас разбираюсь с ним. нашел такой вариант

from itertools import izip_longest

# Превратим файлы в список строк, убрав символы \n в конце строки
l1 = map(lambda x: x.strip(), list(open('test1.txt')))
l2 = map(lambda x: x.strip(), list(open('test2.txt')))

# превратим два списка в один, где каждый елемент первого соответсвует елементу второго.
# Если в одном из спсиков нет соответсвующей строки - будет None
diff_list = izip_longest(l1, l2)

for diff in diff_list:
    print '%s %s %s' % (
        diff[0] or '', 
        '==' if diff[0] == diff[1] else '!=',
        diff[1] or '',
    )



но это мне тоже не очень подходит
lexlex361
() автор топика
Ответ на: комментарий от lexlex361

мне нужно на самом деле просто:


"19" 
"20"
Если между 19 и 20 что-то есть, то в отдельный файл. Если нет пропускаем. Все.

lexlex361
() автор топика
Ответ на: комментарий от lexlex361

Если я правильно понял то примерно так:

with open(fname) as f:
  lines = f.readlines()
for a,b in zip(lines, lines[1:]):
  if a.startswith('"') and a[1:-1].isnumeric():
    if not b[0].startswith('"'):
      print(a,b)

Код не проверялся, но, надеюсь, идея понятна. Допилить по вкусу.

true_admin ★★★★★
()
Ответ на: комментарий от lexlex361

Если между 19 и 20 что-то есть, то в отдельный файл

По-моему, ты каждый раз просишь чего-то нового. Возможно, тебе тупо нужно взять все строки что != /«\d+»/.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Сейчас попробую. Спасибо! Просто есть несколько путей решения я разные пытаюсь пробовать.

lexlex361
() автор топика
Ответ на: комментарий от lexlex361

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

zolden ★★★★★
()
Ответ на: комментарий от true_admin

awk по-умолчанию делит поля по пробелам (white space)

«NO PING 10.47.3.232» это одно поле или несколько?

так что несколько.

anonymous
()
Ответ на: комментарий от lexlex361

C awk не получилось, выводит просто содержание файла, лишние значения остаются.

Это говорит, только о том что твой файл не соотв. данному тобой описанию. Скорее всего надо его конвертировать dos2unix

anonymous
()
Ответ на: комментарий от anonymous

Дыааа :D

Братишка, я однострочник поменьше тебе принёс:

perl -lne '/^"\d+"/; $& eq $p ? do {print $& if ++$j==1} : ($j=0); print unless /^"\d+"/ && ($p=$&)'

Deleted
()
Ответ на: комментарий от Deleted

я однострочник поменьше тебе принёс

Сестренка, размер имеет значение?

Читабельность превыше размера.

anonymous
()
Ответ на: комментарий от anonymous

Сестренка, размер имеет значение?

в однострочниках - да, братец Иванушка.

еще скукожил немножко:

perl -lne '/^"\d+"/; $& eq $p ? ++$j==1 && print $& : ($j=0); print unless /^"\d+"/ && ($p=$&)'

Deleted
()
Ответ на: комментарий от anonymous

Неправда, я не упрямый.

P.S. еще на 10 символов.

perl -nE '/^"\d+"/; $& eq $p ? ++$j==1 && say $& : ($j=0); print unless /$&/; $p=$&'
Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.