LINUX.ORG.RU

Авто-правка логов.

 ,


0

1

Вы уже знаете, а я лишь догадываюсь. Grep, sed, awk, регулярки - пока в голове каша, какой инструмент выбрать?

Задача: привести строку в порядок внутри bash-скрипта.
Пример:

[12:37:04] [Server thread/INFO]: [0;33;22mTPS from last 1m, 5m, 15m: [0;32;1m19.87, [0;32;1m19.85, [0;32;1m19.82[m

Получить на выходе:
Тпс за 1м, 5м, 15м: 19.87, 19.85, 19.82

Меняются только три дробных значения, остальная строка в итоге статична.


Я не прошу за меня сделать, лишь подсказать чем можно решить. Ну и за любые советы буду благодарен.
Доброй ночи.



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

какой инструмент выбрать?

Вставить в исходник вашего игрового сервера удобный вам логирующий вывод информации.

vodz ★★★★★
()

Гореть мне за это в аду, но работает:

⇉ ~ echo '[12:37:04] [Server thread/INFO]: [0;33;22mTPS from last 1m, 5m, 15m: [0;32;1m19.87, [0;32;1m19.85, [0;32;1m19.82[m' | sed -r 's/.*?(TPS from last 1m, 5m, 15m: ).*?m([0-9]+\.[0-9]+), .*?m([0-9]+\.[0-9]+), .*?m([0-9]+\.[0-9]+).*$/\1 \2, \3, \4/'
TPS from last 1m, 5m, 15m:  19.87, 19.85, 19.82

conformist ★★★
()

Первый ответ скорее всего верен(так как вам видимо «шашечки», а не «ехать»). А так все три варианта подходят четвёртым перепиливать строки до удобочитаемого вида.

art_metr
()

Строка такая страшная потому что сервер пытается её сделать цветной. Нельзя это у него просто выключить?

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

Мне кажется, что в ТЗ просто лень было раскладку переключать. Равно как и гуглить про формат логов (я уверен, его можно настроить).

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

Это ядро Spigot minecraft, функция встроенная. Не представляю как менять там лог, и не могу нагуглить сейчас...

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

Кажется нет, в конфиге такого нет. Может мне писать свои логи? Или как-то напрямую из screen получать строчки игровой консоли...

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

Гореть будем ВСЕ! :) Но можно же и попробовать не так настойчиво туда стремиться:

#!/bin/bash

while read l; do
        [[ "$l" =~ (TPS[^:]+: )[^m]+m([^ ]+)[^m]+m([^ ]+)[^m]+m([^ ]+) ]] && \
        echo "${BASH_REMATCH[1]}${BASH_REMATCH[2]} ${BASH_REMATCH[3]} ${BASH_REMATCH[4]}"
done << EOF
[12:37:04] [Server thread/INFO]: [0;33;22mTPS from last 1m, 5m, 15m: [0;32;1m19.87, [0;32;1m19.85, [0;32;1m19.82
EOF
TPS from last 1m, 5m, 15m: 19.87, 19.85, 19.82

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

Хм, освоил эту технику исключения символов, так и вправду лучше, спасибо :)

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

Все работает как часы, огромное спасибо.
А что бы вы посоветовали использовать в скрипте для мониторинга каждой строки логов по разным регуляркам? Switch или if-then?
Т.е. для каждой строки я буду применять много регулярок, отлавливая слова-триггеры. В теории, потом вариантов будет много - может бот.

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

В шеловском switch не регулярки, а glob-pattern, иногда их не хватает (правда регулярки в [[ =~ ]] — жутчайший башизм, с плюхами по совместимости, ну да ладно). Но для читабельности кода, когда у вас длинный выбор, то переключатель напрашивается.

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

Спасибо. А «\» в конце вашей регулярки - это экранирование конца строки, чтобы была одна строка, но читалось удобнее? (догадка).

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

А «\» в конце вашей регулярки

Да. Но обратный слеш там не в регулярке, а в продолжении условия: «выполнить следующую команду, если предыдущая завершилась успешно».

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

да, как раз искал этот мануал. вопрос исчерпан

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