Приношу свои извинения, если это слишком просто, но у меня есть журнал с такой информацией:

Mai  5 12:34:00 xoengine XO[1287]: [Xo|xoengineMain.cpp:122|0xb88ec60] starting xoengine 4.0.1.2 (x86) from [/usr/bin/xoengine]
Mai  5 12:35:00 xoengine XO[1287]: [Xo|DataStorage.cpp:1370|0xb88ec60] loading database [/var/xoengine/xoengine.db]
Mai  5 12:35:10 xoengine XO[1287]: [Xo|DataStorage.cpp:2043|0xb88ec60] database loaded in 40ms
Mai  5 12:37:00 xoengine XO[1287]: [Xo|xoengineMain.cpp:318|0xb88ec60] xoengine is running
Mai  7 10:32:00 xoengine XO[1287]: [Xo|xoengineMain.cpp:122|0xb88ec60] starting xoengine 4.0.1.2 (x86) from [/usr/bin/xoengine]
Mai  7 10:32:58 xoengine XO[1287]: [Xo|xoengineMain.cpp:152|0xb88ec60] demo licensed for 5 machines expiring on 2017-10-04
Mai  7 10:33:00 xoengine XO[1287]: [Xo|xoengineMain.cpp:318|0xb88ec60] xoengine is running

Мое намерение получить что-то вроде этого:

    Cycle: 1 Duration: 00:03:00
    Cycle: 2 Duration: 00:01:00
    ...

время рассчитывается на основе нахождения в строках слов "запуск" и "бег" и, таким образом, вычисляется время, которое потребовалось между "стартом" и "бегом". Спасибо

1 ответ1

0

Я проверил этот код, который я написал, и он работает:

#!/bin/bash

logfile="/var/log/file.log"
countStart=0
countStop=0

getDuration()
{
  read -r h m s <<< $(echo $1 | tr ':' ' ' )
  echo $(((h*60*60)+(m*60)+s))
}

while read line; do

   if [[ $line =~ 'starting xoengine' ]]; then
      starting=`echo $line | awk '{print $3}'`
      START=$(getDuration $starting)
      let countStart+=1
   elif [[ $line =~ 'xoengine is running' ]]; then
      stopping=`echo $line | awk '{print $3}'`
      STOP=$(getDuration $stopping)
      let countStop+=1
   fi

   if [ $countStart -eq $countStop ] && [ $countStop -ne 0 ]; then
      DIFF=$((STOP-START))
      echo "Cycle $countStart Duration: $((DIFF/60))m $((DIFF%60))s"
   fi

done < $logfile

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .