文檔編輯
grep
grep這個指令名稱其實是來自於正規表示法的g/RE/p,其意義是代表以正規表示法全域搜尋並列印出來(globally search for RE and print it)。
grep 關鍵字 檔案1 檔案2 ...
# 在 /etc/os-release 檔案中搜尋 Ubuntu 關鍵字
grep Ubuntu /etc/os-release
Output
NAME="Ubuntu"
PRETTY_NAME="Ubuntu 18.04.3 LTS"
不分大小寫
grep 預設會區分字母的大小寫,如果希望以不分大小寫的方式搜尋,可以加上 -i 參數:
# 不分大小寫
grep -i Ubuntu /etc/os-release
標示行號
若要標示匹配文字的行號,可以加上 -n 參數:
# 標示行號
grep -n Ubuntu /etc/os-release
1:NAME="Ubuntu"
5:PRETTY_NAME="Ubuntu 18.04.3 LTS"
反向匹配
若想要將匹配的資料排除,只顯示出沒有關鍵字的那幾行資料,可以加上 -v 參數。例如顯示不包含 Ubuntu 關鍵字的那幾行:
# 顯示不包含 Ubuntu 關鍵字的行
grep -v Ubuntu /etc/os-release
遞迴搜尋檔案
如果想要在指定目錄與其子目錄下所有的檔案中,搜尋指定的關鍵字,可以加上 -r 參數:
# 在 /etc/ 下所有檔案中搜尋 ubuntu
grep -r ubuntu /etc/
如果只想要從特定的檔案中尋找關鍵字,可以使用 -r 搭配 --include 指定檔案類型:
# 在所有 *.conf 中尋找 ubuntu
grep -r --include="*.conf" ubuntu /etc/
如果自己的權限沒辦法讀取所有的檔案,就會出現某些檔案無法讀取的錯誤訊息,這時候可以將這種錯誤訊息導向 /dev/null,只看正常訊息就好:
# 不顯示錯誤訊息
grep -r ubuntu /etc/ 2>/dev/null
顯示前後幾行
有時候只顯示匹配成功那一行,不容易看出是否是我們想要找的資料,這時候可以加上 -A(After)、-B(Before)或-C(Context),指定要顯示的前後行數:
# 多顯示後一行
grep -A 1 Ubuntu /etc/os-release
# 多顯示前一行
grep -B 1 Ubuntu /etc/os-release
# 多顯示前後各一行
grep -C 1 Ubuntu /etc/os-release
顏色標示
grep 可以使用顏色標示的方式,將成功匹配的部分文字標示出來,方便使用者閱讀。顏色標示功能可以透過 --color=never、--color=always、--color=auto 這幾種參數來關閉、開啟或設為自動。開啟顏色標示的輸出會像這樣:
grep 顏色標示
正規表示法
grep 在搜尋關鍵字時,其實是以正規表示法的方式匹配文字的,所以一般的正規表示法都可以直接使用,以下是一些常用的範例。開頭與結尾是最常用的:
# a 開頭
ls | grep "^a"
# b 結尾
ls | grep "b$"
# a 或 b 開頭
ls | grep "^[ab]"
# a 或 b 結尾
ls | grep "[ab]$"
各種出現次數的指定:
# a 開頭,接著 b 出現零次以上
ls | grep "^ab*"
# a 開頭,接著 b 出現零次或一次
ls | grep "^ab?"
# a 開頭,接著 b 出現一次以上
ls | grep "^ab+"
多種字眼的組合,也很常用:
# 含有 ab 或 cd
ls | grep "ab|cd"
# 含有 ab 或 cd(另一種寫法,作用相同)
ls | grep -E "ab|cd"
如果只想要精準篩選出 net 這個單字,可以這樣寫:
# 含有 net 這個單字
ls | grep "<net>"
issue.net
這樣就只會出現含有 net 這一個單字的結果,像是 network 這樣的字眼就會被排除。
