# Grep篇
## 什麼是grep
**Grep** 是一個在 Linux&Unix 經常用到的指令,用來尋找一個檔案中符合 *規則表達式* 的工具,有關規則表達式的用法可以到看James的[這部影片](https://youtu.be/n_6TayWu6do?si=lYRleqPvhpfVnH-q)
補充一點,RE又分為BRE(Basic Regular Expression) 及 ERE(Extended Regular Expression),
可以看[這個](https://www.gnu.org/software/sed/manual/html_node/BRE-vs-ERE.html "GNU的解釋")。
## grep的變形
grep曾是一個大家族,像是 ```egrep```, ```fgrep``` 及 ```rgrep```, 不過後來被整合進了grep
變成了```-E```,```-F``` 及 ```-R```選項。
此外,目前也有許多搜尋工具的效率比原生grep還快,像是The Silver Srarcher(ag), Ripgrep等。
## ex編輯器
grep 這名字的由來可以追溯到ex編輯器。如果想透過ex編輯器搜尋一段文字,可以像這樣:
```:/Regular_Expression/p```
是不是有種似曾相識的感覺?沒錯,它就是被整合進vi編輯器中的指令工具,有關ex這款編輯器詳細用法可以參考++連耀南++教授的[這篇](https://www.cs.nccu.edu.tw/~lien/UNIX/VI/EX/index.html)。
其中有一個用法是將g放在命令開頭,代表 **檔案中的所有行** 或是 **執行一個全域的置換**:
```:g/Regular_Expression/p```
這就是grep命令的意義及名稱的由來,
也就是 **globally search for the regular expression and print out the line**。
使用grep的好處也很明顯,不需要再額外用 "//" 來包裹規則表達式,也比使用ex或vi簡潔。
*額外補充:++連耀南++教授也有整理出在Linux中常用到的兩大工具 [Sed](https://www.cs.nccu.edu.tw/~lien/UNIX/SED/index.html) 和 [Awk](https://www.cs.nccu.edu.tw/~lien/UNIX/AWK/index.html)* 有興趣的可以參考!
## grep的格式
```grep wordpattern filename1 filename2```
註: 如果wordpattern包含空白,則需要括上引號
範例: ```grep "root\|irc" /etc/passwd```
這裡使用到了 BRE(Basic Regular Expression) 語法,
透過在管道符號前加上反斜線 `\|` 來實現「或(OR)」的邏輯,藉此搜尋檔案中包含 root 或 irc 字串的行
## grep的回傳值
使用grep在/etc/passwd下搜尋"Really Cool",若符合的話將會把該行顯示在螢幕上。並會回傳一個中止值(exit status):
| 中止值 | 含意 |
| -------- | -------- |
| 0 | 有找到 |
| 1 | 沒找到 |
| 2 | 找不到檔案 |
在bash/zsh中,exit status可以使用 ```$?``` 打印出來,在zsh/Csh中也可以用 ```$status```。
```bash!
$ echo $? # for bash/zsh
% echo $status # for zsh/Csh
```
## grep的選項速查
| 選項 | 功能 |
| ------- | ------- |
| -b | 顯示匹配行在檔案中的位元組偏移量(byte offset)。這個選項在處理二進位制文件或者需要確切知道某個匹配字符串在文件中的位置時特別有用|
| -c | 顯示匹配行的數量而非顯示匹配行本身 |
| -h | 不顯示檔名 |
| -i | 在做比較時忽略字母大小寫(即大寫和小寫字母被視為相同) |
| -l | 只在成功匹配之檔案列出其檔名 |
| -n | 在每一行前顯示在檔案中相對的行數 |
| -q | 抑制所有標準輸出,但不包含標準錯誤輸出 |
| -s | 安靜的工作,除了錯誤訊息外不顯示人和東西,在檢查中止狀態時是有用的 |
| -v | 反轉搜尋只顯示不匹配之行 |
| -w | 把表達式當作一個字來搜尋,就像/<和/>包圍起來 |
| -E | 前身為egrep,表示使用額外的規則表達式 |
| -F | 前身為fgrep,表示將規則表達式的特殊字元當成一般字元 |
| -R | 前身為rgrep,遞迴搜尋目前目錄下的子目錄 |
---
此筆記參考書籍:++*Linux & Unix -- Shell程式設計篇*++