私はtailのようなプログラムを使用して記録されたファイルを追跡しますが、最新の行を表示したくありません。
たとえば、新しいファイルに焦点を当てたときにファイルの行が30行未満の場合、テキストは表示されません。 30行以上のファイルを書き込むと、最初の行から画面に書き込まれます。
したがって、行31〜40がファイルに書き込まれると、行1〜10も画面に書き込まれます。
tailでこれを行う簡単な方法がない場合は、最初のファイルが1行を展開するたびに、最初のファイルの古い行を新しいファイルに書き込んで新しいファイルのtailを作成する方法があります。
答え1
@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]}'
答え2
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]
}
答え3
これは、ファイルを最後に読み込んだ後2秒後に再度読み取るため、非常に効率的ではなく、出力が速すぎると行を見逃す可能性がありますが、そうでない場合は操作を実行します。
watch 'tail -n40 /path/to/file | head -n10'
答え4
ファイルを追跡する方法によって異なりますが、次のように最も簡単に追跡できると思います。
tail -n0 -F path/to/my/file.log
上記のコードを実行すると、プロセスがファイルの末尾に行を追加すると(たとえば./run_process.sh >> file.log
)、ファイルを書き込むほとんどのアプリケーションと同様に、最後に追加された行だけがインポートされます。