- 论坛徽章:
- 0
|
给你一个我的shell, 能够读懂, 你就简单修改一下就行了.
一 需求:
想从一文件 Apace 的 apache.conf 文件中, 取出每一段 <VirtualHost 195.200.97.123> 到 </VirtualHost> 之间的内容, 并且以 ServerName 中的域名, 作为相应配置文件的文件名.
二 文件示例: apace.conf
dd
dd
<VirtualHost 195.200.97.123>
ServerAdmin webmaster@ecritel.net
ServerName a.com
ServerAlias www.josealvarez.com
RewriteEngine On
RewriteRule ^(.*)$ http://www.josealvarez.fr$1
</VirtualHost>
<VirtualHost 2.2.2.2>
ServerAdmin webmaster@ecritel.net
ServerName b.com
ServerAlias www.josealvarez.com
RewriteEngine On
test
if linux shell
RewriteRule ^(.*)$ http://www.josealvarez.fr$1
</VirtualHost>
afdas
sdfasdf
三 shell
实现技巧:
1. 首先用 if 来判断读取的行,是否以 <Vi开头, 如果不是,继续读下一行, 如果是则开始建立文件.
2. 建立文件后,继续读下面的行,判断是否 </Vi, 不如不是,写到同一文件中, 如果是, 则表示这一段内容结束. 并取得该段内容里的 ServerName 作为文件名.
#!/bin/sh
dir=`pwd`
mkdir $dir/new
# set -x
#shell 程序用法 ./brek <filename> 会自动获得用户输入的文件名.
# t 是用于计数的, 统计从文件中,可以获取到 <> </> 之间的个数,用于临时文件名.
t=0
#n 是用于从 <> 到 </> 之间的内容中,无 ServerName 的文件名. 从 0开始计算.
n=0
while read c1
do
if echo "$c1" | grep "<Vi" ;then
t=`expr $t + 1`
echo $c1 >>$dir/new/$t.txt
while :
do
read c2
if echo $c2 | grep "</";then
echo $c2 >>$dir/new/$t.txt
name=`cat $dir/new/$t.txt | grep ServerName | awk '{printf $2}'`
if [ $name != "" ]; then
mv $dir/new/$t.txt $dir/new/$name.txt
else
n=`expr $n + 1`
mv $dir/new/$t.txt $dir/new/$n.txt
fi
break 1
else
echo $c2 >> $dir/new/$t.txt
fi
done
fi
done < $1 |
|