1. 程式人生 > >使用grep查詢指定目錄下的關鍵字

使用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

這樣就可以方便的檢視輸出結果了。