【问题标题】:How to use shell to continuously process tail -f new lines in real time?如何使用shell实时连续处理tail -f新行?
【发布时间】:2018-02-14 11:33:45
【问题描述】:

linux 服务器上有一个文件,它不定期地 附加了新行。我需要处理新行,解析它并使用其他命令或脚本来处理它。定期检查文件是不可接受的,我需要实时解决方案。服务器上没有其他语言(Python、Perl)可用,只有 shell。

现在,我正在尝试将新行分配给 shell 变量,然后对其进行处理。但是找不到这样做的好方法。另一个问题是我在处理新行时需要依赖一些结果。例如,当我处理第 11 行时,可能需要第 5 行结果。所以之前需要一些变量来存储结果,我需要在循环中使用它们。

对我的情况有什么解决方案或更好的建议吗?

【问题讨论】:

  • "... 或任何更好的建议..." - 您从未说明您在做什么,也没有提供您的代码。无法提供改进您正在做的事情的建议。
  • @jww 感谢您的评论。很抱歉让您感到困惑,我想我已经在问题中说清楚了。我的目标是在将一行附加到文件时实时处理新行。所以,马上搞定新线路是核心问题。我能想到的唯一解决方案是使用tail -f,但是在我描述的情况下我无法编写代码,所以我问了这个问题。更好的建议意味着,除了使用 tail -f 之外,可以使用任何其他命令。希望您对解释感到满意。
  • 也许我遗漏了一些东西,但是...看起来您所做的只是发布了您的要求并要求某人为您编写代码。我没有看到任何努力自己解决问题。当然,稍微搜索一下就会发现如何分配给 shell 变量。
  • @jww 这可能是一种误解。不是只赋值给一个shell变量那么简单,我不会问那样的问题。我已经搜索了很多但没有找到有用的结果,所以我提出了这个问题。我错过了“读取”命令可以通过 pip 行连续读取该行。而shuerguo的回答使用局部变量来解决第二个问题。我不是要让别人为我写代码,我只是需要这个想法。
  • 请将实际文件放入您的问题中!您可以编辑敏感数据。但是你现在的问题太模糊了。

标签: linux bash shell tail


【解决方案1】:

试试下面的代码

#!/bin/bash
process_new_line() {
    local var= '' #declare some local variables here 
    read
    while true
    do
        #process $REPLY 
        #The new line content is in the variable $REPLY 
        #store the result in the local variable according to your rules.
        read
    done
}

tail -f the_file | process_new_line

使用函数将解决您的问题。您可以使用局部变量来存储结果,并 $REPLY 保存新行内容。

【讨论】:

  • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
  • 谢谢@shuerguo,它有效。之前不知道$REPLY这个变量,现在搞清楚是什么意思。但我相信使用自定义变量可能会更好。无论如何,非常感谢!
  • 这很好,但正如@iBug 指出的那样,您应该详细说明为什么这样做。我花了一些时间才发现 $REPLY 是“阅读”的一个功能。在你的答案中解释这一点特别有用,这样人们就可以概念化是什么让你的答案有效。
【解决方案2】:

试试:

tail -f filename | while read -r line; do
    : # process the line
done

这将是实时的,除非行被缓冲。如果缓冲困扰您,可以使用 stdbuf 之类的实用程序来缩小缓冲区。

你没有提到你的系统是否有 awk。它是 Unix 系统的 POSIX 标准所要求的。如果你有它,它非常适合“计算,替换一些字符”等:

tail -f filename | awk 'awk code'

【讨论】:

  • 谢谢@John1024。在处理新行时,我需要依赖一些结果。比如我处理第11行的时候,可能需要第5行的结果,所以需要一些变量来存储一些结果,我需要在循环中使用它们。在问题中没有说清楚是我的错。顺便说一句,我在我的代码中使用了 awk,但这还不够,我还使用了其他一些命令和脚本。再次感谢!
  • @Germinate shell 和 awk 都完全能够在迭代之间保存变量。两者都可以对变量进行算术和替换。听起来不错的下一步是阅读shellawk 上的教程。
  • @Germinate 另外,从你目前为止告诉我的情况来看,如果你的系统有它,awk 可能是更好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多