回首頁
修改
Mail
FTP

中




2007年11月17日 星期六

[Linux]串流編輯工具Sed深入了解

先來簡單介紹Sed由來
此工具是所有Unix系統都有的過濾工具,如其名sed
它能夠讀來自stdin(標準輸入)或檔案的文字串流,依據給他的指示及程式
來改變內容輸出到 Stdout(標準輸出)
主要的語法:
sed [options] 'Command' [files]
常用參數:
-e cmd 後面接命令(此參數可加可不加)
編輯命令:
常用的s(替換),d(刪除),g(全域替換),a(新增),c(取代)
下面我們用舉例方式才能深入你心ㄚ
s(替換):
以我們常用的ifconfig eth0來說,一般我們打此指令為了要看ip或mac
eth0
Link encap:Ethernet HWaddr 74:73:F1:52:8A:1A
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

那麼我只要截取addr:192.168.1.11 的地方,該怎做呢?
ifconfig eth0|grep 'inet '|sed 's/^.*addr://g'\
>sed 's/Bcast//g' 按enter
結果:192.168.1.11 成功輸出我們要的結果

上面最後一個\符號是讓您新增一個行程每增加一個行程都要在加上\這符號唷!
因為我一行打不下為了不破壞一整行的連貫性 就用這種方式來show
你可想成只是把|管線換成\來輸入 差別在於"一次打完與分次打" 懂了吧!
其實把每一個管線分開打,在結合在一起 就可以看出端倪了!
grep 'inet '
這是因為我們只要inet這一行所以就先用grep來截取inet此行列
sed 's/^.*addr://g'
上列為將行首到":"之間的字元取代,取代欄無任何字串所以是刪除的意思,
其語法是s/欲更改值/欲替換值/旗標
所以s/^.*addr: <- ^.* 的^是指行首開始 .* 就代表零個或多個任意字元
而後面的 //g <- /空/g 因為裡面的替換值是空的所以就等於刪除 g就是全域替換
所以如果命令只輸入到此 結果會是:
ifconfig eth0|grep 'inet '|sed 's/^.*addr://g'\
結果:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0

前面的inet addr:不見了但Bcast之後還在..
所以還需要在輸入以下行程:
sed 's/Bcast.*$//g'
分解語法:從Bcast一直到最後面都取代成替換值 因為無替換值就全刪除
Bcast.*$ <-從b一直到行尾間的字串都會被取代的意思 懂了吧!ㄏㄏ
ps.上述都有用到正規表示法,所以建議要有一些概念會比較容易理解

待續...

0 回應: