Можете ли вы поставить перед каждой строкой, написанной с помощью 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"