Пользовательский формат для команды времени
Я хотел бы использовать команду время в bash script, чтобы вычислить прошедшее время script и записать это в журнал файл. Мне нужно только в режиме реального времени, а не пользователь и sys. Также нужен он в приличном формате. например 00: 00: 00: 00 (не как стандартный выход). Я ценю любые советы.
Ожидаемый формат должен быть 00:00:00.0000
(миллисекунды) [часы]: [минуты]: [секунды]. [миллисекунды]
У меня уже 3 скрипта. Я видел такой пример:
{ time { # section code goes here } } 2> timing.log
Но мне нужно только время в реальном времени, а не пользователь и sys. Также нужен он в приличном формате. например 00:00:00:00
(не так, как стандартный вывод).
Другими словами, я хотел бы знать, как превратить время вывода в нечто более легкое для обработки.
Ответы
Ответ 1
Вы можете использовать команду date
, чтобы получить текущее время до и после выполнения задания, которое нужно выполнить, и вычислить разницу, подобную этой:
#!/bin/bash
# Get time as a UNIX timestamp (seconds elapsed since Jan 1, 1970 0:00 UTC)
T="$(date +%s)"
# Do some work here
sleep 2
T="$(($(date +%s)-T))"
echo "Time in seconds: ${T}"
printf "Pretty format: %02d:%02d:%02d:%02d\n" "$((T/86400))" "$((T/3600%24))" "$((T/60%60))" "$((T%60))""
Примечания:
$((...)) может использоваться для базовой арифметики в bash – предостережение: не помещайте пробелы перед минусом -, поскольку это может быть интерпретировано как опция командной строки.
Смотрите также: http://tldp.org/LDP/abs/html/arithexp.html
EDIT:
Кроме того, вы можете посмотреть sed, чтобы искать и извлекать подстроки из результата, сгенерированного время.
ИЗМЕНИТЬ:
Пример для синхронизации с миллисекундами (на самом деле наносекунды, но усеченные до миллисекунд). Ваша версия date
должна поддерживать формат %N
, а bash
должен поддерживать большие числа.
# UNIX timestamp concatenated with nanoseconds
T="$(date +%s%N)"
# Do some work here
sleep 2
# Time interval in nanoseconds
T="$(($(date +%s%N)-T))"
# Seconds
S="$((T/1000000000))"
# Milliseconds
M="$((T/1000000))"
echo "Time in nanoseconds: ${T}"
printf "Pretty format: %02d:%02d:%02d:%02d.%03d\n" "$((S/86400))" "$((S/3600%24))" "$((S/60%60))" "$((S%60))" "${M}"
ОТКАЗ:
Моя оригинальная версия сказала
M="$((T%1000000000/1000000))"
но это было отредактировано, потому что это, по-видимому, не работало для некоторых людей, в то время как, как сообщалось, новая версия. Я не одобрял это, потому что считаю, что вам нужно использовать только оставшуюся часть, но она была отменена.
Выберите все, что вам подходит.
Ответ 2
На странице man для времени:
- Может быть встроенное время вызова оболочки, избегайте этого, указав
/usr/bin/time
-
Вы можете указать строку формата, и одним из вариантов формата является прошедшее время - например. %E
/usr/bin/time -f'%E' $CMD
Пример:
$ /usr/bin/time -f'%E' ls /tmp/mako/
res.py res.pyc
0:00.01
Ответ 3
Используйте встроенную переменную bash SECONDS
. Каждый раз, когда вы ссылаетесь на переменную, она возвращает искомое время с момента вызова script.
Пример:
echo "Start $SECONDS"
sleep 10
echo "Middle $SECONDS"
sleep 10
echo "End $SECONDS"
Выход:
Start 0
Middle 10
End 20
Ответ 4
Чтобы использовать Bash builtin time
, а не /bin/time
, вы можете установить эту переменную:
TIMEFORMAT='%3R'
который выведет текущее время, которое выглядит так:
5.009
или
65.233
Число указывает точность и может варьироваться от 0 до 3 (по умолчанию).
Вы можете использовать:
TIMEFORMAT='%3lR'
чтобы получить вывод, который выглядит следующим образом:
3m10.022s
l
(ell) дает длинный формат.
Ответ 5
Не совсем уверен, что вы просите, вы пробовали:
time yourscript | tail -n1 >log
Изменить: хорошо, поэтому вы знаете, как получить время, и вы просто хотите изменить формат. Это помогло бы, если бы вы описали какой формат вы хотите, но вот некоторые вещи, чтобы попробовать:
time -p script
Это изменяет вывод на одно время на строку в секундах с десятичными знаками. Вам нужно только в реальном времени, а не в двух других, чтобы использовать количество секунд:
time -p script | tail -n 3 | head -n 1