В итоге я написал небольшой скрипт для этого на Python, но мне было интересно, есть ли какая-нибудь утилита, в которую вы могли бы вводить текст, которая бы добавляла в каждую строку какой-то текст - в моем конкретном случае - метку времени. В идеале использование будет примерно таким:
cat somefile.txt | prepend-timestamp
(Прежде чем ответить на sed, я попробовал это:
cat somefile.txt | sed "s/^/`date`/"
Но это только оценивает команду date один раз, когда sed выполняется, поэтому одна и та же временная метка неправильно добавляется к каждой строке.)
cat somefile.txt
немного "вводит в заблуждение"? Я ожидаю, что это произойдет «сразу» и будет иметь одну временную метку. Разве это не будет лучшей тестовой программой(echo a; sleep 1; echo b; sleep 3; echo c; sleep 2)
?Ответы:
Можно попробовать с помощью
awk
:Вам может потребоваться убедиться, что он
<command>
производит вывод с буферизацией строки, т.е. он сбрасывает свой поток вывода после каждой строки;awk
добавление временной метки будет временем появления конца строки в ее входном канале.Если awk показывает ошибки, попробуйте
gawk
вместо этого.источник
gawk
и использовать это вместоawk
. Если у вас есть MacPorts:sudo port install gawk
awk
сstrftime()
точностью до миллисекунды. Однако вы можете использоватьdate
команду. В основном вы просто обрезаете наносекунды до трех символов. Это будет выглядеть следующим образом :COMMAND | while read -r line; do echo "$(date '+%Y-%m-%d %T.%3N') $line"; done
. Обратите внимание, что вы можете сократить% H:% M:% S с помощью% T. Если вы все еще хотите использоватьawk
по какой-либо причине, вы можете сделать следующее:COMMAND | awk '{ "date +%Y-%m-%d\\ %T.%3N" | getline timestamp; print timestamp, $0; fflush(); }'
ts
от moreutils будет предварять метку времени в каждой строке ввода вы даете ему. Вы также можете отформатировать его, используя strftime.Чтобы установить это:
источник
bad command 2>&1 | ts
результатJan 29 19:58:31 -bash: bad: command not found
2014 Mar 21 18:07:28
. Как мне это получить?strftime
строку формата в качестве аргумента:,[.. command ..] | ts '%Y %b %d %T'
например.brew install moreutils
. Чтобы вывести UTC, вы можете установить TZ локально, напримерls -l |TZ=UTC ts '%Y-%m-%dT%H:%M:%SZ'
ruby -e "puts 1; STDOUT.flush; sleep 1; puts 2; STDOUT.flush; sleep 2; puts 3" | ts '%F %T'
аннотировать , доступно по этой ссылке или как
annotate-output
вdevscripts
пакете Debian .источник
Перегонка приведенных ответов к простейшему из возможных:
В Ubuntu они поступают из пакетов ожидаемых-разработчиков и moreutils.
источник
expect
не такexpect-dev
, но последний тянет в первом, так что это работает. (Ubuntu 14.10, мне интересно, был ли бинарный файл перенесен в другой пакет в какой-то момент.)expect-dev
unbuffer $COMMAND | ts -s %.s
(-s
если для истекшего времени и%.s
для времени в секундах с дробной частью)Как насчет этого?
Судя по вашему желанию получить живые метки времени, может быть, вы хотите сделать живое обновление файла журнала или чего-то еще? Может быть
источник
tail -f /path/to/log | perl -pne 'use POSIX qw(strftime); print strftime "%Y-%m-%dT%H:%M:%SZ ", gmtime();'
получал дату в стиле ISO8601 / RFC3339 вместо wacko, которую выдает более простая версия.BEGIN { $|++; }
перед оператором печати, чтобы Perl сбрасывал вывод с каждой строки.ls | perl -pne 'print localtime." "'
. Скалярное преобразование происходит из-за конкатенации строк.-p
и-n
варианты? Кажется,-n
это избыточно, если вы указали-p
.Будет бросить это там: есть пара утилита в DaemonTools называемых tai64n и tai64nlocal , которые сделаны для предваряя метки времени для регистрации сообщений.
Пример:
источник
Ответ Киерона пока самый лучший. Если у вас возникли проблемы из-за того, что первая программа буферизирует ее, вы можете использовать программу unbuffer
Он устанавливается по умолчанию в большинстве систем Linux. Если вам нужно собрать его самостоятельно, это часть ожидаемого пакета
http://expect.nist.gov
источник
Используйте команду read (1), чтобы читать по одной строке за раз из стандартного ввода, затем выведите строку с добавленной датой в выбранном вами формате, используя date (1).
источник
Я не парень из Unix, но я думаю, что вы можете использовать
источник
источник
Вот мое решение awk (из системы Windows / XP с установленными MKS Tools в каталоге C: \ bin). Он предназначен для добавления текущей даты и времени в форме мм / дд чч: мм к началу каждой строки, извлекшей эту временную метку из системы при чтении каждой строки. Конечно, вы можете использовать шаблон BEGIN, чтобы получить временную метку один раз и добавить эту временную метку к каждой записи (все то же самое). Я сделал это, чтобы пометить файл журнала, который был сгенерирован, на стандартный вывод временной меткой во время создания сообщения журнала.
/"pattern"/ "C\:\\\\bin\\\\date '+%m/%d %R'" | getline timestamp;
print timestamp, $0;
где «pattern» - это строка или регулярное выражение (без кавычек) для сопоставления во входной строке, и необязательно, если вы хотите сопоставить все входные строки.
Это должно работать и в системах Linux / UNIX, просто избавьтесь от C \: \\ bin \\, оставив строку
Это, конечно, предполагает, что команда date возвращает вас к стандартной команде Linux / UNIX date display / set без конкретной информации о пути (то есть переменная PATH вашей среды правильно настроена).
источник
Смешивая некоторые ответы выше от natevw и Frank Ch. Eigler.
Он имеет миллисекунды, работает лучше, чем вызов внешней
date
команды каждый раз, и perl можно найти на большинстве серверов.Альтернативная версия с промывкой и чтением в цикле:
источник
printf "%s+%06d %s", (strftime "%Y-%m-%dT%H:%M:%S", gmtime($s)), $ms, $_;
Вы можете сделать это (с помощью GNU / SED ):
пример:
Конечно, вы можете использовать другие параметры даты программы . просто замените
date +%T
на то, что вам нужно.источник
Ответ caerwyn может быть запущен как подпрограмма, которая предотвратит появление новых процессов в строке:
источник
date
в каждой строке?timestamp() { while read line; do echo "$(date) $line"; done; }; export -f timestamp
в сценарии, который вы используете.date
для каждой строки, попробуйте использоватьprintf
встроенную команду bash в формате % (datepec) T. Так может выглядетьtimestamp() { while IFS= read -r line; do printf "%(%F %T)T %s\n" -1 "$line"; done; }
. Встроенные оболочки не будут появляться. Datespec формат , какstrftime(3)
например ,date
форматы. Это требует bash, не знаю, с какой версии он поддерживает этотprintf
спецификатор.Отказ от ответственности : решение, которое я предлагаю, не является встроенной утилитой Unix.
Я столкнулся с подобной проблемой несколько дней назад. Мне не понравился синтаксис и ограничения вышеупомянутых решений, поэтому я быстро собрал программу на Go, чтобы сделать эту работу за меня.
Вы можете проверить инструмент здесь: preftime
В разделе Releases проекта GitHub есть готовые исполняемые файлы для Linux, MacOS и Windows .
Инструмент обрабатывает неполные выходные строки и имеет (с моей точки зрения) более компактный синтаксис.
<command> | preftime
Это не идеально, но я хотел бы поделиться этим, если это кому-то поможет.
источник
делать это с
date
иtr
иxargs
на OSX:если вы хотите миллисекунды:
но учтите, что в OSX date не дает опции% N, поэтому вам нужно установить gdate (
brew install coreutils
) и, наконец, прийти к следующему:источник
Если значение, которое вы добавляете, одинаково в каждой строке, запустите emacs вместе с файлом, а затем:
Ctrl + <space>
в начале файла (чтобы отметить это место), затем прокрутите вниз до начала последней строки (Alt +> перейдет в конец файла ... что, вероятно, тоже будет включать клавишу Shift, затем Ctrl + а, чтобы перейти к началу этой строки) и:
Ctrl + x r t
Это команда для вставки в только что указанный прямоугольник (прямоугольник шириной 0).
2008-8-21 18:45 <enter>
Или все, что вы хотите добавить ... тогда вы увидите этот текст перед каждой строкой в прямоугольнике шириной 0.
ОБНОВЛЕНИЕ: Я только что понял, что вы не хотите ЖЕ ЖЕ дату, так что это не будет работать ... хотя вы можете сделать это в Emacs с немного более сложным пользовательским макросом, но все же, этот вид редактирования прямоугольника довольно приятно знать о ...
источник