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

Я использую команду 'tee' для записи результатов длинной команды bash в файл.

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

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

2 ответа

Если tee не может что-то сделать, передайте это программе, которая это делает. У moreutils есть инструмент с именем ts чья цель именно это:

тест $ echo | Т.С.
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.)

Альтернатива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"
Другие вопросы по тегам