Существует ли утилита Unix для добавления меток времени к стандартному вводу? - PullRequest
165 голосов
/ 22 августа 2008

В итоге я написал небольшой сценарий для этого на Python, но мне было интересно, есть ли утилита, в которую можно вставлять текст, в которой перед каждой строкой будет какой-то текст - в моем конкретном случае - метка времени. В идеале, использование было бы что-то вроде:

cat somefile.txt | prepend-timestamp

(Прежде чем ответить на sed, я попробовал это:

cat somefile.txt | sed "s/^/`date`/"

Но это только оценивает команду date один раз при выполнении sed, поэтому одна и та же временная метка неправильно добавляется к каждой строке.)

Ответы [ 17 ]

2 голосов
/ 27 июня 2017
$ cat somefile.txt | sed "s/^/`date`/"

Вы можете сделать это (с GNU / SED ):

$ some-command | sed "x;s/.*/date +%T/e;G;s/\n/ /g"

пример:

$ { echo 'line1'; sleep 2; echo 'line2'; } | sed "x;s/.*/date +%T/e;G;s/\n/ /g"
20:24:22 line1
20:24:24 line2

Конечно, вы можете использовать другие опции программы Дата . просто замените date +%T на то, что вам нужно.

2 голосов
/ 01 марта 2011

Вот мое решение awk (из системы Windows / XP с установленными в каталоге C: \ bin инструментами MKS). Он предназначен для добавления текущей даты и времени в форме мм / дд чч: мм к началу каждой строки, извлекшей эту временную метку из системы при чтении каждой строки. Конечно, вы можете использовать шаблон BEGIN, чтобы получить временную метку один раз и добавить эту временную метку к каждой записи (все то же самое). Я сделал это, чтобы пометить файл журнала, который был сгенерирован, на стандартный вывод временной меткой во время создания сообщения журнала.

/"pattern"/ "C\:\\\\bin\\\\date '+%m/%d %R'" | getline timestamp;
print timestamp, $0;

где "pattern" - это строка или регулярное выражение (без кавычек), которые должны быть сопоставлены во входной строке, и необязательно, если вы хотите сопоставить все входные строки.

Это должно работать и в системах Linux / UNIX, просто избавьтесь от C \: \\ bin \\, оставив строку

             "date '+%m/%d %R'" | getline timestamp;

Это, конечно, предполагает, что команда date возвращает вас к стандартной команде Linux / UNIX date display / set без конкретной информации о пути (то есть переменная PATH вашей среды правильно настроена).

2 голосов
/ 19 октября 2015

Смешивание некоторых ответов выше от natevw и Frank Ch. Eigler.

Он имеет миллисекунды, работает лучше, чем каждый раз вызывая внешнюю команду date, и perl можно найти на большинстве серверов.

tail -f log | perl -pne '
  use Time::HiRes (gettimeofday);
  use POSIX qw(strftime);
  ($s,$ms) = gettimeofday();
  print strftime "%Y-%m-%dT%H:%M:%S+$ms ", gmtime($s);
  '

Альтернативная версия со сбросом и чтением в цикле:

tail -f log | perl -pne '
  use Time::HiRes (gettimeofday); use POSIX qw(strftime);
  $|=1;
  while(<>) {
    ($s,$ms) = gettimeofday();
    print strftime "%Y-%m-%dT%H:%M:%S+$ms $_", gmtime($s);
  }'
1 голос
/ 25 июня 2017

Отказ от ответственности : предлагаемое мной решение не является встроенной утилитой Unix.

Я столкнулся с подобной проблемой несколько дней назад. Мне не понравился синтаксис и ограничения вышеупомянутых решений, поэтому я быстро собрал программу на Go, чтобы выполнить эту работу за меня.

Вы можете проверить инструмент здесь: Preftime

В разделе Releases проекта GitHub имеются готовые исполняемые файлы для Linux, MacOS и Windows.

Инструмент обрабатывает неполные выходные строки и имеет (с моей точки зрения) более компактный синтаксис.

<command> | preftime

Это не идеально, но я хотел бы поделиться этим, если это кому-нибудь поможет.

1 голос
/ 20 сентября 2013

Ответ Caerwyn может быть запущен как подпрограмма, которая будет препятствовать новым процессам в строке:

timestamp(){
   while read line
      do
         echo `date` $line
      done
}

echo testing 123 |timestamp
0 голосов
/ 18 ноября 2014

делает это с date и tr и xargs в OSX:

alias predate="xargs -I{} sh -c 'date +\"%Y-%m-%d %H:%M:%S\" | tr \"\n\" \" \"; echo \"{}\"'"
<command> | predate

если вы хотите миллисекунды:

alias predate="xargs -I{} sh -c 'date +\"%Y-%m-%d %H:%M:%S.%3N\" | tr \"\n\" \" \"; echo \"{}\"'"

но учтите, что в OSX date не дает опции% N, поэтому вам нужно установить gdate (brew install coreutils) и, наконец, прийти к следующему:

alias predate="xargs -I{} sh -c 'gdate +\"%Y-%m-%d %H:%M:%S.%3N\" | tr \"\n\" \" \"; echo \"{}\"'"
0 голосов
/ 22 августа 2008

Если значение, которое вы добавляете, одинаково в каждой строке, запустите emacs с файлом, тогда:

Ctrl +

в начале файла (чтобы отметить это место), затем прокрутите вниз до начала последней строки (Alt +> перейдет в конец файла ... что, вероятно, будет также включать клавишу Shift , затем Ctrl + a, чтобы перейти к началу этой строки) и:

Ctrl + x r t

Какая команда вставляется в только что указанный прямоугольник (прямоугольник шириной 0).

2008-8-21 18:45

Или все, что вы хотите добавить ... тогда вы увидите этот текст, добавленный к каждой строке внутри прямоугольника шириной 0.

ОБНОВЛЕНИЕ: Я только что понял, что вы не хотите ЖЕ ЖЕ дату, поэтому это не сработает ... хотя вы можете сделать это в emacs с немного более сложным пользовательским макросом, но все же, этот вид Редактирование прямоугольника довольно полезно знать о ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...