- 語系對正則表達式的影響
LANG=C時:0 1 2 3 4 … A B C D … Z … a b c d … z
LANG=zh_CN時:0 1 2 3 4 … a A b B c C d D …z Z
所以使用正則表達式的時候,要特別注意,當時的環境,否則可能會發現與別人的選取結果不一樣。
爲了避免編碼造成的英文與數字選取問題,因此有些特殊符號我們需要了解。參數 含義 [:alnum:] 代表英文大小寫字符及數字,即0-9,A-Z,a-z [:alpha:] 代表任何英文大小寫字符,即A-Z,a-z [:blank:] 代表空格鍵與TAB鍵 [:cntrl:] 代表鍵盤上面的控制鍵,即包括CR,LF,Tab,Del等 [:digit:] 代表數字,即0-9 [:graph:] 除了空格符外其他所有按鍵 [:lower:] 代表小寫字符,即a-z [:print:] 代表任何可以被打印出來的字符 [:punct:] 代表標點符號,即" ’ ? ! ; : # $ [:upper:] 代表大寫字符,即A-Z [:space:] 代表會產生空白的字符,包括空白鍵tab和CR [:xdigit:] 代表十六進制的數字類型,因此包括0-9,A-F,a-f的數字與字符 - grep的高級參數
參數 含義 -A 後面接數字,是after的意思,除了列出搜尋出的這一行,後面n行也要列出 -B 後面加數字,是before的意思,除了列出該行外,前面n行也要列出 –color=auto 可將正確的那個選取數據列出顏色
grep在數據中查找一個字符串時,是以整行爲單位進行數據選取的。如果想讓grep默認使用顏色高亮關鍵字,那麼可以在~/.bashrc內加上alias grep=‘grep --color=auto’[root@www~]# dmesg | grep 'eth' eth0:RealTek RTL8139 at 0xee846000, 00:90:cc:a6:34:84,IRQ 10 eth0:Identified 8139 chip type 'RTL-8139C' eth0:link up,100Mbps,full-duplex.lpa,0xC5E1 eth0:no IPv6 routers present <==dmesg可以列出內核產生的信息,通過grep來選取網卡相關的信息。
- 利用中括號老查找集合字符
如果想要查找test和taste可以發現他們有共同的t?st存在
在中括號中,無論有幾個字母,都代表1個,並且字母與字母之間是或的關係。[root@www~]# grep -n 't[ae]st' regular_express.txt 8:I can't finish the test 9:Oh!The soup taste good
如果我們需要有oo的字符,但是oo前面沒有g
當我們不需要oo前面有小寫字符的[root@www~]# grep -n '[^g]oo' regular_express.txt 2:apple is my favorite food.t 3:Football game is not use feet only
[root@www~]# grep -n '[^a-z]oo' regular_epress.txt 5:However,this dress is about $ 3183 dollars. 15:You are the best is mean you are the no.1.
- 行首與行尾字符^$
- 如果想要查詢以什麼開頭的,就用^製表符
如果想要查詢一行字符以the開頭的
如果不想要開頭是英文字母的[root@www~]# grep -n '^the' regular_express.txt 12:the symbol '*' is represented as start
[root@www~]# grep -n '^[^a-zA-Z]' regular_express.txt 1:"Open Source" is a good mechanism to develop programs 21:# I am VBird
- 如果想要查詢以什麼結尾,就用$
如果要找出行尾結束爲小數點.的一行
想要找到哪一行是空白行[root@www~]# grep -n '\.$' regular_express.txt <==這裏需要注意小數點具有其他意義,所以必須用轉義字符 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food.
[root@www~]# grep -n '^$' regular_express.txt
- 如果想要查詢以什麼開頭的,就用^製表符
- 任意一個字符.與重複字符*
- 小數點代表一定有一個任意字符的意思
- 星號代表重複前一個0到無窮多次的意思,爲組合形態
[root@www~]# grep -n 'g..d' regular_rxpress.txt <==代表搜索g與d之間有兩個字符的行 1:"Open Spurce" is a good mechanism to develop programs. 19:Oh!The soup taste good. 16:The world <Happy> is the same with "glad".
[root@www~]# grep -n 'ooo*' regular_express.txt <==代表搜索有兩個o的字符的行。*代表*前面的字符含有0個或者0個以上 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 19:goooooogle yes!
- 限定連續RE字符範圍
grep -n 'o\{2\}' regular_express.txt <==代表篩選出包含兩個及以上連續o的字符的行 grep -n 'go\{2,5\}' regular_express.txt <==代表篩選出包含2個到5個連續o的字符的行,並且第一個o前面是g grep -n 'go\{2,\}' regular_express.txt <==代表篩選出兩個以上的連續o的字符的行,並且第一個o前面是g #在{}裏面如果有逗號,代表以上,沒有逗號代表X及以上
- sed工具
範例:sed [-nefr] 動作
注意:動作需要參數 含義 -n 使用安靜模式,一般情況下,所有來自STDIN的數據一般都會被列出到屏幕上,但如果加上-n參數,則只有經過sed特殊處理那一行纔會被列出 -e 直接在命令行模式下進行sed的動作編輯 -f 直接將sed動作寫在一個文件內,-f filename 可以執行filename內的sed動作 -r sed動作支持的是擴展型正則表達式的語法,-f filename則可以執行filename內的sed動作 -i 直接修改讀取的文件內容,而不是由屏幕輸出
n1,n2是可選的參數,代表進行動作的行數,舉例,如果動作需要在10到20行進行,則"10,20 [動作行爲]"function參數 含義 a 新增,a的後面接字符串,而這些字符串會在新的一行出現 c 替換,c的後面接字符串,這些字符串可以替換n1,n2之間的行 d 刪除,因爲是刪除,所以d後面通常不接參數 i 插入,i的後面可以接字符串,而這些字符串會在新的一行出現(目前的上一行) p 打印,也就是將某個選擇的數據打印出來,通常p參數與參數sed -n 一起運行 s 替換,可以直接進行替換工作,通常這個s的動作可以搭配正則表達式,如1,20s/old/new/g - 以行爲單位的新增/刪除功能
[root@www~]nl /etc/passwd | sed '2,5d' <==將/etc/passwd的內容列出來並打印行號,同時將2-5行刪除 [root@www~]nl /etc/passwd | sed '2d' <==將/etc/passwd的內容列出來並打印行號,同時將第2行刪除 [root@www~]nl /etc/passwd | sed '2,$d' <==將/etc/passwd的內容列出來並打印行號,同時將第2行到最後一行刪除
[root@www~]ml /etc/passwd | sed '2a drink tea' <==在第二行最後加上drink tea字樣 [root@www~]ml /etc/passwd | sed '2a drink tea or ......\drink bear' <==反斜槓的作用就是換行,在第二行增加了drink tea之後換行,增加drink bear,也就是原來的第三行變成了第四行
- 以行爲單位的替換與顯示功能
[root@www~]nl /etc/passwd | sed '2,5c No 2-5 number' <==把第二行到第五行替換爲No 2-5 number [root@www~]nl /etc/passwd | sed -n '2,7p' <==只打印2到7行,-n參數的用處是安靜模式,如果不加-n參數,那麼2到7行會重複輸出
- 部分數據的查找並替換功能
除了整行的處理模式之外,sed還可以用行爲單位進行數據的查找並替換的功能。
sed的查找與替換sed 's/要被替換的字符串/新字符串/g'
舉例子:[root@www~]# /sbin/ifconfig eth0 | grep 'inet addr' inet addr: 192.1.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 <==想只要ip地址,需要把addr前面的刪除,再把Bcast後面的刪除 [root@www~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 192.1.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 <==去掉了addr前面一部分 [root@www~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
- 直接修改文件內容
sed加上-i參數可以直接修改文件內容。[root@www~]# sed -i '$a # This is a test' regular_express.txt <==$代表最後一行,所以這命令意思是在最後一行新增
- 以行爲單位的新增/刪除功能
- 基礎正則表達式
RE字符 含義 word 查找的word在行首,例子grep -n ‘^#’ regular_express.txt 代表以#開頭 ord$ 查找的字符串在行尾,例子grep -n ‘!$’ regular_express.txt 代表以!結尾 . 代表一定有一個任意字符,例子grep -n ‘e.e’ regular_express.txt 代表e與e之間有一個字符 \ 轉義字符,把特殊符號的特殊意義去掉 * 重複零到無窮多個的前一個字符,例子grep -n ‘ee*’ regular_express.txt 代表至少有1個e [list] 從字符集合中選出想要選取的字符,例子grep -n ‘g[ld]’ regular_express.txt 代表有gl或者gd的行 [n1-n2] 從字符集合的RE字符中找出想要選取的字符範圍,例子grep -n ‘[0-9]’ regular_express.txt代表含任意數字的行 [^list] 從字符集合的RE字符裏面找到不要的字符串或者範圍,例子grep -n ‘oo[^t]’ regular_express.txt 代表不要含有oot的行 - 擴展正則表達式
grep僅支持基礎正則表達式,如果要使用擴展正則表達式,需要用grep -E 或者egrepRE字符 含義 + 重複一個或一個以上的前一個RE字符,例子egrep -n ‘go+d’ regular_express.txt 代表god good goood等等 ? 零個或一個RE字符,例子egrep -n 'go?d’代表gd 或者god | 用或的方式找出數個字符串,例子egrep -n ‘gd|good’ regular_express,txt 代表找出有gd或者good的行 () 找出"組"字符串,例子egrep -n -n ‘g(la|oo)d’ regular_express.txt 查找含有gla或者good的行 ()+ 多個重複組的判定,例子egrep ‘A(xyz)+C’ 查找以A開頭,以C結尾,中間含有一個以上xyz的字符串的行
正則表達式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.