如何使用域列表作为输入更新配置文件?

时间:2012-06-14 20:02:53

标签: bash sed awk

我有两个文件:domainList和config.cnf。 domainList文件只有一个域列表,如下所示:

facebook.com
yahoo.com
youtube.com

config.cnf是一个配置文件,具有相同的列表,格式略有不同。我需要编写一个脚本,在更新列表时更新配置文件。每当更新第一个列表时,我都可以执行bash脚本。以下是配置文件中列表的格式...

*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = yahoo.com
WWW.3 = youtube.com
EOF

所以,如果删除yahoo并在domainList中添加ebay并运行我的酷bash脚本,我需要更新配置文件......

*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = youtube.com
WWW.3 = ebay.com
EOF

为了使事情(稍微)复杂化,域名可以包含子域名和外卡(即news.google.com或* .google.com)。任何关于如何实现这一点的想法将不胜感激!如何在不弄清楚数据的情况下如何做到这一点?它可能只需要清除列表并每次都重新生成它,是吗?

谢谢!

EV

4 个答案:

答案 0 :(得分:6)

这是一个实现这个目标的简单脚本:

# delete all lines after [my_list]
sed -i '/my_list/q' config.cnf

# add the domain list to the bottom of the config
awk '{print "WWW." NR " = " $0}' domainList >> config.cnf

这个脚本可以写成带有awk或sed的单行,但上面的(希望)方法很清楚。

答案 1 :(得分:0)

#!/usr/bin/env bash

FIN=domainList
FOUT=config.cnf

echo "config.cnf template header" > $FOUT
awk '{ print "WWW." FNR " = " $1 }' $FIN >> $FOUT
echo "config.cnf template footer" >> $FOUT

答案 2 :(得分:0)

这是awk中的单行

awk '
BEGIN{var=1}
NR==FNR{a[NR]=$1;next} 
var && /WWW/{var=0; for (x=1;x<=length(a);x++) {print "WWW." x " = " a[x]};next}
!var && /WWW/ {next}
1' domainList config.cnf > config.cnf_new

测试:

$ cat domainList 
facebook.com
youtube.com
ebay.com

$ cat config.cnf
*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = yahoo.com
WWW.3 = youtube.com
EOF

$ awk ' 
BEGIN{var=1}
NR==FNR{a[NR]=$1;next} 
var && /WWW/{var=0; for (x=1;x<=length(a);x++) {print "WWW." x " = " a[x]};next}
!var && /WWW/ {next}
1' domainList config.cnf
*other config options/entries*
[my_list]
WWW.1 = facebook.com
WWW.2 = youtube.com
WWW.3 = ebay.com
EOF
$ 

答案 3 :(得分:0)

带着一点awk的狂欢

while IFS= read -r line; do
  echo "$line"
  if [[ $line = '[my_list]' ]]; then
    awk '{print "WWW." NR " = " $0}' domainList
    echo "EOF" # is this literally in your config file?
    break
  fi
done < config.cnf > tmpfile && mv tmpfile config.cnf