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


PHP or Linux Shell: Fastest way to reduce a text file that has more than 10 lines to only have the last 10 lines

我需要知道最快的方法,在PHP或Linux命令行中,将超过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

解释:

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

如果您真的不想生成新文件,那么您可以尝试

echo "$(tail -n 10 path/to/file)" >path/to/file

$()的工作原理与backticks一样(它评估内部的内容并等同于所述命令的输出),只是它在字符串中工作得更好。在我的Linux机器上,在输出进入文件之前,会对字符串进行求值(意味着tail正在运行)(这就是tail file >file出现问题的原因;一旦命令启动,文件就会被打开并截断) 我想这是因为tail0是内置的,但不要引用我的话

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

phase          tail file >file                   echo "$(tail file)" >file
-------------+---------------------------------+-------------------------------
interpolate   nothing                           run "tail file"; get output (+)
redirect      open file for write; set stdout   open file for write; set stdout
execute       run "tail file" (*)               run 'echo "line'nline'n..."'

(*):注意,由于此时file已经打开进行写入,因此现在它被截断了。因此tail读取0个字节
(+):由于file是在之前在中读取的,重定向打开它进行写入,因此tail能够查看所有数据。

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

tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile

编辑后只提供文件的最后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()或类似方法将数组的最后十个元素添加回文件中,这是一种更费力的方法。