使用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
相关产品推荐
相关产品推荐

