我有两个文件: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
答案 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)
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