2010年6月17日 星期四

linux 文字檔搜尋

好吧, 我知道怎麼搜尋某一個文字檔中的特定文字, 用 grep 就行, 我也知道怎麼從一堆檔案中搜尋某個檔案名, 用 find 加 grep 就行, 但是我怎麼從一堆檔案裡搜尋檔案內容中某個關鍵字呢? 像在 Windows 那樣的方便呢?

OS : Debian 5.0 (/var/log/installer/lsb-release)

好吧, 我知道可以先用 find 找出目錄下所有的檔案, 再用 file 這個指令判斷檔案類型, 再加上 grep 過濾出 text, 這樣我就找出所有的文字檔了

find / -type f -exec file {} \; | grep "text"

但是會出現一些錯誤訊息, 就把它丟到"空"裏面吧

find / -type f -exec file {} \; 2> /dev/null | grep "text"

然後我記得好像可以每一行取出第一個字串, 也就是我所需要的檔案名稱, 查了查用 awk 就可以了

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}'

此時, 我有了根目錄下所有文字檔的完整路徑與名稱, 但指令也夠長了, 而且故事還沒完啊, 我要怎麼把這些檔案"吐"給 grep 做搜尋呢? 直接"管線"好像不行, 但依稀記得有個 xargs 可以用, 於是指令又更長了

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword'

大功告成, 終於可以搜尋所有文字檔中某個關鍵字了, 但又有一些錯誤訊息, 再把它丟到"空"裏面

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword' 2> /dev/null

再來 awk 一次, 取出搜尋過後的檔案名稱

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword' 2> /dev/null | awk -F":" '{print $1}'

但是會有重複的檔案出現, 我只要出現一次就好了, 該怎麼辦才好, 忽然一眼瞥見有個 uniq 指令

find / -type f -exec file {} \; 2> /dev/null | grep "text" | awk -F":" '{print $1}' | xargs grep 'keyword' 2> /dev/null | awk -F":" '{print $1}' | uniq

耶, 終於得到我想要的結果了, 真是太高興了, 但這一串指令也未免太長了吧, 誰記得住啊, 應該有更好的方式吧...

沒有留言:

張貼留言