PHP或Linux Shell:最简单的方法来减less超过10行的文本文件只有最后10行

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

谢谢 :)

Solutions Collecting From Web of "PHP或Linux Shell:最简单的方法来减less超过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重命名文件(或移动到不同的位置)。

如果你真的不想生成一个新的文件,那么你可以试试

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

$()作用与反引号(它可以评估内部的任何东西,等同于所述命令的输出),除了它在字符串中更好。 在我的Linux机器上,在输出到文件之前(这是导致tail file >file的问题;文件被打开 – 并被截断 – 一旦命令被执行开始)。 我想这是因为echo是内建的,但不要在此引用我的意思。

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

 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的arcana,如果你尝试得到太多或太长的行,可能会导致内存问题。 (我测试了大约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()方法把整个文件读入一个数组,然后把数组的最后10个元素加回到数组中该文件与fwrite()或类似的。