藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 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'



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com