Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Как выбрать часть текста из лога & модифицировать его ? GREP ???  (Прочитано 2500 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DZ333817

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Здравствуйте,

Подскажите пожалуйста, есть лог, который помимо ненужных данных, выдает нужную информацию в строках
Нужные строки я могу отсеять командой "grep -w chat home.log" и получу такой вид
10:20:18 LOG:  <chat target="Kitchen" checkid="AC:2F:45:A5:08:C7">25</chat>
10:22:18 LOG:  <chat target="Garage" checkid="AC:2F:45:A5:F3:01">18</chat>
10:30:18 LOG:  <chat target="Kitchen" checkid="AC:2F:45:A5:08:C7">26</chat>
10:32:18 LOG:  <chat target="Garage" checkid="AC:2F:45:A5:F3:01">18</chat>

В идеале хотел бы понять, как его привести в виду часы, минуты - точка - температура, то есть... приевести строку
10:20:18 LOG:  <chat target="Kitchen" checkid="AC:2F:45:A5:08:C7">25</chat>к виду
10:20 Kitchen 25
10:22 Garage 18

Или вообще...
10:20 На Кухне 25°C
10:22 В Гараже 18°C
чтоб потом выкидывать ее через Curl в телеграм-бота

Какими программами такие тексты компануются для привода лога к нужному мне виду (созданию другого лога?)  ?
Как я понимаю, мне нужно для начала, чем-то вроде GREPa отфильтровать
1) первые 5 символов
2) потом пробел и то что идет после target=" до второй кавычки
3) и последнее... пробел и то что находится между "> и  </chat>

Спасибо!

ТС не появлялся на Форуме более полугода по состоянию на 22/07/2019 (последняя явка: 02/04/2018). Модератором раздела принято решение закрыть тему.
--zg_nico
« Последнее редактирование: 22 Июля 2019, 14:52:08 от zg_nico »

Оффлайн ecc83

  • Старожил
  • *
  • Сообщений: 2121
  • Ubuntu Mate 22.04 LTS
    • Просмотр профиля
Какими программами такие тексты компануются для привода лога к нужному мне виду

sed

https://ru.wikipedia.org/wiki/Sed


Оффлайн Длиннорогий

  • Активист
  • *
  • Сообщений: 257
    • Просмотр профиля
awk '{ print $1,$4,$5 }' | sed -E 's/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/'

Оффлайн DZ333817

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Спасибо огромное!!! А то я даже не знал толком, как запрос в поисковике сформулировать :)
А за готовый пример ОТДЕЛЬНОЕ ОГРОМНОЕ спасибо! Так разбираться значительно проще!

А подскажите еще, как правильнее сам процесс вывода формировать
все пишется в основной лог (home.log) в реальном времени, но там куча мусора, если я беру мой лог и выполняю команду
grep -w chat  home.log | awk '{ print $1,$4,$5 }' | sed -E 's/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/'
то все отлично, но это только когда я вручную это команду запускаю.

Сейчас вроде удалось настроить телеграмм-бота, который через CURL может отсылать мне сообщения (по крайней мере, через скрипт sh он мне присылает то, что в нем уже написано)

curl "https://api.telegram.org/bot123456789:XXXXXXXXXXXXXXXXXXXXXXXXXX/sendMessage" -d 'chat_id=123456789&language_code=ru-RU&text=ZZZZZ'

Если любой текст вставлять вместо ZZZZ он доходит нормально (теперь даже русский :) )

Каким способом можно следить без моего участия за этим логом, чтоб когда там появляется новая запись с этим chat'ом, она обрабатывалась той большой тройной командой, вставлялась в TG вместо ZZZZ и выполнялась отправка ?
Я правильно понимаю, что это уже должен быть какой-то скрипт, который должен висеть в кроне, и запускаться каждые 5-10 минут (у меня Расбери Пи-3 на debian) ? Но ведь он же не поймет, какая запись новая, и будет обрабатывать весь ЛОГ ?!  С cамим CRON'ом тоже вроде разобрался, он мне теперь эти ZZZZ каждые 10 минут шлет ;)))

Спасибо всем, целый новый мир для себя открываю!

Оффлайн Длиннорогий

  • Активист
  • *
  • Сообщений: 257
    • Просмотр профиля
Цитировать
grep -w chat  home.log | awk '{ print $1,$4,$5 }' | sed -E 's/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/'
это можно заменить на
sed -E '/chat/!d;s/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/' home.log

Каким способом можно следить без моего участия за этим логом, чтоб когда там появляется новая запись с этим chat'ом, она обрабатывалась той большой тройной командой, вставлялась в TG вместо ZZZZ и выполнялась отправка ?
Я не до конца понял, что и куда у вас приходит.
« Последнее редактирование: 31 Марта 2018, 11:08:14 от Длиннорогий »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
той большой тройной командой
sed '/chat/! d;s/:.. [^"]*"/ /;s/".*">/\t/;s/<.*/°C/'  home.log
Каким способом можно следить без моего участия за этим логом
Конечно есть специальный инструмент inotify, который отслеживает изменение файловой системы. Но вряд ли Вам надо следить с такой сложностью. Намного проще с определенной периодичностью проверять лог на наличие новых записей, например сохраняя количество строк после последней проверки и выводя те, чьи номера больше зафиксированного
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн DZ333817

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
awk '{ print $1,$4,$5 }' | sed -E 's/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/'

Здравствуйте, есть еще такой датчик
13:16:11 LOG:  <chat target="MD-Garage" checkid="AC:2F:45:A5:FF:38">Motion Detect!</chat>

Обрабатываясь данной командой он становится такой
13:16 "MD-Garage" Motion

Как я успел разобраться, это из-за того, что есть пробел между Motion Detect! , а в awk задается 1,4 и 5 поля. И вроде бы логично на этот случай было бы добавить 6-й, но... Я попробовал запустить вообще без awk, только  так

grep -w chat  home.log | sed -E 's/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3/'

И он выдал все правильно (убрал пока °C, чтоб не накладывались на MD)
11:26 "MD-Garage" Motion Detect!

Вопрос, а нужно ли тогда обязательно использовать AWK, если и без него работает ?

Пользователь добавил сообщение 31 Марта 2018, 12:00:07:
    Каким способом можно следить без моего участия за этим логом, чтоб когда там появляется новая запись с этим chat'ом, она обрабатывалась той большой тройной командой, вставлялась в TG вместо ZZZZ и выполнялась отправка ?

Я не до конца понял, что и куда у вас приходит.

Сильно не пингуйте, я только учусь ;))


Я сделал телеграм-бота, и скрипт .sh
#!/bin/bash
curl "https://api.telegram.org/bot123456789:XXXXXXXXXXXXXXXXXXXXXXXXXX/sendMessage" -d 'chat_id=123456789&language_code=ru-RU&text=ZZZZZ'

добавил этот скрипт в cron (запуск каждые 10 минут). Теперь мне каждые 10 минут приходит сообщение в мой телеграмм с текстом ZZZZZ

Теперь пытаюсь понять как сделать так, чтоб вместо этих zzzzz приходил обработанный текст с лога. В идеале, конечно, нужно чтоб по температурам в доме не всегда шли, а только когда наступает "kernel panic" в доме ;) то есть, когда есть движение, или температура в доме стала меньше 10 градусов. Но это как, я понял , уже программа простенькая должна быть (на сравнение). Мне бы пока с азами разобраться ;)))

Спасибо ВСЕМ за ответы!


« Последнее редактирование: 31 Марта 2018, 12:02:29 от DZ333817 »

Оффлайн Длиннорогий

  • Активист
  • *
  • Сообщений: 257
    • Просмотр профиля
Вопрос, а нужно ли тогда обязательно использовать AWK, если и без него работает ?
Не обязателен там awk, я просто скопировал всю команду, когда тестировал у себя. Забыл убрать.

Чтобы вместо ZZZZZ были строки лога с распарсенными выше значениями, просто добавьте перед curl переменную вроде:
data=$(sed -E '/chat/!d;s/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/' /path/to/home.log)
и используйте ее в curl:
curl "https://api.telegram.org/bot123456789:XXXXXXXXXXXXXXXXXXXXXXXXXX/sendMessage" -d 'chat_id=123456789&language_code=ru-RU&text="$data"'
А чтобы не получать весь лог, а только сообщения, которые вы до этого не получали, можно или, как предложил Azure, высчитывать кол-во строк, или парсить время и переводить для удобства в эпоху, например, и передавать по заданному времени. 

Оффлайн DZ333817

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Чтобы вместо ZZZZZ были строки лога с распарсенными выше значениями, просто добавьте перед curl переменную вроде:
Код: [Выделить]

data=$(sed -E '/chat/!d;s/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/' /path/to/home.log)

и используйте ее в curl:
Код: [Выделить]

curl "https://api.telegram.org/bot123456789:XXXXXXXXXXXXXXXXXXXXXXXXXX/sendMessage" -d 'chat_id=123456789&language_code=ru-RU&text="$data"'


Так он почему-то не видит $data. Видимо потому, что он в кавычках... Но нашел другой способ, рабочий!!! ;)

#!/bin/bash

TOKEN=123456789:XXXXXXXXXXXXXXXXXXXXXXXXXX
CHAT_ID=123456789
DATA=$(sed -E '/chat/!d;s/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3/' home.log)
URL="https://api.telegram.org/bot$TOKEN/sendMessage"

curl -s -X POST $URL -d chat_id=$CHAT_ID -d text="$DATA"
Так все приходит как надо, проверил, даже русский текст виден, если понадобится в дальнейшем.




Оффлайн Длиннорогий

  • Активист
  • *
  • Сообщений: 257
    • Просмотр профиля
Так он почему-то не видит $data. Видимо потому, что он в кавычках... Но нашел другой способ, рабочий!!! ;)
Да, я не увидел одинарные кавычки. У вас верно.

Оффлайн DZ333817

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Намного проще с определенной периодичностью проверять лог на наличие новых записей, например сохраняя количество строк после последней проверки и выводя те, чьи номера больше зафиксированного

А не подскажите,  какими командами это делается?

Я тут что подумал, есть 3 датчика температуры и 2 датчика движения (но их пока особо не учитываю, так как пока не могу понять сделать так, чтоб они сразу слали в телеграм.
3 датчика пишут данные каждые 10 минут, то есть 3 x 6  = 18 записей в час, или 18 x 3 = 54 записи за 3 часа.

Можно поставить в кроне отправку данных пока каждые 3 часа, Но как фильтровать записи за последние 3 часа, ведь лог будет содержать и мусор тоже, а мне, получается, надо сначала отфильтровать записи с ЧАТ'ом, а потом взять последние 54 или более именно ЧАТ-строки для передачи в TG ?!?!

А еще понять не могу, для чего этот знак ^ в выражении ^([0-9]+:[0-9]+) ?! Он сообщает с чего начинается новая строка (в моем случае, с цифр от 0 до 9, потом ":", потом опять эти цифры и т.д.) ?
СПАСИБО!

Оффлайн Длиннорогий

  • Активист
  • *
  • Сообщений: 257
    • Просмотр профиля
А еще понять не могу, для чего этот знак ^ в выражении ^([0-9]+:[0-9]+) ?! Он сообщает с чего начинается новая строка (в моем случае, с цифр от 0 до 9, потом ":", потом опять эти цифры и т.д.) ?
Выражение
^([0-9]+:[0-9]+)
означает, что нужно из начала строки дважды взять сочетание из одной или больше цифр, разделяемое двоеточием, и использовать как первый шаблон в выводе:
\1


Можно поставить в кроне отправку данных пока каждые 3 часа, Но как фильтровать записи за последние 3 часа, ведь лог будет содержать и мусор тоже, а мне, получается, надо сначала отфильтровать записи с ЧАТ'ом, а потом взять последние 54 или более именно ЧАТ-строки для передачи в TG ?!?!
Если вы хотите получать каждые три часа сразу все распарсенные строки с температурами, которые были получены за эти последние три часа, вы можете просто взять последние 3*6*3=54 строки командой:
tail -54 /path/to/logи применять команду парсинга к этим строкам.
« Последнее редактирование: 31 Марта 2018, 20:27:10 от Длиннорогий »

Оффлайн DZ333817

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Если вы хотите получать каждые три часа сразу все распарсенные строки с температурами, которые были получены за эти последние три часа, вы можете просто взять последние 3*6*3=54 строки командой:
Код: [Выделить]

tail -54 /path/to/log

и применять команду парсинга к этим строкам.


Да, но ведь тогда функция tail берет последние 54 строки из ОБЩЕГО лога с кучей ненужной информации, а меня интересует именно 54 строки которые получатся после применения grep -w chat home.log. Как я понял, в SED нельзя прописать, чтоб она вывела только последние 54 записи с CHAT'ом из всего, что найдет в общем файле ?!

Так (tail -54 home.log | sed '/chat/! d;s/:.. [^"]*"/ /;s/".*">/\t/;s/<.*//') он получается делает выборку только из последних 54 строк, в коротой CHAT'a может и не быть вовсе :(  ,а надо чтоб он выводил 54 строки после SED'а (то есть 54 последние строчки с CHAT'ом)

Спасибо еще раз ОГРОМНОЕ!
« Последнее редактирование: 31 Марта 2018, 20:47:57 от DZ333817 »

Оффлайн Длиннорогий

  • Активист
  • *
  • Сообщений: 257
    • Просмотр профиля
он получается делает выборку только из последних 54 строк, в коротой CHAT'a может и не быть вовсе :(  ,а надо чтоб он выводил 54 строки после SED'а (то есть 54 последние строчки с CHAT'ом)
Я вас не правильно понял. Подумал, что у в сумме всего лога на 54 строки за три часа. Если 54 строки с температурами, а всего строк больше, тогда можно грепнуть из всего лога все строки с температурой, а потом уже выбирать те самые 54:
grep -w chat | tail -54 | ...При этом можно будет опустить поиск подстроки в sed
sed -E 's/^([0-9]+:[0-9]+).*target=(.+ ).*>(.+)<\/.*/\1 \2\3°C/'
« Последнее редактирование: 31 Марта 2018, 21:08:45 от Длиннорогий »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Вы же вообще писали про предельные значения? Так сразу ставьте проверку на интервал температуры например и отправляйте как вышли из диапазона.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.087 секунд. Запросов: 23.