Пользовательский формат для команды времени - PullRequest
68 голосов
/ 10 сентября 2010

Я хотел бы использовать команду time в bash-скрипте , чтобы вычислить истекшее время сценария и записать его в файл журнала. Мне нужно только в реальном времени , а не пользователь и sys. Тоже нужно в приличном формате. например, 00: 00: 00: 00 (не похоже на стандартный вывод). Я ценю любой совет.

Ожидаемый формат: 00:00:00.0000 (миллисекунды) [часы]: [минуты]: [секунды]. [Миллисекунды]

У меня уже есть 3 сценария. Я видел такой пример:

{ time { # section code goes here } } 2> timing.log

Но мне нужно только реальное время, а не пользователь и sys. Тоже нужно в приличном формате. например, 00:00:00:00 (не похоже на стандартный вывод).

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

Ответы [ 5 ]

87 голосов
/ 10 сентября 2010

Вы можете использовать команду 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 & ndash; Внимание: не ставьте пробелы перед минус - , так как это может быть интерпретировано как параметр командной строки.

Смотри также: http://tldp.org/LDP/abs/html/arithexp.html

EDIT:
Кроме того, вы можете взглянуть на sed , чтобы искать и извлекать подстроки из вывода, сгенерированного за time .

РЕДАКТИРОВАТЬ:

Пример для синхронизации с миллисекундами (на самом деле наносекунды, но усеченные здесь до миллисекунд). Ваша версия 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))"

но это было отредактировано, потому что, по-видимому, оно не работало для некоторых людей, в то время как новая версия по сообщениям работала. Я не одобрил это, потому что я думаю, что вы должны использовать только остаток, но был лишен права голоса.
Выберите то, что вам подходит.

40 голосов
/ 10 сентября 2010

Из справочной страницы для времени :

  1. Может быть встроенная оболочка, вызываемая по времени, избегайте этого, указав /usr/bin/time
  2. Вы можете указать строку формата, и один из параметров форматирования истек время - например, %E

    /usr/bin/time -f'%E' $CMD

Пример:

$ /usr/bin/time -f'%E' ls /tmp/mako/
res.py  res.pyc
0:00.01
38 голосов
/ 10 сентября 2010

Чтобы использовать встроенную функцию Bash time вместо /bin/time, вы можете установить эту переменную:

TIMEFORMAT='%3R'

, которая будет выводить в реальном времени следующее:

5.009

или

65.233

Число определяет точность и может варьироваться от 0 до 3 (по умолчанию).

Вы можете использовать:

TIMEFORMAT='%3lR'

для получения выходных данныхэто выглядит так:

3m10.022s

l (ell) дает длинный формат.

29 голосов
/ 13 марта 2012

Используйте встроенную переменную bash SECONDS. Каждый раз, когда вы ссылаетесь на переменную, она возвращает время, прошедшее с момента вызова скрипта.

Пример:

echo "Start $SECONDS"
sleep 10
echo "Middle $SECONDS"
sleep 10
echo "End $SECONDS"

Выход:

Start 0
Middle 10
End 20
2 голосов
/ 10 сентября 2010

Не совсем уверен, что вы спрашиваете, вы пробовали:

time yourscript | tail -n1 >log

Изменить: хорошо, так что вы знаете, как получить время, и вы просто хотите изменить формат. Было бы полезно, если бы вы описали, какой формат вы хотите, но вот несколько вещей, которые нужно попробовать:

time -p script

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

time -p script | tail -n 3 | head -n 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...