shell指令碼是Linux的核心之一,而Regex是shell指令碼的核心之一,理解Regex可以快速匹配需要尋找的內容,對以後的shell指令碼編程打下一個堅實的基礎。
接觸Regex一般從grep命令開始,例如:
grep "^#[:space:]*" /etc/inittab
這個命令中“^#[:space:]*”就是Regex的內容,它的意思是“以#開頭後跟任意個空格”,結合grep命令,就是顯示/etc/inittab檔案裡“以#開頭後跟任意個空格”的內容。
grep命令的作用是尋找匹配的內容並列印出來
grep [option] Regex 要查抄的檔案
-i 不區分大小寫
-color 以高亮顯示匹配的常值內容
-E 使用擴充的元字元
-v 取反
那麼Regex分有哪些?
—————————————————————————————————————————————————————
在shell裡,Regex分為,標準元字元、擴充元字元
標準元字元: ^ $ . * [] [x-y] [^] \ \< \> \(...)\ x\{m\n}
擴充元字元: ^ $ . * [] [^] + ? a|b ()
相關資料:http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
#可在上面的連結裡查到各自的意思
另外一個重要的知識:posix方括弧字元集
[:alnum:] [:lower:] [:xdigit:]
[:alpha:] [:print:] [:blank:]
[:blank:] [:punct:]
[:cntrl:] [:space:]
[:graph:] [::upper:]
上面的例子grep "^#[:space:]*" /etc/inittab 裡[:space:]代表空白字元,posix字元集和Regex配合使用可以產生很強大的功能,許多時候我們都可以藉助它來實現自己的目的。
例如:顯示/boot/grub/grub.conf檔案中以一個或多個空白字元開頭的行
grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
#這個命令裡注意 ^和[]的使用,通常^[]用來匹配開頭是某個字元,^[[:space:]]因為要求匹配的是開頭是空白字元,所以用[[:space:]]而不是[:space:],如果錯誤的寫成^[:space:]那麼就錨定[]裡的內容,現在知道[]的作用了吧:錨定某個字元,多個代表多個可能
下面幾個難度稍高一點的練習來學習理解Regex
1.顯示/etc/inittab檔案中以一個數字開頭並以一個與開頭數字相同的數字結尾的行;
2.ifconfig命令可以顯示當前主機的IP地址相關的資訊等,如果使用grep等文本處理命令取出原生各IP地址,要求不包127.0.0.1;
3.顯示/etc/sysconfig/network-scripts/ifcfg-eth0檔案中的包含了類似IP地址點分十進位數字格式的行;
##答案:
1. grep "^\([0-9]\).*\1$" /etc/inittab
2. ifcofig | grep "inet addr" | grep -v '127.0.0.1' | cut -d: -f2 | cut -d "" f1
3. grep -E "([0-9]{1,3}\.){3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-eth0
grep "[0-9]\{1,3\}\.\"{3\}\.[0-9]\{1,3\} /etc/sysconfig/network-scripts/ifcfg-eth0
##解析
1. ^[0-9]錨定開頭的數字 使用\(...\) \1 將^[0-9]傳遞給\1 $用來錨定結尾
2. 首先grep提出去含有inet addr的內容,-v取出‘127.0.0.1’使用cut命令 -d 來截取第一個欄位
3. 使用-E解法 ([0-9])\{1,3} [0-9]的數字至少出現1次,至多出現3次 \. 轉義 . 符號 {3} 顯示三次前面()的內容\.[0-9]{1,3}匹配後面的3位元字
grep解法可以自己琢磨下