本篇介紹如何使用 Linux 的 grep
指令,根據關鍵字或正規表示法找出想要的資料。
Linux 的 grep
是一個很好用的指令,可以從串流資料或檔案中,使用關鍵字或正規表示法(regular expression)篩選出想要尋找的資料,並且顯示出來,以下是 grep
的用法教學以及實際範例。
grep
這個指令名稱其實是來自於正規表示法的 g/RE/p
,其意義是代表以正規表示法全域搜尋並列印出來(globally search for RE and print it)。
搜尋關鍵字
grep
最基本的用法就是以普通的關鍵字來搜尋,其基本語法如下:
grep 關鍵字 檔案1 檔案2 ...
例如在 /etc/os-release
檔案中搜尋 Ubuntu
關鍵字:
grep Ubuntu /etc/os-release
NAME="Ubuntu" PRETTY_NAME="Ubuntu 18.04.3 LTS"
執行的結果會列出所有含有關鍵字的整行文字。
grep
亦可搭配萬用字元(*
)同時搜尋多個檔案,例如在 /etc/
目錄之下所有 *.conf
檔案中,尋找 network
這個字眼:
grep network /etc/*.conf
ltrace.conf:hex(uint) inet_network(string); nsswitch.conf:networks: files sysctl.conf:# Additional settings - these settings can improve the network sysctl.conf:# security of the host and prevent against some network attacks sysctl.conf:# redirection. Some network environments, however, require that these
搜尋多個檔案時,在輸出中會標示資料來源是哪一個檔案。
除了搜尋檔案內容之外,亦可搭配管線(pipe)篩選串流資料,例如篩選出含有 network
關鍵字的檔案名稱:
ls /etc/ | grep network
network networkd-dispatcher networks
不分大小寫
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
關鍵字的那幾行:
grep -v Ubuntu /etc/os-release
遞迴搜尋檔案
如果想要在指定目錄與其子目錄下所有的檔案中,搜尋指定的關鍵字,可以加上 -r
參數:
grep -r ubuntu /etc/
如果只想要從特定的檔案中尋找關鍵字,可以使用 -r
搭配 --include
指定檔案類型:
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
在搜尋關鍵字時,其實是以正規表示法的方式匹配文字的,所以一般的正規表示法都可以直接使用,以下是一些常用的範例。開頭與結尾是最常用的:
ls | grep "^a" ls | grep "b$" ls | grep "^[ab]" ls | grep "[ab]$"
各種出現次數的指定:
ls | grep "^ab*" ls | grep "^ab?" ls | grep "^ab+"
多種字眼的組合,也很常用:
ls | grep "ab|cd" ls | grep -E "ab|cd"
如果只想要精準篩選出 net
這個單字,可以這樣寫:
ls | grep "<net>"
issue.net
這樣就只會出現含有 net
這一個單字的結果,像是 network
這樣的字眼就會被排除。
參考資料:鳥哥的 Linux 私房菜、Carlos-Studio、Linux 命令大全
資料來源: https://blog.gtwang.org/linux/linux-grep-command-tutorial-examples/
沒有留言:
張貼留言