【问题标题】:Bash processing last line in file onlyBash 仅处理文件中的最后一行
【发布时间】:2013-06-22 00:29:50
【问题描述】:

每次保存文件时,我都会尝试处理文件中的最后一行。这是我目前所拥有的:

tail -F -n0 '/path/to/foo.txt' |
  grep "." | while read line
    do echo "$line"   
  done

如果我删除 grep,我会得到最后一行,第一次运行脚本时,但是当目标文件被保存到时,整个文件将被输出,而不仅仅是新的最后一行(期望的行为)。

我需要 grep 来去除返回值,因为这通常是这些文本文件中的最后一个字符。我发现上面的输出通过管道传输到 grep,没有返回任何内容。

我是新手,非常感谢任何指导。

【问题讨论】:

  • 我不确定这里有什么游戏。但是对一个没有解释的问题投反对票? Stackoverflow 曾经是一个更加友好的环境。我做了什么来保证它?

标签: file grep tail


【解决方案1】:

我担心tail 不会那样工作。 -f/-F 选项在处理初始查询 -n0 后流式传输所有数据,据我所知,没有办法只使用单个 tail 调用来获取新数据的最后一行。

每次文件大小发生变化时,可行的解决方案是重新运行tail。在 Linux 上,您可以使用 inotify 子系统来提高效率,我不知道 MacOS 的等效项是什么。总体思路如下:

while inotifywait -e modify /your/file  # this would wait for the next change on Linux
do
    tail -1 | …your processing here…
done

【讨论】:

  • 我曾希望 tail 的 -F 标志能够让我实时处理对文件的更改。在Unix&Linuix SE,我被指向this SO thread 用于各种OSX 文件监视实用程序(那里有一些不错的选择)。看起来要么设置了 FIFO,要么尝试检测对文件的写入,并在每次 fswatch 或 launcd 检测到更改时进行处理。
猜你喜欢
  • 2018-07-20
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2019-08-04
  • 2017-02-03
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多