PHP或LinuxShell:将超过10行的文本文件缩减为只有最后10行的最快方法

PHP或LinuxShell:将超过10行的文本文件缩减为只有最后10行的最快方法,php,linux,Php,Linux,我需要知道最快的方法,在PHP或Linux命令Shell中,将超过10行的文本文件减少为只有最后10行。我想在这个例子中使用10行 谢谢:)要将文件缩减到最后一行,请执行以下操作 tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file 说明: tail输出文件的最后n行。 将其写入文件。 &&用于链接命令。

我需要知道最快的方法,在PHP或Linux命令Shell中,将超过10行的文本文件减少为只有最后10行。我想在这个例子中使用10行


谢谢:)

要将文件缩减到最后一行,请执行以下操作

tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file
说明:

tail
输出文件的最后
n
行。
将其写入文件。
&&
用于链接命令。
rm
删除文件。
mv
重命名文件(或移动到其他位置)。

要将文件缩减到最后一行,请执行以下操作

tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file
说明:

tail
输出文件的最后
n
行。
将其写入文件。
&&
用于链接命令。
rm
删除文件。
mv
重命名文件(或移动到其他位置)

编辑为仅提供文件的最后10行,可能大于10行

编辑为仅提供文件的最后10行,可能大于10行

在linux中,您可以

tail -n 10 path/to/file > path/to/output/file
这将获取文件的最后十行(#由-n之后的值指定的行),然后将它们附加到另一个文件中

如果要仅用最后十行覆盖现有文件,请执行以下操作

tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file
请注意,第一个示例输出到不同的文件,而第二个示例覆盖现有文件

您也可以在PHP中使用exec()和内部的shell命令来实现这一点,或者使用file()将整个文件读取到一个数组中,然后使用fwrite()或类似方法获取数组的最后十个元素并将它们添加回文件中,这是一种更为费劲的方法。

在linux中,您可以这样做

tail -n 10 path/to/file > path/to/output/file
这将获取文件的最后十行(#由-n之后的值指定的行),然后将它们附加到另一个文件中

如果要仅用最后十行覆盖现有文件,请执行以下操作

tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file
请注意,第一个示例输出到不同的文件,而第二个示例覆盖现有文件


您也可以在PHP中使用exec()和内部的shell命令来实现这一点,或者使用file()将整个文件读取到数组中,然后使用fwrite()或类似的方法将数组的最后十个元素添加回文件中,这是一种更为费力的方法。

如果您确实不想生成新文件,那你可以试试

echo "$(tail -n 10 path/to/file)" >path/to/file
$()
的工作原理与backticks类似(它计算内部的任何内容,并等同于所述命令的输出),只是在字符串中工作得更好。在我的Linux机器上,在输出到文件之前(这就是导致
tail file>file
出现问题的原因;命令一启动,文件就会被打开并截断),字符串就会被计算(意味着
tail
会被运行)。我想这是因为
echo
是内置的,但不要引用我的话

编辑:实际上,我仔细看了一下。这是因为
尾部
是一个字符串。有几个阶段——这里,我们关心的是插值、重定向和执行——总是按照特定的定义顺序(即刚刚给定的顺序)发生。在插入字符串的过程中,Bash必须在其中运行命令。在执行任何重定向之前。对于直接的
tail file>file
,实际生成输出的是
tail
程序,因此在执行命令之前不会发生输出——但在此之前文件已经被打开进行写入(由于重定向),打开该文件进行写入会截断它。)

(*)
:注意,由于此时已打开
文件
进行写入,因此现在将其截断。因此
tail
读取0字节。
(+)
:由于在重定向打开文件进行写入之前读入了
文件,因此
tail
可以查看所有数据


尽管这种行为显然是有定义和可预测的,但我还是觉得有点不舒服。它依赖于bash arcana,如果您试图获取太多或太长的行,很可能会导致内存问题。(我测试了大约500个字符行,没有发现任何问题。但是还没有测试超过10行。)除非出于某种奇怪的原因需要保留相同的索引节点号,否则最好使用临时文件。

如果确实不想生成新文件,那么可以尝试

echo "$(tail -n 10 path/to/file)" >path/to/file
$()
的工作原理与backticks类似(它计算内部的任何内容,并等同于所述命令的输出),只是在字符串中工作得更好。在我的Linux机器上,在输出到文件之前(这就是导致
tail file>file
出现问题的原因;命令一启动,文件就会被打开并截断),字符串就会被计算(意味着
tail
会被运行)。我想这是因为
echo
是内置的,但不要引用我的话

编辑:实际上,我仔细看了一下。这是因为
尾部
是一个字符串。有几个阶段——这里,我们关心的是插值、重定向和执行——总是按照特定的定义顺序(即刚刚给定的顺序)发生。在插入字符串的过程中,Bash必须在其中运行命令。在执行任何重定向之前。对于直接的
tail file>file
,实际生成输出的是
tail
程序,因此在执行命令之前不会发生输出——但在此之前文件已经被打开进行写入(由于重定向),打开该文件进行写入会截断它。)

(*)
:注意,由于此时已打开
文件
进行写入,因此现在将其截断。因此
tail
读取0字节。
(+)
:S