2016-03-01 55 views
1

我正在使用以下內容僅搜索報告名稱的第一行文件。它正在搜索整個文件。我認爲NR == 1只會搜索第一行。我認爲我的語法不好。似乎無法僅搜索文本的第一行

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/,NR==1 {print FILENAME; exit}' {} \; 

任何幫助表示讚賞。

我只想返回文件名。它使用6位數字作爲文件名掩碼查找過去8個小時。

+0

如果你想要的是文件名,爲什麼與'awk'裏面的文件進行搜索? Find的'-print'選項將打印文件名。 – ghoti

+3

它應該是'/我的報告標題/&& NR == 1' – hek2mgl

+0

標題是在第一行,這就是爲什麼我需要awk。感謝hek2mgl工作完美! –

回答

3

hek2gml's answer包含的關鍵指針 - 你必須使用邏輯&&而非範圍 - 但該命令可以在兩方面提高效率:

  • 對給定輸入文件進行短路處理,以便處理在第一行之後停止。
  • 傳遞(通常)所有文件到單個awk呼叫,通過終止-exec初級與+而非\;
find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/ { print FILENAME } { nextfile }' {} + 

此命令永遠只着眼於第1行每個輸入文件。


nextfile是不符合POSIX嚴格,因此,如果您awk沒有它(GNU awk中,Mawk,和BSD/OSX awk完成 - 不知道AIX),使用(效率較低,因爲它必須讀取每個文件的所有行):

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk 'FNR == 1 && /My Report Title/ { print FILENAME }' {} + 

如果在沒有nextfile,你寧願放棄awk一次爲每個文件-exec終止\;),如在原有解決方案的嘗試(讀只有每個fi的第一行樂,但呼籲awk一次每個文件):

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/ { print FILENAME } { exit }' \; 
+0

如果沒有'nextfile'命令,這會使情況變得更糟,因爲它需要掃描文件的所有行而不是第一行。但是,使用'nextfile'命令,它可能會顯示更好的性能,因爲'awk'只會根據需要調用,而不是每個文件。無論如何,我懷疑'{} +'是否是可移植的。看看同事蘋果,不要! – hek2mgl

+0

@ hek2mgl:是的,但是被'+'調用的_single_'awk'調用的效率抵消了 - 很難說這種情況下哪一個更好(取決於文件大小,磁盤速度等等)。 'nextfile'肯定是要走的路,但我不知道AIX的'awk'實現是否具有它。我用'\;'和(單個)文件短路添加了替代解決方案。 – mklement0

+1

@EdMorton:'-exec ... \;'調用_each_文件的命令; '-exec ... +'用_as命令調用它,因爲它可以放在命令行上(通常是所有;比如'xargs')。我已經爲我的答案添加了一個基於'\;'的替代方案,以防'nextfile'不可用。總的來說,最有效的組合是'nextfile' +'-exec ... +'。 – mklement0

2

看起來你認爲/My Report Title/,NR==1將是由,分開的一種條件列表。這個假設是錯誤的。

權在這種情況下會使用邏輯與運營商&&來連接條件:

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/ && NR==1 {print FILENAME; exit}' {} \;