16

我问了一个关于在 PHP 中弹出文本文件的最后一行的问题,现在,是否可以在 shell 脚本中重写逻辑?

我试过这个来获得最后一行:

tail -n 1 my_log_file.log

但我不确定如何删除最后一行并保存文件。

PS 鉴于我使用的是 Ubuntu 服务器。

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 是 GNU coreutils 的一部分(通常在最近的 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

一种方法是:

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