我在stackoverflow上提问,询问如何在PHP中弹出文本文件的最后一行,现在,是否可以用shell脚本重写这个逻辑呢?
我尝试了以下方法来获取最后一行:
tail -n 1 my_log_file.log
但我不确定如何删除最后一行并保存文件。
附:我使用的是Ubuntu服务器。
我在stackoverflow上提问,询问如何在PHP中弹出文本文件的最后一行,现在,是否可以用shell脚本重写这个逻辑呢?
我尝试了以下方法来获取最后一行:
tail -n 1 my_log_file.log
但我不确定如何删除最后一行并保存文件。
附:我使用的是Ubuntu服务器。
要获取文件内容,不包含最后一行,您可以使用
head -n-1 logfile.log
我不确定这在所有地方都被支持。
或者
sed '$d' logfile.log
truncate -s -"$(tail -n1 file | wc -c)" file
假设该文件当前不在被写入的状态下。
truncate是GNU coreutils的一部分(因此通常可以在最新的Linux发行版中找到),并不是标准的Unix或POSIX命令。许多"dd"实现也可以用来截断文件。
tail
+ truncate
将是更有效的解决方案。当然,为了允许 OP 检索最后一行的内容,应该单独调用 tail -n
并将其存储在一个变量中。然后可以使用 ${#VAR} + 1
作为截断大小。 - Shawn Chin-r
选项(使用给定文件的大小):如果你不介意bashism,可以用truncate -r <(tail -n1 file) file
。 - chepner(解决方案基于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
之间修改文件,则其效果可能与预期不符。
truncate
函数期望的是 字节 大小,而 ${#LAST}
计算的是 $LAST
中字符的数量。为了使它们等效,您需要将区域设置为 C。否则,如果最后一行包含多字节字符,则无法正常工作。 - Stephane Chazelas一种方法是:
sed '$d' < f1 > f2 ; mv f2 f1
f2
和f1
是什么? - Raptor