今天我們來學習下 shell 中的 grep 和正則表達式。作爲基礎入門學習,也只是學習一些簡單的語法。
首先我們來看看 grep 查找命令。我們先來看看 man grep
我們看到 grep 的用法有很多,我們就來看看最常用的一些操作。
我們可以看到 grep "a" test.txt 和 cat test.txt | grep "a" 的效果是一樣的,都是查找 a 這個字符。那麼我們在前面加上 -v 呢,它表示的是除了帶有 a 字符剩餘的別的內容。
我們看到 -c 的意思是打印出所查找字符的行數, -v -c 就代表的是除所查找的字符以外的所有行數。
我們看到 -n 便是加上它所在的行號,同樣的也適用於 cat 命令。
我們看到 -A 2 是顯示所查找的字符的後兩行(after);-B 2 是顯示所查找的字符前兩行(before);-A 2 -B 2 和 -C 2 的效果是一樣的,都是顯示所查找字符的前後兩行的數據。
我們看到在 -r 選項是遞歸查找,如果我們在查找的子目錄中也有相應的字符串,那麼我們此時加上 -r ,便會全部查找到。
下來我們來學習下正則表達式,那麼爲什麼要學習正則表達式呢?正則表達式: a> 能模糊、快速匹配數據串;b> 爲學習 grep,awk,sed 等文本過濾命令做鋪墊;c > 編寫高級 bash 腳本的需要。那麼正則表達式有哪些元字符呢?[ ] \ ^ $ . | ? * + ( )
我們接下來來看看這些基本元字符的含義,如下
下來我們逐一來看看。
1、^
我們看到 ls | grep '^[0-9]' 查找的是以 0-9 開頭的文件,下面是 0-3 開頭的文件。在裏面加上 ^ 表示非 0-3 開頭的所有文件。
2、$
我們看到我們在查找以 e 結尾的字符,然後再以數字 0-9 開頭的,它只能嚴格匹配到 3e 和 4e;而 56e 只能以不是 ^ 開頭的這樣方式來進行匹配。
3、* 和 ?
我們看到在以數字開頭,?* 後面接任意字符的字符串全被打印出來了。
4、 .
我們看到在以 5 開頭,e 結尾的字符串 56e 被成功匹配出來;
5、pattern\{n\}
我們看到兩次的區別是什麼呢?前一次的是隻要符合條件就都匹配出來,加上 ^ 則表示只以兩個數字開頭的字符串被匹配出來。
6、pattern\{n, \}
我們看到效果是最少出現 2 次,在後面我們寫進去的 77777777 也被匹配出來了。
7、pattern\{n,m\}
我們看到這次是在數字開頭的 2 和 4 之間的字符串。經過學習了這麼多正則表達式的用法,發現它還是很靈活的,後面我們會繼續對正則表達式的學習。