2010-08-31 39 views
0

我試圖創建一個文本文件,其中包含所有包含第一行中的某個字符串的所有日誌文件的列表。更具體地說,SAS日誌文件。用於將特定日誌文件列表輸出到文本文件的Bash腳本

目前我有一個簡單的腳本,它將搜索整個系統中的「* .log」文件並將整個列表輸出到文本文件。

有沒有辦法只輸出包含特定字符串的日誌文件?

這是當前的命令:

find `pwd` -name "*.log" > sas_log_list.txt 

每個SAS日誌文件包含在第一行相同的字符串。
此字符串是:

1 SAS系統

所以基本上我要爲包含上述字符串的日誌文件,並輸出這些文件名的文件系統搜索到一個文本文件中。

在此先感謝,傑森

+0

我如何能做到這一點在Windows以及任何想法。我當前的Windows命令如下所示: dir/b/s/-p * .sas/o:n | findstr/E .sas>「%CD%」\ win_file_list.txt – 2010-08-31 20:37:58

+0

使用'.'而不是'''pwd \''。 – 2010-09-01 00:36:43

回答

0
find `pwd` -name "*.log" -exec grep "The SAS System" {} \; 

find \`pwd\` -name "\*.log" | grep -i "the sas system" 
0

除非我記錯了,你不需要調用pwd。我認爲這會讓你得到你想要的。您可以在grep上使用-l標誌來獲取文件名而不是匹配的行。

find . -name "*.log" -exec grep -l "The SAS System" {} \; > sas_log_list.txt

+0

我試圖將修改的日期現在也添加到輸出文件。以便輸出將包含每行上每個日誌文件的修改日期和完整路徑。這是我正在嘗試的: find pwd -mtime -2 -name「* .log」-exec grep -l「SAS System」{} \; > sas_log_list.txt – 2010-09-17 19:20:13

+0

也許沿着這些路線,然後呢? 'find pwd -mtime -2 -name「* .log」-exec grep -l -Z「SAS系統」{} \; | xargs -0 ls -l> sas_log_list.txt' – ngroot 2010-09-17 19:50:27

+0

我可以爲過去30天內創建的應用做些什麼嗎?似乎我不能將-mtime更改爲-30,或者我可以嗎? – 2010-09-17 20:36:41

0

我已經嘗試通過只讀取每個文件的第一行,使事情更快一點。這會打印出匹配模式的文件名稱。

(IFS=$'\n' ; for f in $(find `pwd` -name "*log" -type f) ; do 
    head -n 1 "$f" | grep -q "The SAS System" && echo "$f" 
done) 

更新1:編輯處理包含使用Charles Duffy提供one of the techniques空格路徑名。我無法使用find -exec .. +表達式,因爲{}不能出現一次以上。感謝ghostdog74Telemachus

更新2:添加完整路徑和最後修改時間

(IFS=$'\n' ; for f in $(find . -name "*log" -type f) ; do 
    head -n 1 "$f" | grep -q "The SAS System" && echo $(readlink -f "$f") $(stat -c %y "$f") 
done) 
+0

用空格隔開文件 – ghostdog74 2010-08-31 23:33:00

+1

@ ghostdog74爲什麼不提及如何解決這個問題? @unhillbilly引用第2行中出現的兩個'$ f'(以防止由於文件名中的空格造成的問題)。 – Telemachus 2010-09-01 01:10:47

+0

@ ghostdog74事實上,它確實會失敗,包含空格的路徑。 @Telemachus我需要的不僅僅是引用,因爲'for'構造也會讓事情變得糟糕。我會解決它。 – 2010-09-01 13:43:42

3

這個問題最難的部分是僅在第一線搜索。 最準確的一個襯墊(在這裏打破了可讀性)我能想出是:

find . -name '*.log' -type f -readable ! -size 0 \ 
     -exec sed -n '1{/The SAS System/q0};q1' {} \; \ 
     -print 

由於sed語法的晦澀本質,一些解釋是爲了:

  • 1{...}會僅對第一行進行評估。
  • 如果正則表達式匹配,則/regex/q0命令將退出並退出代碼0(成功)(考慮將/^regex$/用於匹配整個行與該正則表達式)。
  • 如果我們沒有因上一次匹配而退出,下一個命令q1將退出並退出1(失敗)。

find使用該sed命令作謂語和-print只有當它是真實的。但是有一個小障礙。顯然如果文件是-size 0sed將立即exit 0沒有評估其論點。出於這個原因,我們需要! -size 0參數find

正如@Brandon Horsley所建議的那樣,-type f將產生較少的錯誤,而我們在此時可以驗證該文件是否也是-readable

+0

好的解決方案,對整個文件進行整理是過度的。我會爲查找添加'-type f',並且會引用'* .log'而不是轉義它,但是否則這就是我如何處理這個問題。 – 2010-08-31 20:37:13

0

慶典4

shopt -s globstar 
shopt -s nullglob 
for logfile in **/*.log 
do 

    read firstline<"$logfile" 
    case "$firstline" in 
     *"The SAS System"*) echo "$logfile" >> sas_log_list.txt 
    esac 

done 
+0

爲什麼'exec'?爲什麼不'閱讀第一行<「$ logfile」'? – 2010-09-01 00:33:43

相關問題