180

Python でこのための簡単なスクリプトを作成することになりましたが、各行の先頭にテキスト (私の場合はタイムスタンプ) を追加するテキストをフィードできるユーティリティがあるかどうか疑問に思っていました。理想的には、使用は次のようになります。

cat somefile.txt | prepend-timestamp

(あなたがsedに答える前に、私はこれを試しました:

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

ただし、sed の実行時に date コマンドが 1 回しか評価されないため、同じタイムスタンプが誤って各行の先頭に追加されます。)

4

17 に答える 17

203

tsfrom 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
于 2012-03-21T22:09:03.750 に答える
192

使用してみてくださいawk

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

が行バッファ出力を生成することを確認する必要がある場合があり<command>ます。つまり、各行の後に出力ストリームをフラッシュします。追加されるタイムスタンプawkは、行の終わりが入力パイプに表示された時刻になります。

awkにエラーが表示された場合は、gawk代わりに試してください。

于 2008-08-22T01:53:25.837 に答える
46

そのリンクを介して、またはannotate-outputDebiandevscriptsパッケージのように利用可能な注釈。

$ 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
于 2008-08-22T07:00:51.607 に答える
31

可能な最も単純なものへの与えられた答えを抽出する:

unbuffer $COMMAND | ts

Ubuntu では、expect-dev および moreutils パッケージから取得されます。

sudo apt-get install expect-dev moreutils
于 2013-10-29T15:17:05.280 に答える
25

これはどう?

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

ライブタイムスタンプを取得したいという願望から判断すると、ログファイルなどでライブ更新を実行したい場合がありますか?多分

tail -f /path/to/log | perl -pne 'print scalar(localtime()), " ";' > /path/to/log-with-timestamps
于 2008-08-22T01:42:33.790 に答える
19

キエロンの答えはこれまでのところ最高です。最初のプログラムがバッファリングしているために問題が発生した場合は、バッファリング解除プログラムを使用できます。

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

ほとんどのLinuxシステムにデフォルトでインストールされています。自分でビルドする必要がある場合は、expectパッケージの一部です

http://expect.nist.gov

于 2008-08-22T06:56:48.323 に答える
19

これを放り出すだけです。daemontoolsにはtai64ntai64nlocalという1 組のユーティリティがあり、メッセージをログに記録するためにタイムスタンプを先頭に追加するために作られています。

例:

cat file | tai64n | tai64nlocal
于 2012-03-08T05:58:55.137 に答える
10

read(1) コマンドを使用して、標準入力から一度に 1 行を読み取り、date(1) を使用して選択した形式で日付を先頭に追加した行を出力します。

$ cat timestamp
#!/bin/sh
while read line
do
  echo `date` $line
done
$ cat somefile.txt | ./timestamp
于 2008-08-22T14:09:11.500 に答える
3
#! /bin/sh
unbuffer "$@" | perl -e '
use Time::HiRes (gettimeofday);
while(<>) {
        ($s,$ms) = gettimeofday();
        print $s . "." . $ms . " " . $_;
}'
于 2009-01-12T18:48:23.740 に答える
3

私はUnixの人ではありませんが、使用できると思います

gawk '{print strftime("%d/%m/%y",systime()) $0 }' < somefile.txt
于 2008-08-22T01:48:58.750 に答える
2

これが私のawkソリューションです(C:\binディレクトリにMKSToolsがインストールされているWindows/ XPシステムから)。これは、各行が読み取られるときにシステムからそのタイムスタンプをフェッチした各行の先頭に、mm / dd hh:mmの形式で現在の日付と時刻を追加するように設計されています。もちろん、BEGINパターンを使用してタイムスタンプを1回フェッチし、そのタイムスタンプを各レコードに追加することもできます(すべて同じ)。これは、生成されていたログファイルに、ログメッセージが生成されたときのタイムスタンプでstdoutにタグを付けるために行いました。

/"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変数が正しく構成されている)。

于 2011-03-01T18:20:12.483 に答える
2

上記のnatvwと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);
  }'
于 2015-10-19T15:44:06.457 に答える
1

caerwyn の回答はサブルーチンとして実行できます。これにより、行ごとに新しいプロセスが実行されなくなります。

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

echo testing 123 |timestamp
于 2013-09-20T18:58:45.477 に答える
0

dateOSXで、trそしてOSXでそれを行うxargs

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 \"{}\"'"
于 2014-11-18T18:09:52.650 に答える
-1

付加する値がすべての行で同じである場合は、ファイルを使用してemacsを起動し、次のようにします。

Ctrl+<space>

ファイルの先頭で(その場所をマークするために)、最後の行の先頭までスクロールダウンします(Alt+>はファイルの末尾に移動します...おそらくShiftキーも含まれます。次にCtrlキーを押します+その行の先頭に移動します)および:

Ctrl+x r t

これは、指定した長方形(幅0の長方形)に挿入するコマンドです。

2008-8-21 6:45PM<入力>

または、追加したいものは何でも...すると、幅0の長方形内のすべての行にそのテキストが追加されます。

更新:同じ日付が必要ないことに気付いたので、これは機能しません...少し複雑なカスタムマクロを使用してemacsでこれを行うことができるかもしれませんが、それでも、この種の長方形の編集は知っておくといいですね...

于 2008-08-22T01:46:58.007 に答える