web-dev-qa-db-ja.com

「tail」を使用して、最新の行を表示せずにファイルを追跡する

書き込み中のファイルを追跡するためにtailなどのプログラムを使用しますが、最新の行は表示しません。

たとえば、新しいファイルをフォローする場合、ファイルが30行未満の間はテキストは表示されません。 30行以上がファイルに書き込まれた後、行は画面の1行目から書き込まれます。

したがって、31〜40行目がファイルに書き込まれると、1〜10行目が画面に書き込まれます。

テールでこれを行う簡単な方法がない場合は、最初のファイルが行で拡張されるたびに最初のファイルから前の行に新しいファイルに書き込み、その新しいファイルにテールを付ける方法があるかもしれません...

6
ridthyself

たぶんawkでバッファする:

tail -n +0 -f some/file | awk '{b[NR] = $0} NR > 30 {print b[NR-30]; delete b[NR-30]} END {for (i = NR - 29; i <= NR; i++) print b[i]}'

拡張されたawkコード:

{
    b[NR] = $0 # save the current line in a buffer array
}
NR > 30 { # once we have more than 30 lines
    print b[NR-30]; # print the line from 30 lines ago
    delete b[NR-30]; # and delete it
}
END { # once the pipe closes, print the rest
    for (i = NR - 29; i <= NR; i++)
        print b[i]
}
7
muru

@muruと同じですが、保存や削除の代わりにモジュロ演算子を使用します。

tail -fn+1 some/file | awk -v n=30 '
   NR > n {print s[NR % n]}
   {s[NR % n] = $0}
   END{for (i = NR - n + 1; i <= NR; i++) print s[i % n]}'
8

前回の読み取りから2秒後にファイルを再読み取りするため、これはあまり効率的ではありません。出力が速すぎる場合は行が失われますが、それ以外の場合はジョブが実行されます。

watch 'tail -n40 /path/to/file | head -n10'
3
l0b0