【问题标题】:tail not providing output in bash scripttail 未在 bash 脚本中提供输出
【发布时间】:2013-07-19 16:45:18
【问题描述】:

我已经编写了一个 bash 脚本,它将过滤“尾”输出,整个命令

 tail -f /var/log/asterisk/messages | awk 'match($12, /[^0-9]91([0-9]{10})@default/, a) {print a[1]}'

在 CLI 中可以正常工作,但放在 bash 脚本中时不能:

 #!/bin/bash

 phonenumber=$(tail -f /var/log/asterisk/messages | awk 'match($12, /[^0-9]91([0-9]{10})@default/, a) {print a[1]}')
 echo "$phonenumber >> test.log"

不输出任何东西,(2135551234,是预期的输出字符串)我尝试写入日志文件并只写入标准输出,但都不起作用。

我尝试过使用“cat”而不是“tail”的脚本,效果很好。但我不想转储整个文件的输出,因此使用'tail'。

我也尝试过使用'tee'但无济于事

此脚本的最终目标是将进入 PBX 的电话号码发送到串行设备到另一个系统并用作 CID。

提前感谢您的所有帮助

【问题讨论】:

  • tail -f 永远不会退出。
  • @Barmar 您应该扩展您的评论(解释发生了什么)并将其作为答案发布。
  • @JimGarrison 遥遥领先
  • 你已经用$( tail -f ... ) 将你的调用封装在命令替换中的tail 中。因此,该命令必须先完成,然后才能关闭已启动的子 shell 并返回曾经打印的内容。对不起,但我认为你必须重新考虑你的设计。祝你好运。

标签: linux bash awk serial-port tail


【解决方案1】:

试试这个:

phonenumber=$(tail -f /var/log/asterisk/messages | awk 'match($12, /[^0-9]91([0-9]{10})@default/, a) {print a[1]; exit}')

您的版本不起作用,因为tail -fawk 处于无限循环中。将exit 添加到awk 脚本会在找到第一个电话号码时终止循环。 awk 立即退出并将其输出放入变量中,tail -f 在尝试将下一行写入管道时会收到一个 SIGPIPE 信号,这会导致它退出。

【讨论】:

  • @Barmar 谢谢你的发现
猜你喜欢
  • 1970-01-01
  • 2021-07-19
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2015-09-21
相关资源
最近更新 更多