从 TCP 端口记录除换行符以外的字符上的中断消息

从 TCP 端口记录除换行符以外的字符上的中断消息

我正在编写一组脚本来监视一些记录到 TCP 端口的外部服务。

function handleMessage {
  while read message
  do
    # Handle $message
  done
}
nc -d $ipadd $port | handleMessage

当日志消息由新行分隔时,此代码可以正常工作,如下所示

服务开始

错误:发生了可怕的事情

服务停止

但其中一项服务使用 LOGXXXX 来分隔消息,并允许在消息中添加新行,因此它的输出看起来更像是这样:

LOG0001 服务已启动LOG0002 错误:发生了可怕的事情

SomeMethod 处的 NullPointerException (File1.java)

SomeOtherMethod (File2.java)LOG0003 服务已停止

使用我上面的代码,handleMessage 是为每一行而不是每组 LOGXXXX 段调用的,如果时间过去而没有包含换行符的消息,我的脚本在处理消息方面会远远落后。

nc 或其他程序上是否有一个选项可以用来从此 TCP 端口读取数据并在自定义分隔符上中断,或者是否有某个选项可以让 bash 函数处理对 stdout 的每次写入,而不是只为每一行调用?

答案1

这里的问题出在你的while read message行上。read默认情况下以换行符终止,但您可以使用该-d选项向其传递另一个字符。

要问的问题是在您的 LOGXXXX 行中,脚本如何知道条目何时完成?如果您可以在末尾放置一个特殊字符,那么您可以使用read -d.否则,您可以用其他内容替换换行符,然后将它们放回去。

因此在您的示例中:

function handleMessage {
  while read message
  realmessage=`echo $message | tr '|' '\n'`
  do
    # Handle $realmessage
  done
}
nc -d $ipadd $port | tr '\n' '|' | handleMessage

因此,您将所有换行符替换为 a ,|以便它们全部进入read调用中,然后将其分开。

相关内容