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

Пример:
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
06.01.2015, 04:05
    #38848846
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script (определить промежуток времени)
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
06.01.2015, 13:17
    #38849102
andrey10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell script (определить промежуток времени)
скукотища,

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


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