【问题标题】:shell: delete the last line of a huge text log file [duplicate]shell:删除一个巨大的文本日志文件的最后一行[重复]
【发布时间】:2012-08-23 23:28:37
【问题描述】:

我问过question关于在 PHP 中弹出文本文件的最后一行的问题,现在,是否可以在 shell 脚本中重写逻辑?

我试过这个来获取最后一行:

tail -n 1 my_log_file.log

但我不确定如何删除最后一行并保存文件。

附:鉴于我使用的是 Ubuntu 服务器。

【问题讨论】:

    标签: shell tail


    【解决方案1】:

    要获取没有最后一行的文件内容,可以使用

    head -n-1 logfile.log
    

    (我不确定这是否在所有地方都支持)

    sed '$d' logfile.log
    

    【讨论】:

    • 完美!!!!不错的一个
    • sed 完美运行! $d 是在最后一行之前退出的命令,这就是它可以跳过最后一行的原因!见gnu.org/software/sed/manual/sed.html
    【解决方案2】:

    您想要的是在最后一行之前截断文件,而不必完全读取文件。

    truncate -s -"$(tail -n1 file | wc -c)" file
    

    这是假设文件当前没有被写入。

    truncate 是 GNU coreutils 的一部分(通常出现在最近的 Linux 发行版中),它不是标准化的 Unix 或 POSIX 命令。许多“dd”实现也可用于截断文件。

    【讨论】:

    • 使用tail + truncate 确实是一个更有效的解决方案。自然,为了让 OP 检索最后一行 tail -n 的内容,应该单独调用并存储在 var 中。然后您可以使用${#VAR} + 1 作为截断大小。
    • 添加了 wiki answer 并提出了更改建议。
    • 似乎有一个额外的 - 在 tail/wc 组合之前。此外,如果您不介意 bashism,您可以在此处使用 -r 选项(使用给定文件的大小):truncate -r <(tail -n1 file) file
    • 进程替换是一种 kshism(zsh 和 bash 也支持)。它不会起作用,因为
    • 这应该是答案。快速、简单、有效。只是立即在一个 5.2GB 的文件上完成。
    【解决方案3】:

    (解决方案基于sch's answer,因此应归功于他/她)

    这种方法将允许您有效地检索文件的最后一行并截断文件以删除该行。这可以更好地处理大输入,因为文件不是按顺序读取的。

    # 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
    

    请注意,如果在调用 tailtruncate 之间修改了文件,这将无法正常工作。

    【讨论】:

    • 请注意,与我给出的可在 GNU 系统上运行的基于“wc”的解决方案相反,如果最后一行包含 NUL 字符,上述内容仅适用于 zsh。此外,如果最后一行不是 NL 终止,它将无法正常工作。
    • 另外,truncate 需要以 字节 为单位的大小,而 ${#LAST} 以字符数计算 $LAST 的长度。您希望将语言环境设置为 C 以使其等效。否则,如果最后一行包含多字节字符,这将无法正常工作。
    【解决方案4】:

    一种方法是:

    sed '$d' < f1 > f2 ; mv f2 f1
    

    【讨论】:

    • 我不明白这个。 f2f1 是什么?
    • 我来晚了,但这是我最喜欢的解决方案。您可以使用 sed 的“-i”标志就地进行更改:“sed -i -e '$d' my_log_file.log”
    • 如果您编写跨平台脚本,请注意使用-i,因为它在 macOS 和 Linux 上是不同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2018-12-08
    • 2014-12-22
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多