使用grep查詢指定目錄下的關鍵字
之前於童鞋問我如下問題:
在/etc目錄下如何查詢包含’root’關鍵字的所有檔案?
對於一個指定的檔案來說通常使用下面的方法來查詢關鍵字:
1 |
grep 'keyword' file |
如果你懂得正則表示式,那麼還可以對關鍵字作更細緻的匹配。但是利用grep查詢指定目錄下的所有檔案我尚不清楚,通過man手冊以及論壇求助基本解決了上面的那個問題。
1.如何遞迴查詢
grep通常只能查詢指定數目的檔案,如果需要查詢某個目錄下的所有檔案必須新增-R或-r選項。這個選項比較好理解,如果我們要刪除一個非空的目錄那麼也必須對rm命令新增-r或-R選項。因此我們可以通過一下命令來完成本文一開始所提出的問題:
1 |
grep -R 'boot' /etc |
這樣好像已經解決了問題,不過從輸出的結果來看有一些匹配並不符合我們的要求。
1 |
/etc/grub.d/README:administrator. For example, you can add an entry to boot another OS as |
2 |
/etc/grub.d/20_memtest86+: if test -e /boot/memtest86+.bin ; then |
3 |
/etc/grub.d/20_memtest86+: prepare_boot_cache= "$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e " s/^/ |
4 |
\t/ ")" |
比如第三行所匹配的root並不是一個單獨的詞,而是包含在其他字串中。
2.完全匹配一個詞
通過上面的分析我們得知我們需要類似下面的舉例那樣匹配root關鍵字:
I am a root
root is me
I have root permission
而不是像下面這樣:
rooter is me
I am rooter
I have rooter permission
因此,我們還需要增加其他引數以達到完全匹配一個詞的目的。grep中使用-w選項來完全匹配一個單詞。因此我們的解決方法修改如下:
1 |
grep -R -w 'boot' /etc |
3.更友好的改進
通過上面的命令已經可以較好的解決本文一開始提出的問題了。不過,其輸出結果很長,不方便我們檢視。
如果我們需要知道該關鍵字位於被查詢檔案的哪一行,那麼可以加入-n選項:
1 |
grep -R -w -n 'boot' /etc |
有時候我們只需要知道該關鍵字包含在那個檔案中,因此我們加入-l選項:
1 |
grep -R -w -l 'boot' /etc |
這樣以來的確方便了檢視,不過由於輸出結果在一個螢幕下不能完全顯示,因此我們可以用more命令分屏檢視,或者直接將輸出結果重定位於指定的檔案中:
1 |
grep -R -w -l 'boot' /etc > ./output.txt |
這樣就可以方便的檢視輸出結果了。