powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell script (определить промежуток времени)
3 сообщений из 3, страница 1 из 1
shell script (определить промежуток времени)
    #38848790
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Нужно определить промежуток времени между записями.

Пример:
USER1 18:20 login
USER2 18:20 login
USER2 19:35 logout
USER3 20:00 login
USER3 20:01 logout
USER1 21:30 logout

Хочу получить (вторая колонка - время login):
USER1 18:20 3h10m
USER2 18:20 1h15m
USER3 20:00 1m

Не могу придумать способ как бы это сделать. Помогите, пожалуйста.
...
Рейтинг: 0 / 0
shell script (определить промежуток времени)
    #38848846
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey10,
не обрабатывает ситуации когда
- во входном файле данные более чем за одни сутки (например login 23:10, logout 00:04)
- есть logout без предшествующего login
- есть login без слудующего после него logout

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
#!/bin/bash

# #########################################################################
# параметры: нет
# имя файла для обработки - в константе INFILE
# вывод в формате `{имя} {время первого логина} {длительность}`
# перед 'основным' выводом может ругаться `ERR: line# {номер строки}, {сообщение}`
# на 'неправильные' строки обрабатываемого файла

m2hm () { #минуты --> часы,минуты
    local -i _M=$1 _H
    
    (( _H = _M /60, _M -= _H*60 ))

    echo ${_H}h${_M}m
}

time2m () { #время в формате 'hh:mm' --> кол-во минут от полуночи
    local _S=${1#*:}
    local -i _M
    
    _S=${_S#0}
    _M=$_S
    
    _S=${1%:*}
    _S=${_S#0}
    
    (( _M += _S*60 ))
    
    echo $_M
}


# 
# main
#

# файл с данными для обработки
declare -r INFILE='usrlog.txt'

declare -i LN=0 MINUTES
declare -A FLOGIN LLOGIN DURATION
declare KEY USRNAME LOGTIME OPERATION

# read log and do calculations
while read USRNAME LOGTIME OPERATION; do
  (( LN++ ))

  if [[ -z $USRNAME ]]; then
    continue

  elif [[ -z $LOGTIME || -z $OPERATION ]]; then
    echo ERR: line# $LN, invalid number of fields

  else
    case $OPERATION in
      login)
        LLOGIN[$USRNAME]=$LOGTIME
        [ -z ${FLOGIN[$USRNAME]} ] && FLOGIN[$USRNAME]=$LOGTIME
        ;;
      logout)
        MINUTES=`time2m $LOGTIME`
        (( MINUTES -= `time2m ${LLOGIN[$USRNAME]}`, DURATION[$USRNAME] += MINUTES ))
        ;;
      *)
        echo ERR: line# $LN, invalid operation
    esac
  fi
done < "$INFILE"

# show results
for KEY in ${!DURATION[@]}; do
  echo $KEY ${FLOGIN[$KEY]} `m2hm ${DURATION[$KEY]}`
done

...
Рейтинг: 0 / 0
shell script (определить промежуток времени)
    #38849102
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,

спасибо!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell script (определить промежуток времени)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]