## 11.1 開始之前:什么是正則表達式
約略了解了 Linux 的基本指令 ([BASH](../Text/index.html)) 并且熟悉了 [vim](../Text/index.html) 之后,相信你對于敲擊鍵盤的打字與指令下達比較不陌生了吧? 接下來,下面要開始介紹一個很重要的觀念,那就是所謂的“正則表達式 (Regular Expression)”啰!
* 什么是正則表達式
任何一個有經驗的系統管理員,都會告訴你:“正則表達式真是挺重要的!” 為什么很重要呢?因為日常生活就使用的到啊!舉個例子來說, 在你日常使用 [vim](../Text/index.html) 作文書處理或程序撰寫時使用到的“搜尋/取代”等等的功能, 這些舉動要作的漂亮,就得要配合正則表達式來處理啰!
簡單的說,正則表達式就是處理字串的方法,他是以行為單位來進行字串的處理行為, 正則表達式通過一些特殊符號的輔助,可以讓使用者輕易的達到“搜尋/刪除/取代”某特定字串的處理程序!
舉例來說,我只想找到 VBird(前面兩個大寫字符) 或 Vbird(僅有一個大寫字符) 這個字樣,但是不要其他的字串 (例如 VBIRD, vbird 等不需要),該如何辦理?如果在沒有正則表達式的環境中(例如 MS word),你或許就得要使用忽略大小寫的辦法, 或者是分別以 VBird 及 Vbird 搜尋兩遍。但是,忽略大小寫可能會搜尋到 VBIRD/vbird/VbIrD 等等的不需要的字串而造成困擾。
再舉個系統常見的例子好了,假設你發現系統在開機的時候,老是會出現一個關于 mail 程序的錯誤, 而開機過程的相關程序都是在 /lib/systemd/system/ 下面,也就是說,在該目錄下面的某個文件內具有 mail 這個關鍵字,你想要將該文件捉出來進行查詢修改的動作。此時你怎么找出來含有這個關鍵字的文件? 你當然可以一個文件一個文件的打開,然后去搜尋 mail 這個關鍵字,只是.....該目錄下面的文件可能不止 100 個說~ 如果了解正則表達式的相關技巧,那么只要一行指令就找出來啦:“grep 'mail' /lib/systemd/system/*” 那個 grep 就是支持正則表達式的工具程序之一!如何~很簡單吧!
談到這里就得要進一步說明了,正則表達式基本上是一種“表達式”, 只要工具程序支持這種表達式,那么該工具程序就可以用來作為正則表達式的字串處理之用。 例如 vi, grep, awk ,sed 等等工具,因為她們有支持正則表達式, 所以,這些工具就可以使用正則表達式的特殊字符來進行字串的處理。但例如 cp, ls 等指令并未支持正則表達式, 所以就只能使用 [bash 自己本身的萬用字符](../Text/index.html#settings_wildcard)而已。
* 正則表達式對于系統管理員的用途
那么為何我需要學習正則表達式呢?對于一般使用者來說,由于使用到正則表達式的機會可能不怎么多, 因此感受不到他的魅力,不過,對于身為系統管理員的你來說,正則表達式則是一個“不可不學的好東西!” 怎么說呢?由于系統如果在繁忙的情況之下,每天產生的訊息信息會多到你無法想像的地步, 而我們也都知道,系統的“[錯誤訊息登錄文件 (第十八章)](../Text/index.html)” 的內容記載了系統產生的所有訊息,當然,這包含你的系統是否被“入侵”的記錄數據。
但是系統的數據量太大了,要身為系統管理員的你每天去看這么多的訊息數據, 從千百行的數據里面找出一行有問題的訊息,呵呵~光是用肉眼去看,想不瘋掉都很難! 這個時候,我們就可以通過“正則表達式”的功能,將這些登錄的信息進行處理, 僅取出“有問題”的信息來進行分析,哈哈!如此一來,你的系統管理工作將會 “快樂得不得了”啊!當然,正則表達式的優點還不止于此,等你有一定程度的了解之后,你會愛上他喔!
* 正則表達式的廣泛用途
正則表達式除了可以讓系統管理員管理主機更為便利之外,事實上,由于正則表達式強大的字串處理能力, 目前一堆軟件都支持正則表達式呢!最常見的就是“郵件服務器”啦!
如果你留意網際網絡上的消息,那么應該不難發現,目前造成網絡大塞車的主因之一就是“垃圾/廣告信件”了, 而如果我們可以在服務器端,就將這些問題郵件剔除的話,用戶端就會減少很多不必要的帶寬耗損了。 那么如何剔除廣告信件呢?由于廣告信件幾乎都有一定的標題或者是內容,因此, 只要每次有來信時,都先將來信的標題與內容進行特殊字串的比對,發現有不良信件就予以剔除! 嘿!這個工作怎么達到啊?就使用正則表達式啊!目前兩大郵件服務器軟件 sendmail 與 postfix 以及支持郵件服務器的相關分析軟件,都支持正則表達式的比對功能!
當然還不止于此啦,很多的服務器軟件都支持正則表達式呢!當然, 雖然各家軟件都支持他,不過,這些“字串”的比對還是需要系統管理員來加入比對規則的, 所以啦!身為系統管理員的你,為了自身的工作以及用戶端的需求, 正則表達式實在是很需要也很值得學習的一項工具呢!
* 正則表達式與 Shell 在 Linux 當中的角色定位
說實在的,我們在學數學的時候,一個很重要、但是粉難的東西是一定要“背”的, 那就是九九乘法表,背成功了之后,未來在數學應用的路途上,真是一帆風順啊! 這個九九乘法表我們在小學的時候幾乎背了一整年才背下來,并不是這么好背的呢! 但他卻是基礎當中的基礎!你現在一定受惠相當的多呢 ^_^!
而我們談到的這個正則表達式,與前一章的 [BASH](../Text/index.html) 就有點像是數學的九九乘法表一樣,是 Linux 基礎當中的基礎,雖然也是最難的部分, 不過,如果學成了之后,一定是“大大的有幫助”的!這就好像是金庸小說里面的學武難關:任督二脈! 打通任督二脈之后,武功立刻成倍成長!所以啦, 不論是對于系統的認識與系統的管理部分,他都有很棒的輔助啊!請好好的學習這個基礎吧! ^_^
* 延伸的正則表達式
唔!正則表達式還有分喔?沒錯喔!正則表達式的字串表示方式依照不同的嚴謹度而分為: 基礎正則表達式與延伸正則表達式。延伸型正則表達式除了簡單的一組字串處理之外,還可以作群組的字串處理, 例如進行搜尋 VBird 或 netman 或 lman 的搜尋,注意,是“或(or)”而不是“和(and)”的處理, 此時就需要延伸正則表達式的幫助啦!借由特殊的“ ( ”與“ | ”等字符的協助, 就能夠達到這樣的目的!不過,我們在這里主力僅是介紹最基礎的基礎正則表達式而已啦!好啦!清清腦門,咱們用功去啰!

**Tips** 有一點要向大家報告的,那就是:“**正則表達式與萬用字符是完全不一樣的東西!**” 這很重要喔!因為“萬用字符 (wildcard) 代表的是 bash 操作接口的一個功能”,但正則表達式則是一種字串處理的表示方式! 這兩者要分的很清楚才行喔!所以,學習本章,請將前一章 bash 的萬用字符意義先忘掉吧!
老實說,鳥哥以前剛接觸正則表達式時,老想著要將這兩者歸納在一起,結果就是...錯誤認知一大堆~ 所以才會建議您學習本章先忘記萬用字符再來學習吧!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀