Sed學習筆記一

sed小技巧一  字符串提取


(1)取出 good 字符

2.sed命令

   s 查找並替換,將一個字符串替換成另一個

   g 與s聯合使用時,表示對當前行全局匹配替換

   p 打印匹配行

# echo I am good student. | sed 's@^.*am \([a-z].*\) stu.*$@\1@g

3.sed選項

-e 允許多項編輯

-n 取消默認輸出


4.正則表達式:

^word //以word開頭的行

Word$ //以Word結尾的行

. //匹配一個字符

*//匹配0個或多個字符

         grep -n 'ess*' test.txt

找出含有(es),(ess),(esss)等的字符串,注意,因爲(*)可以是0個,所以es也是符合搜索字符串。另外,因爲(*)爲重複“前一個字符”的符號,因此,在(*)之前必須要緊接一個重複字符。任意字符則爲(.*)

.* //匹配所有字符


實例說明:

# echo I am good student. | sed 's@^.*am \([a-z].*\) 
stu.*$@\1@g'


 

a)^.*am□ //這句的意思是以任意字符開頭到am□爲止,匹配文件中的“I am□”字符串

 

b)\([a-z].*\)□ //這句的外殼就是括號\(\),裏面的[a-z]表示匹配26個字母的任何一個,[a-z].* 合起來就是匹配任意多個字符,本題來說就是匹配good字符串,由於good字符串是需要保留的,因此用括號括起來匹配,後面通過\1來取good字符串。

 

c)□stu.*$ //表示以空格tea起始任意字符結尾,實際就是匹配good字符串後,緊接着的字符串“□student.”

 

d)後面被替換的內容中的\1就是取前面的括號裏的內容了,也就是我們要的good字符串。

 

取字符串的技巧

取出stat file顯示的權限數字

         

法1.# stat file | sed -n '4p' | sed 's@^.*(0@@g' | sed 's@/-.*@@g'
             644                           刪除前面半段      刪除後面半段

 

         

法2. # stat file | sed -n 's@^.*(0\([0-7].*\)\/-.*$@\1@gp'
             644                     直接匹配

    解釋:

      實例給出了正則表達式中小括號以及在sed中寄存器的用法,小括號在正則表達式中用來標記前面被匹配模式命中的字符串,在sed中,可以使用\1,\2,\3,以此類推,直到\9來保存被前面的給中匹配模式命中的字符串,最多可以標記9個,也就是可以使用9個寄存器。

 

stat file | sed -n 's#^.*(0\([0-7].*\)\/-.*$#\1#gp'

 

^ 以什麼字符開頭

. 任意一個字符,這任意一個字符的含義有兩層:1.字符的數量只有一個 2.字符包含各種可打印字符,即ASCII碼集內的字符

* 重複前面的字符0次或者多次

^.*的含義就是以任意字符開頭並後面重複了任意字符的字符序列

(0 就是匹配stat file這個命令的結果中的第二行的第一個(0這個字符串

Access: (0644/-rw-r--r--) Uid: (   0/   root)   Gid: (   0/   root)

\([0-7].*\)

\(\) 在正則表達式中用來保存被匹配模式命中的字符串,並將它保存到1號寄存器裏面,可以使用\1來引用它。

可以看出來,針對本題,匹配了644這個字符序列。

\/-.*$

$ 正則表達式中用來表示行的結尾

就是匹配形如 字符序列中含有/-並緊接着任意字符序列的結尾

#\1#

這個表示的是,把前面的字符串用\1取代,這裏\1就是644

 

-n、p選項的作用

sed -n 取消對匹配模式命中的字符串的打印。

 

在sed的模式中使用p命令表示,打印顯示緩衝區(Linux的sed中使用的一個用來顯示屏幕內容的緩衝區)中的內容。

 

把 -n 和p結合使用,能指定要打印的內容。

 

p是打印符合匹配模式的輸入行,模式就是要打印的,加了p,就要打印兩次。

-n是取消默認打印。

 

那麼,-n和p聯合使用,就是隻打印符合匹配模式的內容一次。

 

正是因爲這兩個參數,就使得stat file的輸出內容的其他行不被打印出來,加上上面說的正則表達式的作用,就只顯示644這個內容。

 

練習

Sed取出ip地址

# ifconfig eth0 | grep "inet[^6]" | sed -n 's#^.*:\([0-9].*\) *B.*$#\1#gp' | sed 's#\s*$##g'

^.*:  //匹配從行首開始到:冒號結束的任意長度字符串

*B.*$ //匹配從B開始到行尾的字符串

\([0-9]\) //匹配位於上述兩項之間的並且符合正則表達式[0-9]的字符串(數字0-9)

\1  引用\([0-9]\) 匹配成功的字符串 


Sed取出mac地址

# ifconfig eth0 | grep "Link[^6]" | sed -n 's@^.* \([0-9].*\)@\1@gp'

 

Awk取出ip地址

# ifconfig eth0 | awk -F'[ :]+' 'NR==2{print $4}'

 

Awk取出mac地址

# ifconfig eth0 | awk -F' ' 'NR==1{print $5}'



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章