Можете ли вы ставить перед каждой строкой префикс tee текущую дату и время?

Можете ли вы ставить перед каждой строкой префикс tee текущую дату и время?

Я использую команду «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"

Связанный контент