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