![Можете ли вы ставить перед каждой строкой префикс tee текущую дату и время?](https://rvso.com/image/1520722/%D0%9C%D0%BE%D0%B6%D0%B5%D1%82%D0%B5%20%D0%BB%D0%B8%20%D0%B2%D1%8B%20%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%B9%20%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%20tee%20%D1%82%D0%B5%D0%BA%D1%83%D1%89%D1%83%D1%8E%20%D0%B4%D0%B0%D1%82%D1%83%20%D0%B8%20%D0%B2%D1%80%D0%B5%D0%BC%D1%8F%3F.png)
Я использую команду «tee» для записи результатов длинной команды bash в файл.
Может ли файл, который я выдаю с помощью tee, каким-то образом префиксировать каждую строку с временной меткой, когда строка была написана? Я ищу решение, в котором каждая строка имела бы разное значение даты и времени... а не одно и то же значение, префиксированное в каждой строке.
Причина, по которой я это делаю, заключается в том, что позже, когда я буду читать файл, будет очень полезно знать, когда была отправлена каждая строка, чтобы понять, где находятся медленные области.
решение1
Если tee не может что-то сделать, передайте это программе, которая это может.moreutilsесть инструмент под названием, ts
цель которого заключается именно в этом:
$ эхо-тест | ts 02 фев 13:17:27 тест
Если вы хотите поставить временную меткувсе, использование должно быть очевидным:
myapp | ts | tee app.log
Возможны и другие комбинации; например, для маркировки времени только вывода на экран или только файла журнала:
myapp | tee app.log | ts
myapp | tee >(ts > app.log)
myapp | tee /dev/tty | ts > app.log
myapp | pee "ts > app.log" "cat"
myapp | pee "cat > app.log" "ts"
(Да, последний тоже из moreutils.)
решение2
Альтернатива ts
:
echo "foo" | stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/foo.log"
Выход:
# cat "/tmp/foo.log"
2022-02-24 09:43:00 foo
Пример записи stdout и stderr в файл (удалить /dev/null
также для записи в терминал):
exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/std.log" >/dev/null )
Другая альтернатива с использованием awk
:
echo "foo" | xargs -d'\n' -I{} echo '{}' | awk '{ print strftime("%F %T"), $0; fflush(); }' | tee -a "/tmp/foo.log"