LINUX.ORG.RU

Поиск и обработка текста в Linux

 , ,


0

2

Здравствуйте форумчане ! :)) пожалуйста помогите решить головоломку

есть лог файл «SRV22_09_0.LOG» (который ротируется и создает новый «SRV22_10_0.LOG» каждый месяц) состоящий из строк:

09.09.2022 16:51:20 CONSOLA:9
09.09.2022 16:51:23 Init Com Eth(0):192.168.103.10:14101
09.09.2022 16:51:23 Open communication port
09.09.2022 16:51:24 Trying to establish communication with the controller
09.09.2022 16:51:24 KIT: GK7C-3 VERSION: V9.18 CPU NUMBER: CPA275595
09.09.2022 16:51:25 Established communication
09.09.2022 16:51:25 Sending date and hour
09.09.2022 16:51:26 COMMUNICATION: The controller has been synchronized.
09.09.2022 16:51:27 Receiving supplies
09.09.2022 16:52:25 Supplies correctly received
09.09.2022 16:52:27 Processed
09.09.2022 16:52:27 Sending users
09.09.2022 16:52:52 Users correctly sent
09.09.2022 16:52:52 Sending vehicles
09.09.2022 16:53:06 Vehicles correctly sent
09.09.2022 16:53:06 Sending controller configuration
09.09.2022 16:53:08 Controller configuration correctly sent
09.09.2022 16:53:08 Sending product configuration
09.09.2022 16:53:10 Product configuration correctly sent
09.09.2022 16:53:10 Sending tank configuration
09.09.2022 16:53:11 Tank configuration correctly sent
09.09.2022 16:53:11 Sending hose configuration
09.09.2022 16:53:13 Hose configuration correctly sent
09.09.2022 16:53:14 Disconnecting the controller
09.09.2022 16:53:15 Disconnected controller
09.09.2022 16:53:15 Close communication port
09.09.2022 16:53:15 CONSOLA:10
09.09.2022 16:53:18 Init Com Eth(0):192.168.105.10:14101
09.09.2022 16:53:19 Error init ethernet(0): Connect timed out.
09.09.2022 16:53:38 Init Com Eth(10):192.168.105.10:14101
09.09.2022 16:53:39 Error init ethernet(10): Connect timed out.
09.09.2022 16:53:59 Init Com Eth(20):192.168.105.10:14101
09.09.2022 16:54:00 Error init ethernet(20): Connect timed out.
09.09.2022 16:54:03 COMMUNICATION: It is not possible to open COM port. Ethernet:192.168.105.10:14101
09.09.2022 16:54:04 Disconnected controller
09.09.2022 16:54:04 Close communication port
09.09.2022 17:00:46 CONSOLA:3
09.09.2022 17:00:49 Init Com Eth(0):192.168.240.1:14101
09.09.2022 17:00:50 Error init ethernet(0): Socket Error # 10061
Connection refused.
09.09.2022 17:01:09 Init Com Eth(10):192.168.240.1:14101
09.09.2022 17:01:11 Error init ethernet(10): Socket Error # 10061
Connection refused.
09.09.2022 17:01:31 Init Com Eth(20):192.168.240.1:14101
09.09.2022 17:01:32 Error init ethernet(20): Socket Error # 10061
Connection refused.
09.09.2022 17:01:35 COMMUNICATION: It is not possible to open COM port. Ethernet:192.168.240.1:14101
09.09.2022 17:01:36 Disconnected controller
09.09.2022 17:01:36 Close communication port

мне нужно вытащить с этого файла блок последнего текста между строками, пример:
1-ая строка:
09.09.2022 16:51:24 KIT: GK7C-3 VERSION: V9.18 CPU NUMBER: CPA275595
последняя строка:
09.09.2022 16:53:13 Hose configuration correctly sent

это команда смотрит последние 45 строк:
tail -45 SRV22_09_0.LOG | awk '/CPA275595/,/Hose/' | grep -P "been synchronized|correctly sent|correctly received|CPA275595"

и если в них содержится данный блок то соответственно выводится на экран:
12.09.2022 16:30:01 KIT: GK7C-3 VERSION: V9.18 CPU NUMBER: CPA275429
12.09.2022 16:30:03 COMMUNICATION: The controller has been synchronized.
12.09.2022 16:31:01 Supplies correctly received
12.09.2022 16:31:27 Users correctly sent
12.09.2022 16:31:40 Vehicles correctly sent
12.09.2022 16:31:41 Controller configuration correctly sent
12.09.2022 16:31:43 Product configuration correctly sent
12.09.2022 16:31:44 Tank configuration correctly sent
12.09.2022 16:31:45 Hose configuration correctly sent

но проблема в том что очень часто в последние 45 строк попадает другие данные и соответственно ничего не выводится!
Какое есть решение данного вопроса?????
и еще файл каждый месяц ротируется и создает новый с новым названием и как-то не айс раз в месяц переделывать команду



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

Что-то вроде:

grep -n 'CPU NUMBER: CPA275595\|Hose configuration correctly sent' SRV22_09_0.LOG  | tail -n 2 > /tmp/str_pos
FSTR=`sed -n '1p' /tmp/str_pos | cut -f1 -d":"`
LSTR=`sed -n '2p' /tmp/str_pos | cut -f1 -d":"`
sed -n "$FSTR,$LSTRP" SRV22_09_0.LOG

В начале посредством grep выбираем из файла все строки с текстом начальной и конечной строки и сохраняем во временный файл /tmp/str_pos.

Вывод grep будет примерно такой:

100:12.09.2022 16:30:01 KIT: GK7C-3 VERSION: V9.18 CPU NUMBER: CPA275429
120:12.09.2022 16:31:45 Hose configuration correctly sent

Затем в переменные FSTR и LSTR помещаем номера строк, в примере 100 и 120.

Затем посредством sed выбираем из файла строки с номерами с 100 по 120.

Но здесь нужно добавить проверку, что строки «12.09.2022 16:31:45 Hose configuration correctly sent» теоретически может не быть. Поэтому в этом случае в файле /tmp/str_pos номер последней строки будет меньше номера начальной строки.

В этом случае sed выведет только одну строку, с большим номером.

Доработай проверку сам.

и создает новый с новым названием и как-то не айс раз в месяц переделывать команду

Если имя файла формируется по маске SRV22_09_0.LOG, то можешь использовать команду date для формирования маски

date '+SRV%y_%m_0'
FNAME=`date '+SRV%y_%m_0.LOG'`

Используй определение переменной с именем входного файла.

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

Вывод grep получился такой:
5:09.09.2022 16:51:24 KIT: GK7C-3 VERSION: V9.18 CPU NUMBER: CPA275595
23:09.09.2022 16:53:13 Hose configuration correctly sent

команда sed вернула ошибку:
sed: -e выражение #1, символ 2: непредвиденный символ «,»

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

sed -n «$FSTR,$LSTRP» SRV22_09_0.LOG
как я понял здесь опечатка в букве P
поправил но sed так же возвращает ошибку
sed: -e выражение #1, символ 4: отсутствует команда

Ramil94
() автор топика
Ответ на: комментарий от Ramil94
grep -n 'CPU NUMBER:\|Hose configuration correctly sent' SRV22_09_0.LOG  | tail -n 2 > /tmp/str_pos
FSTR=`sed -n '1p' /tmp/str_pos | cut -f1 -d":"`
LSTR=`sed -n '2p' /tmp/str_pos | cut -f1 -d":"`
sed -n "${FSTR},${LSTR}p" SRV22_09_0.LOG
kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Да все заработало
но есть огромная проблема, блоки текста в файле повторяются
так как контроллер может обновится и 2 и три раза
как быть в этой ситуации

Заранее благодарю добрый человек :)))

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

нужны последние данные
скажем так: контроллер сначала обновился утром потом в обед а потом вечером, соответственно нужны актуальные (вечерние) данные, а не промежуток, с утра до вечера !

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

А подумать? Вместо:

FSTR=`sed -n '1p' /tmp/str_pos | cut -f1 -d":"`
LSTR=`sed -n '2p' /tmp/str_pos | cut -f1 -d":"`

делай:

FSTR=`tail -n2 /tmp/str_pos | sed -n '1p' | cut -f1 -d":"`
LSTR=`tail -n2 /tmp/str_pos | sed -n '2p' | cut -f1 -d":"`

Это если втупую. Еще можешь почитать man sed и доработать его(сразу брать из двух последних строк), избавившись от лишнего tail.

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

Пошел немного другим путем !
grep -P 'CONSOLA|CPU NUMBER:|been synchronized|correctly' /mnt/share_ges/SRV22_09_0.LOG | grep -B9 'Hose configuration correctly sent' > testlog2.log
tail -n 10 testlog2.log | awk '/CPA275595/,/Hose configuration correctly sent/'

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

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

#!/bin/sh
nameGLX01=«URAL 95-78 AGD»
nameGLX02=«KAMAZ 43-93 AGF»
cpaGLX01=«CPA275430»
cpaGLX02=«CPA275429»
fileGLX01=«/mnt/share_ges/CPA/GLX01.log»
fileGLX02=«/mnt/share_ges/CPA/GLX02.log»
LOGFILE=«/mnt/share_ges/SRV`date +»%y"`_`date +«%m»`_0.LOG"
ALLCPA=«/mnt/share_ges/CPA/allcpa_tmp.log»
grep -P 'CONSOLA|CPU NUMBER:|been synchronized|correctly' $LOGFILE | grep -B9 'Hose configuration correctly sent' > $ALLCPA
sleep 1
tail -n 10 $ALLCPA | grep -icE $cpaGLX01 > $fileGLX01
tail -n 10 $ALLCPA | grep -icE $cpaGLX02 > $fileGLX02
tail -n 10 $ALLCPA
sleep 1
echo `date +«%d.%m.%C%y %T»` GLX01 `cat $fileGLX01` : $nameGLX01
echo `date +«%d.%m.%C%y %T»` GLX02 `cat $fileGLX02` : $nameGLX02
exit

Решил вопрос таким образом
Все это дело планировалось для Zabbix
В Zabbix Мониторится сервер где синхронизируются контроллеры, он смотрит файлы на сервере для каждого контроллера если в файле цифра 1 то успешная синхронизация, если 0 то неуспешная !

Если честно сервер Gespasa собирает логи ну по моему мнению чересчур дотошно, сделали бы по мимо дотошности, еще одну строчку с номером контроллера и успешной синхронизацией !

Всем спасибо тема может быть закрыта !

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