Сведения о вопросе

Fedya

01:53, 29th August, 2020

Теги

unix   shell   awk    

Существует ли утилита Unix для добавления временных меток к stdin?

Просмотров: 518   Ответов: 17

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

cat somefile.txt | prepend-timestamp

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

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

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



  Сведения об ответе

PHPH

06:35, 17th August, 2020

ts из moreutils будет добавлять timestamp к каждой строке ввода, которую вы ему даете. Вы также можете отформатировать его с помощью strftime.

$ echo 'foo bar baz' | ts
Mar 21 18:07:28 foo bar baz
$ echo 'blah blah blah' | ts '%F %T'
2012-03-21 18:07:30 blah blah blah
$ 

Установить его:

sudo apt-get install moreutils


  Сведения об ответе

lats

23:14, 22nd August, 2020

Можно попробовать использовать awk :

<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

Возможно, Вам потребуется убедиться, что <command> производит линейный буферизованный вывод, т. е. он сбрасывает свой выходной поток после каждой строки; timestamp awk добавляет время, когда конец строки появился на его входном канале.

Если awk показывает ошибки, то попробуйте gawk вместо этого.


  Сведения об ответе

LIZA

18:57, 23rd August, 2020

аннотировать, доступный по этой ссылке или как annotate-output в пакете Debian devscripts .

$ echo -e "a\nb\nc" > lines
$ annotate-output cat lines
17:00:47 I: Started cat lines
17:00:47 O: a
17:00:47 O: b
17:00:47 O: c
17:00:47 I: Finished with exitcode 0


  Сведения об ответе

ITSME

21:04, 20th August, 2020

Перегоняя заданные ответы к самому простому из возможных:

unbuffer $COMMAND | ts

На Ubuntu они приходят из пакетов expect-dev и moreutils.

sudo apt-get install expect-dev moreutils


  Сведения об ответе

qwerty101

23:31, 9th August, 2020

Как насчет этого?

cat somefile.txt | perl -pne 'print scalar(localtime()), " ";'

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

tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps


  Сведения об ответе

прога

08:05, 12th August, 2020

Просто выкину это: в daemontools есть пара утилит под названием tai64n и tai64nlocal , которые предназначены для добавления временных меток в сообщения журнала.

Пример:

cat file | tai64n | tai64nlocal


  Сведения об ответе

qwerty101

17:13, 8th August, 2020

Ответ Кирона пока самый лучший. Если у вас возникли проблемы из-за того, что первая программа буферизует его, вы можете использовать программу unbuffer:

unbuffer <command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

Он установлен по умолчанию на большинстве систем linux. Если вам нужно построить его самостоятельно это часть пакета expect

http://expect.nist.gov


  Сведения об ответе

darknet

05:16, 18th August, 2020

Используйте команду read (1) для чтения одной строки за один раз из стандартного ввода, а затем выведите строку с датой в формате по вашему выбору, используя date(1).

$ cat timestamp
#!/bin/sh
while read line
do
  echo `date` $line
done
$ cat somefile.txt | ./timestamp


  Сведения об ответе

padenie

04:04, 24th August, 2020

Я не Unix парень, но я думаю, что вы можете использовать

gawk '{print strftime("%d/%m/%y",systime()) $0 }' < somefile.txt


  Сведения об ответе

DAAA

13:44, 20th August, 2020

#! /bin/sh
unbuffer "$@" | perl -e '
use Time::HiRes (gettimeofday);
while(<>) {
        ($s,$ms) = gettimeofday();
        print $s . "." . $ms . " " . $_;
}'


  Сведения об ответе

lesha

16:58, 11th August, 2020

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

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

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

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

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

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


  Сведения об ответе

COOL

03:39, 18th August, 2020

Смешивая некоторые ответы выше от natevw и Frank Ch. Эйглер.

Он имеет миллисекунды, работает лучше, чем вызов внешней команды 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);
  }'


  Сведения об ответе

SSESION

03:03, 20th August, 2020

$ 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 . просто замените date +%T на то, что вам нужно.


  Сведения об ответе

park

03:03, 28th August, 2020

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

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

echo testing 123 |timestamp


  Сведения об ответе

SEEYOU

04:30, 7th August, 2020

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

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

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

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

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

<command> | preftime

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


  Сведения об ответе

ЯЯ__4

12:23, 17th August, 2020

делаем это с 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 \"{}\"'"


  Сведения об ответе

appple

07:05, 24th August, 2020

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

Ctrl + <space>

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

Ctrl + x r t

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

2008-8-21 6:45PM <enter>

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

UPDATE: я только что понял, что тебе не нужна дата SAME, так что это не сработает... хотя вы можете сделать это в emacs с немного более сложным пользовательским макросом, но все же, этот вид редактирования прямоугольника довольно приятно знать...


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться