Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在bashshell中使用节读取配置文件_Linux_Bash_Shell_Sed - Fatal编程技术网

Linux 如何在bashshell中使用节读取配置文件

Linux 如何在bashshell中使用节读取配置文件,linux,bash,shell,sed,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/ 我不确

我有这样的配置文件在部分

[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/

我不确定如何读取部分配置文件,然后在命令行上使用,如果您的配置文件位于
config.ini
,则运行bash脚本:

rsync -avz --exclude-from 'content from config file rsync exclude' source/ destination/
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
另外,
rsync
提供了
-F
选项,该选项相当于
-filter='dir-merge/.rsync-filter'
。这将从文件
/source/.rsync filter
中加载/排除规则,而且,随着
rsync
深入目录树,它将从找到的
.rsync filter
文件中查找和加载规则,并将这些规则应用于该目录及其子目录中的文件。这是一种保存和组织rsync规则的强大方法

此外,rsync读取include和exclude规则的顺序也很重要。使用这些筛选文件,您可以保留对该顺序的控制。当您试图使rsync规则正常工作时,这是一个重要的优势。

要使用
--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\u exclude/d
    排除rsync\u exclude部分条目之前的所有行
  • /\[/,$d
    排除了从下一节开始到文件结尾的所有内容
  • /^$/d
    不包括空行(这是可选的)

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

我承认我不熟悉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
!/usr/bin/env bash
集合x
读行时
做
if[$(echo“${line}”| sed-n'/rsync includes/'p)]
然后
参数=$(echo“${line}”| cut-d':'-f2)
rsync“${parameter}”(此处的其他开关等)
fi
完成
通过这种方式,您可以根据参数所属的组自定义命令行;因此,使用javascript组中的参数,您可以将操作记录到不同的文件中,例如。

#!/bin/sh
#!/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/
排版-Nconfig#init数组 typeset-一个Oconfig#init数组,可以为每个节声明多个数组 读行时 做 如果[“$line”=“[SECTION1]” 然后 第1节=1 第2节=0 持续 fi 如果[“$line”=“[SECTION2]” 然后 第1节=0 第2节=1 持续 fi 如果[“$line”=“[SECTION3]” 然后 第1节=0 第2节=0 持续 fi 如果[$SECTION1=1] 然后 如果echo$line | grep-F=&>/dev/null 然后 varname=$(回显“$line”| cut-d'='-f1) echo“Novar$varname” Nconfig[$varname]=$(回显“$line”|剪切-d'='-f2) fi fi 如果[$SECTION2=1] 然后 如果echo$line | grep-F=&>/dev/null 然后 varname=$(回显“$line”| cut-d'='-f1) Oconfig[$varname]=$(回显“$line”|剪切-d'='-f2) fi fi 完成<配置 echo“SECTION1 FROM=${Nconfig[FROM]}” echo“SECTION2FROM=${Oconfig[FROM]}” [第1节] 从=abc@pqr.com 到=abc@pqr.com 尺寸=80 阈值=60 [第2节] 从=xxxx@pqr.com 到=xxxx@pqr.com,yyyy@pqr.com 尺寸=60 阈值=30 [第3节] 从=AAAA@pqr.com 到=BBBB@pqr.com,yyyy@pqr.com 尺寸=60 阈值=30 位置=/mnt/device/user1/
(a)rsync的--exclude from期望将文件作为参数,而不是文件的内容。(b)存储rsync includes+excludes的标准文件称为
.rsync filter
,您可以使用-F选项加载它。