LINUX.ORG.RU

осмысленное объединение строк в логах для дальнейшего парсинга

 , ,


0

1

Добрый день друзья. Изучаю bash не так долго, по этому сразу прошу прощение если что.

имеется текст формата

            14.03.2017 16:33:14      FOALP, WS0231    09       SOCHI2-VVING01   Check in guest
            Room: 12621      Guest    (RU) ?-? Degtia, Elena   Keycard user ID:         11547    Cards:   1
            Guest    14.03.2017 15:32:54      24.03.2017 12:00:00      DBO
            14.03.2017 16:48:57               SYSTEM   DG7      System started
            14.03.2017 16:50:33      VingCard, Demo1  VingCard 1       DG7      Log in system user
            14.03.2017 16:52:12      FOALP, WS0231    09       SOCHI2-VVING01   Check in new guest, remove previous
            Room: 12257      Guest    (RU) ?-? Abu, Marian     Keycard user ID:         14057    Cards:   1
            Guest    14.03.2017 15:52:03      17.03.2017 12:00:00      DBO
            14.03.2017 16:55:44      VingCard, Demo1  VingCard 1       DG7      Backup system data base files
            Backup dated:    14.03.2017 16:55:44      To/From: Remote server   System event included

нужно объединить строки которые начинаются с дд.мм.гггг, Room:, Guest и которые идут именно в этом порядке. Т.е. из 3-х строк сделать одну длинную.Порядок строк важен, из примера 4-ая и 5-ая строка нам не подходят и мы должны их игнорировать.

подскажите куда копать? Или читать строку и писать переменные со значениями в массив, а потом проверять с чего начинается следующая строка и при положительном прохождении дописывать в существующий массив?

Очевидно, строки, за которыми идут комнаты, имеют какие-то признаки, например, совпадают с регэкспом Check in (new )?guest. Можно их обнаруживать и читать дополнительные строки как продолжение найденой. Легко сделать на awk.

legolegs ★★★★★
()

Ну судя по приведенному куску можно повыкидывать строки с «system», а оставшиеся объединять любым удобным способом хоть удалив «\n» и потом добавив его перед строки, начинающейся с числа.

Но вообще это все костыли, формат логирования никак нельзя поменять?

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от alozovskoy

Да вот в том то и дело что выкидывать нельзя, типа это может быть нужная информация.

Формат отдаёт сторонняя программулина, этот вывод уже с вычетом всей лишней информации (я уже вырезал всё что можно). Сказали распарсить так, так как в будущем всё будет делаться автоматически и присылаться отчёт по нужным срезам данных.

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

ага, это уже... так сказать инициатива шефа по моему воспитанию.

пока пытаюсь сделать как то так, но где то ошибка в синтаксисе. awk '{if ($0 ~ /Keycard user ID/){printf "%s+",$0} if ($1 ~ /([0-9]{,2}).([0-9]{2}).([0-9]{4})/){ sed 's/^*/^\n/g' ; print $0} }' да и честно говоря вообще не уверен что это сработает

De_Archangel
() автор топика

Если в лоб, то можно так попробовать.

awk '/^Room:/ { room = $0; getline; if ($0 ~ /^Guest/) { buf = buf " " room " " $0; getline } else { buf = buf ORS room } } buf { print buf } { buf = $0 } END { print buf }'

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

не работает, но за идею спасибо

У меня работает, но я, правда, пробелы в начале строк удалил, полагая, что исходно их там не было. (Логи с ведущими пробелами вменяемые люди не ведут.)

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

Логи с ведущими пробелами вменяемые люди не ведут.)

Скорее так: если лог нужен для обработки, то логи ведут отдельно в файл, а лучше сразу в базу :)

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

ещё как были. Говорю ж програмулина лог пишет. Пишет его либо в пдф (который мне почему то ни как не дадут) либо в rtf который я перевожу в html который в свою очередь преобразую в тхт так ещё и пробелы тут DOS. Заработало, спасибо большое. Сам бы вряд ли осилил. Точнее даже 100% бы не осилил. Я до сих пор до конца не понимаю как эта строчка работает))

De_Archangel
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.