如何使用bash shell中的section读取配置文件

时间:2014-01-25 06:57:54

标签: linux bash shell sed

我在

部分有这样的配置文件
[rsync_includes]
user
data
conf


[rsync_exclude]
tmp
.pyc
*/vendor


[javascript]
utils
data

我有想要在rsync和该文件中的其他配置数据中排除的模式

现在我很困惑如何在命令行上使用这些模式

rsync -avz --exclude-from 'content from config file rsync exclude' source/ destination/

我不知道如何读取部分配置文件然后在命令行上使用

4 个答案:

答案 0 :(得分:1)

要使用--exclude-from,您必须将配置的相关部分隔离到临时文件中。这很容易用一点sed:

tmp_file=$(mktemp)
sed -n '1,/rsync_exclude/d;/\[/,$d;/^$/d;p' config.file > $tmp_file
rsync -avz --exclude-from $tmp_file source/ destination/

为了清楚起见,我省略了错误检查和清理。

请注意,rsync可以从stdin中读取-输入的排除模式,因此更短:

sed -n '1,/rsync_exclude/d;/\[/,$d;/^$/d;p' config.file | \
  rsync -avz --exclude-from - source/ destination/

<强>解释

  • 1,/rsync_exclude/d排除了直到rsync_exclude部分条目的所有行
  • /\[/,$d排除从下一部分开始到文件结尾的所有内容
  • /^$/d排除空行(这是可选的)

以上所有内容都从配置中提取相关部分。

答案 1 :(得分:0)

如果您的配置文件位于config.ini,则运行bash脚本:

rm rsync-filter
while IFS= read -r line
do
    case "$line" in
        \[rsync_includes\])  command=include ;;
        \[rsync_exclude\]) command=exclude ;;
        \[*) command= ;;
        *) [ "$command"  -a "$line" ] && echo "$command $line" >>rsync-filter
    esac
done <config.ini

运行之后,它会创建包含include和exclude规则的rsync-filter,并且可以与rsync一起使用:

rsync -avz --filter='merge rsync-filter' source/ destination/

另外,rsync提供的-F选项相当于--filter='dir-merge /.rsync-filter'。这会加载包含/排除文件/source/.rsync-filter中的规则,而且,随着rsync深入到目录树中,它将查找并加载来自.rsync-filter文件的规则,并找到并应用它们那些规则到该目录及其子目录中的文件。这是保存和组织rsync规则的有效方法。

此外,rsync读取包含和排除规则的顺序很重要。使用这些过滤器文件,您可以保留对该订单的控制权。当您尝试使rsync规则正常工作时,这是一个重要的优势。

答案 2 :(得分:0)

我会承认我不熟悉rsync,但我会以不同的方式格式化这些数据,我自己。

# rsync-data-file+.txt

rsync-includes:user
rsync-includes:data
rsync-includes:conf

rsync-exclude:tmp
rsync-exclude:.pyc
rsync-exclude:\*\/vendor

javascript:utils
javascript:data

从那里,您可以执行以下操作: -

#!/usr/bin/env bash
set -x

while read line
do
    if [ $(echo "${line}" | sed -n '/rsync-includes/'p) ]
    then
    parameter=$(echo "${line}" | cut -d':' -f2)
    rsync "${parameter}" (other switches here etc)
fi
done < rsync-data-file+.txt

这样您就可以根据参数所属的组自定义命令行;因此,使用javascript组中的参数,您可以将操作记录到其他文件中,例如。

答案 3 :(得分:0)

#!/bin/sh

typeset -A Nconfig # init array

typeset -A Oconfig # init array , u can declare multiple array for each section.s

while read line
do
    if [ "$line" = "[SECTION1]" ]
    then
        SECTION1=1
        SECTION2=0
        continue
    fi
    if [ "$line" = "[SECTION2]" ]
        then
        SECTION1=0
        SECTION2=1
        continue
        fi
    if [ "$line" = "[SECTION3]" ]
        then
        SECTION1=0
        SECTION2=0
        continue
        fi



    if [ $SECTION1= 1 ]
    then
        if echo $line | grep -F = &>/dev/null
            then
            varname=$(echo "$line" | cut -d '=' -f 1)
            echo "Novar $varname"
            Nconfig[$varname]=$(echo "$line" | cut -d '=' -f 2)
        fi
    fi
    if [ $SECTION2 = 1 ]
    then
        if echo $line | grep -F = &>/dev/null
            then
            varname=$(echo "$line" | cut -d '=' -f 1)
            Oconfig[$varname]=$(echo "$line" | cut -d '=' -f 2)
        fi
    fi


   done < Config

echo "SECTION1 FROM=${Nconfig[FROM]}"
echo "SECTION2FROM=${Oconfig[FROM]}"



[SECTION1]
FROM=abc@pqr.com
TO=abc@pqr.com
SIZE=80
THRESHOULD=60
[SECTION2]
FROM=xxxx@pqr.com
TO=xxxx@pqr.com,yyyy@pqr.com
SIZE=60
THRESHOULD=30
[SECTION3]
FROM=AAAA@pqr.com
TO=BBBB@pqr.com,yyyy@pqr.com
SIZE=60
THRESHOULD=30
LOCATION=/mnt/device/user1/