web-dev-qa-db-ja.com

シェル:巨大なテキストログファイルの最後の行を削除します

PHPでテキストファイルの最後の行をポップすることについて 質問 を尋ねましたが、シェルスクリプトでロジックを書き直すことは可能ですか?

私はこれを試して最後の行を取得しました:

tail -n 1 my_log_file.log

しかし、どうすれば最後の行を削除してファイルを保存できるかわかりません。

P.S.私がUbuntuサーバーを使用していることを考えると。

14
Raptor

(解決策は schの答え に基づいているので、クレジットは彼/彼女に行く必要があります)

このアプローチにより、ファイルの最後の行を効率的に取得し、ファイルを切り捨ててその行を削除できます。これにより、ファイルが順番に読み取られないため、大きな入力をより適切に処理できます。

# retrieve last line from file
LAST=$(tail -n 1 my_log_file.log)

# truncate file
let TRUNCATE_SIZE="${#LAST} + 1"
truncate -s -"$TRUNCATE_SIZE" my_log_file.log

# ... $LAST contains 'popped' last line

tailtruncateの呼び出しの間にファイルが変更された場合、これは期待どおりに機能しないことに注意してください。

11
Shawn Chin

最後の行なしでファイルの内容を取得するには、次を使用できます

head -n-1 logfile.log

(これがどこでもサポートされているかどうかはわかりません)

または

sed '$d' logfile.log
31
choroba

必要なのは、ファイルを完全に読み取ることなく、最後の行の直前でファイルを切り捨てることです。

truncate -s -"$(tail -n1 file | wc -c)" file

これは、ファイルが現在書き込まれていないことを前提としています。

truncateはGNU coreutils(最近のLinuxディストリビューションで一般的に見られる)の一部であり、標準化されたUnixまたはPOSIXコマンドではありません。多くの「dd」実装を使用してファイルを切り捨てることもできます。

19

1つの方法は次のとおりです。

sed '$d' < f1 > f2 ; mv f2 f1
4
codaddict