|
藍森林 http://www.lslnet.com 2006年6月26日 11:18
請教一段關於文件讀取的腳本
最近想實現一個功能,如有一文件有如下內容:
[code]192.168.100.0/24 via 88.88.88.77 dev eth0
192.168.1.0/24 via 88.88.88.41 dev eth0
default equalize
nexthop via 88.88.88.1 dev eth0 weight 1
nexthop via 88.88.88.2 dev eth0 weight 1
192.168.1.0/24 via 88.88.88.41 dev eth0
default equalize
nexthop via 88.88.88.3 dev eth1 weight 1
nexthop via 88.88.88.4 dev eth1 weight 1
……
……
[/code]
我想實現的功能是,逐行讀取每一行語句,如果它是一條普通的句子(不包含字符串equalize),則直接輸出該行,如上面的:
[code]192.168.1.0/24 via 88.88.88.41 dev eth0[/code]
如果它是一條被分割為多行的語句,如上面的:
[code]default equalize
nexthop via 88.88.88.1 dev eth0 weight 1
nexthop via 88.88.88.2 dev eth0 weight 1[/code]
它的第一句包含了equalize語句,且後面的語句都以一個TAB開始,接一個nexthop,直至沒有再以TAB開始的語句為結束。需要將它重新整合成一句,再輸出,如上面這句,將其整合為:
[code]default equalize nexthop via 88.88.88.1 dev eth0 weight 1 nexthop via 88.88.88.2 dev eth0 weight 1[/code]
這段腳本應該怎麼寫呢?盼哪位大哥指點一二…… |
sed '/default equalize/{:a;N;s/\n[ ]*nexthop/ nexthop/;ta}' ur-file |
-->
牛人大哥,能詳細指點一下嗎?小弟實在看不懂你寫的,我現在是這樣:
[code] while read route_line
do
if [ 如果是一條普通的語名 ]; then
IPROUTE="/bin/ip route add "$route_line" table "$table_name
echo $IPROUTE
else
需要合併這幾句,將其輸出
fi
done < $routelist[/code]
謝謝,已懂你的意思了,在RH9上跑了一下,呵呵,可惜我另一個系統sed可能不支持這個功能,顯示:
sed: Unterminated {
|
sed '/default equalize/{:a;N;s/\n[ ]*nexthop/ nexthop/;ta}
s#^#/bin/ip route add #; s#$# table '$table_name#
ur-file
整合以後還要加個/bin/ip麼?
如果加就請
原理請參請手導航 |
-->
是的,而且nexthop開頭的行數的個數是不一定的,可能是一個,也可能是N個…… |
sed: Unterminated {
加點空格和;試試
sed -e ' /default equalize/{ :a;N;s/\n[ ]*nexthop/ nexthop/;ta }'
sed -e '/default equalize/{ :a;N;s/\n[ ]*nexthop/ nexthop/;ta;}
sed -e '/default equalize/{;:a;N;s/\n[ ]*nexthop/ nexthop/;ta;} |
-->
笨人用了笨辦法,調試通過:
[code] flag=0
while read route_line
do
if [ "$flag" -eq "0" ]; then
multilink=`echo $route_line | awk '{if ($2=="equalize") print $0}'`
if [ -n "$multilink" ]; then
flag=1
continue
fi
fi
if [ "$flag" -eq "1" ]; then
nexthop=`echo $route_line | awk '{if ($1=="nexthop") print $0}'`
if [ -n "$nexthop" ]; then
multilink=$multilink" "$nexthop
continue
else
echo "ip route add "$multilink
fi
fi
IPROUTE="/bin/iproute add "$route_line" table "$table_name
echo $IPROUTE
flag=0
done < $routelist[/code]
設標誌變量,一行一行地找,呵呵:em02: |
用awk也行:
awk -v RS="" 'gsub(/\n[ \t]+/," ")||1' |
| |