2017-07-06 40 views
0

我試圖尋找文本Elapsed time內的特定日誌文件名vsim.log。我不熟悉的grep,但一些谷歌搜索後,我發現grep -r將允許我做遞歸搜索和grep -r "Elapsed time"將對我的目錄中的所有文件中的該短語進行遞歸搜索。根據這個鏈接,我可以做grep -r "Elapsed time" ./vsim*遞歸搜索文件的目錄,從vsim開始,並查看這些文件的Elapsed time。但是,當我試着這個我得到grep: No match.,我知道是不正確的,因爲我知道那些關鍵字存在的文件。我在搞什麼?使用grep遞歸搜索特定關鍵字內的特定文件名的子目錄

+2

爲什麼不使用'find/path/to/search -type f -name「的結果vsim.log」 '然後搜索一個或幾個文件。它會更快。 –

+0

@ DavidC.Rankin因爲我對Linux不是很熟悉,並且我還沒有真正意識到可用的功能,因爲我仍然在學習。也就是說,目前速度並不是太多的因素,但我一定會讀到發現,並且可能學會如你所說的去做。 – dorojevets

+0

我提供了一個例子作爲答案。如果您還有其他問題,請告訴我。 –

回答

1

從我的評論繼續,您可以使用find來定位文件vsim.log如果你不知道它的確切位置,然後使用-execdir選項findgrep文件,任期Elapsed time,例如

find path -type f -name "vsim.log" -execdir grep -H 'Elapsed time' '{}' + 

這將返回文件名以及匹配的文本,您可以根據需要簡單地解析文件以隔離文件名。通過將find命令的結果反饋到while read -r循環中,您可以處理所有匹配的文件(如果您預計有多個文件匹配)。

while read -r match; do 
    # process "$match" as desired 
    echo "Term 'Elapsed time' found in file ${match%:*}" 
done < <(find path -type f -name "vsim.log" -execdir grep -H 'Elapsed time' '{}' +) 

其中:

  • find是瑞士軍刀爲您的系統上查找文件

  • path可以是任何相對絕對路徑搜索(例如$HOME/home/dorojevets)來搜索你的home目錄

  • 選項-type f告訴找只查找文件(見man find的鏈接處理)

  • 選項-name "foo"告訴找到只名爲foo找到文件的所有文件(通配符允許)

  • -exec-execdir選項允許用戶執行對每個文件(由'{}'表示)下面的命令

  • grep -H 'Elapsed time' '{}'是對每個文件名執行命令

  • +是什麼告訴find它已達到(與-exec使用\;)命令

  • 最後的結束時,${match%:*}參數擴展上的變量$match用於解析filename from filename:Elapsed time通過grep -H返回(只是被用來從$match右邊修剪一切,第一:%:*

給一個嘗試和執行時間比較文件樹的遞歸grep。如果您知道包含所需信息的文件名的某些部分(或文件模式時間或權限集合等),那麼您在此討論中可能會丟失的內容是您使用的是find。它可以在文件樹中搜索數百萬個文件,比每個文件遞歸地遞歸grep快得多。如果你不知道什麼文件可能包含所需的信息 - 然後使用grep,只需等待...

+0

這會在我執行的文件中,還是我將整個事件輸入終端? – dorojevets

+0

您只需將其輸入到您的終端或將其包含在腳本中即可。 Bash非常靈活。您可以在命令行上執行任何操作,您可以放入腳本,反之亦然......如果在腳本中使用,請在第一行包含'#!/ bin/bash',告訴解釋器使用'bash'而不是其他一些shell。我更新了'while'循環來吐出包含任何'Elapsed time'匹配文件的完整路徑作爲例子。 –

+0

我也刪除了'tmp',它只是我用來確認行爲的目錄名稱。實際上,你告訴'find'開始搜索,例如'find/path/to/search'(它會遞歸搜索下面的所有內容)。它可以是*相對*或*絕對*路徑。如果你在整個根文件系統上運行'find',那麼包括'-mount'選項以防止搜索可能包含很多不是文件的'/ dev','/ proc'和'/ sys'系統目錄。 –

相關問題