Я хотел бы добавить к моему iostat
выход для устройства sda с отметкой времени. Г-м-д H: M: S хватит. Однако это не кажется таким простым. Моя первая попытка была простой:
# vi just_echo
mystamp=$(date '+%Y-%m-%d %H:%M:%S')
cat /dev/stdin | grep sda | sed "s/sda/$mystamp/"
# iostat 5 | ./just_echo
Однако это не дает никакого вывода. Если я удалю sed
Я получаю некоторую информацию, но что здесь происходит?
Согласно https://meta.stackexchange.com/questions/172307/duplicate-questions-on-other-se-sites
На вопрос дан ответ Вот.
Moreutils включает ts
что делает это довольно хорошо:
command | ts '[%Y-%m-%d %H:%M:%S]'
Это также устраняет необходимость в цикле, каждая строка вывода будет иметь отметку времени.
$ echo -e "foo\nbar\nbaz" | ts '[%Y-%m-%d %H:%M:%S]'
[2011-12-13 22:07:03] foo
[2011-12-13 22:07:03] bar
[2011-12-13 22:07:03] baz
Вы хотите знать, когда этот сервер снова заработал, вы перезапустили? Просто беги ping | ts
, проблема решена: D.
Если вы хотите, чтобы разные методы не использовали ts
:
Имейте в виду, что, поскольку многие оболочки хранят свои строки внутри как cstrings, если вход содержит нулевой символ (\0
), это может привести к преждевременному завершению линии.
command | while IFS= read -r line; do printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done
command | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'
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] ")'