You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tail -n0 -F监控Asterisk日志时sed命令不执行的求助

让我看看你的脚本问题——你提到elif分支里的echo正常运行,但sed命令没生效,这大概率是变量在sed单引号里无法展开的问题,咱们一步步解决:

1. 核心问题:sed正则中的变量未被正确解析

你写的sed -i '/^$EXTEN;/d' $OFFLINE里,单引号'会完全阻止bash解析内部的$EXTEN变量,sed实际在查找字面量^$EXTEN;开头的行,自然找不到要删除的目标内容。

解决方法是把单引号替换成双引号,或者拆分单引号来包裹变量部分,同时给$OFFLINE加上双引号避免路径含空格时出错:

/bin/sed -i "/^$EXTEN;/d" "$OFFLINE"

2. 额外优化:让grep匹配更可靠

你的grep -qi "^$EXTEN;" $OFFLINE如果EXTEN包含正则元字符(比如.),会导致匹配不准确。建议加上-F选项(固定字符串匹配),把它当成普通文本而非正则表达式处理:

if /bin/grep -qF "^$EXTEN;" "$OFFLINE"; then

同样给$OFFLINE加上双引号,避免路径问题。

修改后的完整elif分支代码

elif echo "$LINE" | /bin/grep -q "is now REACHABLE!"
then
    EXTEN=$(echo "$LINE" | /bin/grep -o -P "(?<=\').*(?=\')")
    echo "$EXTEN is now REACHABLE!"
    if /bin/grep -qF "^$EXTEN;" "$OFFLINE"; then
        /bin/sed -i "/^$EXTEN;/d" "$OFFLINE"
    fi
fi

最后验证点

  • 确认脚本开头已经正确定义了$OFFLINE变量(比如OFFLINE="/var/lib/asterisk/offline_peers.txt"),并且脚本拥有该文件的读写权限。
  • 如果你的EXTEN包含正则特殊字符(比如+、*),可以先对变量做转义处理:
EXTEN_ESCAPED=$(printf '%s\n' "$EXTEN" | sed 's/[.[\*^$]/\\&/g')
/bin/sed -i "/^$EXTEN_ESCAPED;/d" "$OFFLINE"

普通数字/字母组成的分机号可以忽略这一步。

内容的提问来源于stack exchange,提问作者calabash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:59:17