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

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

cat somefile.txt | prepend-timestamp

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

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

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

Ответы [ 17 ]

184 голосов
/ 22 марта 2012

ts из moreutils добавит метку времени к каждой строке ввода, которую вы ей дадите. Вы также можете отформатировать его, используя 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
183 голосов
/ 22 августа 2008

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

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

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

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

45 голосов
/ 22 августа 2008

аннотировать , доступно по этой ссылке или как 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
31 голосов
/ 29 октября 2013

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

unbuffer $COMMAND | ts

В Ubuntu они поступают из пакетов ожидаемых-разработчиков и moreutils.

sudo apt-get install expect-dev moreutils
24 голосов
/ 22 августа 2008

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

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

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

tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps
19 голосов
/ 08 марта 2012

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

Пример:

cat file | tai64n | tai64nlocal
18 голосов
/ 22 августа 2008

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

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

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

http://expect.nist.gov

9 голосов
/ 22 августа 2008

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

$ cat timestamp
#!/bin/sh
while read line
do
  echo `date` $line
done
$ cat somefile.txt | ./timestamp
3 голосов
/ 12 января 2009
#! /bin/sh
unbuffer "$@" | perl -e '
use Time::HiRes (gettimeofday);
while(<>) {
        ($s,$ms) = gettimeofday();
        print $s . "." . $ms . " " . $_;
}'
3 голосов
/ 22 августа 2008

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

gawk '{print strftime("%d/%m/%y",systime()) $0 }' < somefile.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...