Во-первых, если вы ожидаете, что эти временные метки действительно представляют событие, имейте в виду, что, поскольку многие программы выполняют буферизацию строки (некоторые более агрессивно, чем другие), важно думать об этом как о времени, близком к исходной линии. был напечатан, а не отметка времени происходящего действия.
Вы также можете проверить, что в вашей команде еще нет встроенной функции, предназначенной для этого. Например, ping -D
существует в некоторых ping
версиях и печатает время с эпохи Unix перед каждой строкой. Однако, если ваша команда не содержит своего собственного метода, есть несколько методов и инструментов, которые можно использовать, среди прочего:
Оболочка POSIX
Имейте в виду, что, поскольку многие оболочки хранят свои строки внутри себя как cstrings, если вход содержит нулевой символ ( \0
), это может привести к преждевременному завершению строки.
command | while IFS= read -r line; do printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done
GNU awk
command | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'
Perl
command | perl -pe 'use POSIX strftime; print strftime "[%Y-%m-%d %H:%M:%S] ", localtime'
питон
command | python -c 'import sys,time;sys.stdout.write("".join(( " ".join((time.strftime("[%Y-%m-%d %H:%M:%S]", time.localtime()), line)) for line in sys.stdin )))'
Рубин
command | ruby -pe 'print Time.now.strftime("[%Y-%m-%d %H:%M:%S] ")'