Bash 脚本:在 Freebsd 中执行 sed 时使用变量,它期望 \ afters a



我正在尝试在 Freebsd 中的 sed 命令中使用变量。 Freebsd 中的 sed 期望 \ 在 a 之后。 基本上,如果文件中的特定行与模式匹配,我想附加一行。我为此使用 sed 的附加。

#!/usr/bin/bash
SYSLOG_SERVER="192.168.1.36"
SYSLOG_PORT="514"
syslog_conf_file="/etc/syslog.conf"
send_logs() {
logs=(messages auth.log )
send_logs[0]=`awk '(index($2, "messages") != 0) {print $1}' $syslog_conf_file`
send_logs[1]=`awk '(index($2, "auth.log") != 0) {print $1}' $syslog_conf_file`
for (( i = 0 ; i < ${#send_logs[@]} ; i++ ))
do
if [ ! -z "${send_logs[$i]}" ]; then
send_logs[i]=${send_logs[i]}" t"@$SYSLOG_SERVER:$SYSLOG_PORT
sed  "/${logs[$i]}$/a
${send_logs[$i]} 
" $syslog_conf_file
fi
done
}

我面临此错误。变量打印正确,但我运行脚本的方式是错误的。我该如何解决这个问题?

root@Great# bash temp.sh
send_logs *.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err t@192.168.1.36:514
logs messages
sed: 1: "/messages$/a            ...": command a expects  followed by text
send_logs auth.info;authpriv.info t@192.168.1.36:514
logs auth.log
sed: 1: "/auth.log$/a            ...": command a expects  followed by text

sed 的预期输入示例:

root@Great# sed   '/messages$/a                                      
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err @192.168.1.36:514 
' /etc/syslog.conf  

预期产出:

*.err;kern.warning;auth.notice;mail.crit        /dev/console
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err   /var/log/messages
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err @192.168.1.36:514 
security.*                  /var/log/security
auth.info;authpriv.info             /var/log/auth.log

这是因为后跟换行符表示要连接以下行,以避免转义:\

sed  "/${logs[$i]}$/a\
${send_logs[$i]} \
" $syslog_conf_file

相关内容

最新更新