我需要知道在PHP或Linux命令外壳中最快的方法,以减少超过10行的文本文件只有最后10行。我想在这个例子中使用10行。
谢谢:)
答案 0 :(得分:3)
将文件缩小到最后一行然后行
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
重命名文件(或移动到其他位置)。
答案 1 :(得分:1)
如果你真的不想生成新文件,那么你可以试试
echo "$(tail -n 10 path/to/file)" >path/to/file
$()
就像反引号一样(它评估内部的任何内容并等同于所述命令的输出),除了它在字符串中效果更好。在我的Linux机器上,在输出到文件之前对字符串进行评估(意味着运行tail
)(这导致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个char行,并没有看到任何问题。但还没有测试超过10行。)除非你需要保留相同的inode数量,否则最好使用临时文件出于某种奇怪的原因。
答案 2 :(得分:0)
tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile
编辑仅提供可能大于10行的文件的最后10行。
答案 3 :(得分:0)
在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中使用带有shell命令的exec(),或者使用file()将整个文件读入数组然后获取数组的最后十个元素并添加的更费力的方法他们用fwrite()或类似的东西回到文件中。