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

时间:2017-08-22 11:18:27

标签: bash shell sed scripting

我正在尝试在Freebsd中的sed命令中使用变量。在Freebsd的sed预计\后。基本上我想在文件中的特定行与模式匹配时附加一行。我正在使用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

1 个答案:

答案 0 :(得分:1)

这是因为\后跟换行字符意味着要连接的行,以避免转义:\\

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