Пользовательский формат для команды времени

Я хотел бы использовать команду время в 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