16

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

最後の行を取得するためにこれを試しました:

tail -n 1 my_log_file.log

しかし、最後の行を削除してファイルを保存する方法がわかりません。

Ubuntuサーバーを使用していることを考えると、PS。

4

4 に答える 4

33

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

head -n-1 logfile.log

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

また

sed '$d' logfile.log
于 2012-08-29T11:11:39.837 に答える
23

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

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

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

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

于 2012-08-29T11:55:12.370 に答える
16

(解決策は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

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

于 2012-08-29T11:13:42.983 に答える
4

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

sed '$d' < f1 > f2 ; mv f2 f1
于 2012-08-29T11:11:00.647 に答える