[英]How to make grep to stop searching in each file after N lines?
最好通過一個假設的示例來描述用法:
在大量電子郵件存儲中搜索一些有用的標頭信息(每個電子郵件在單獨的文件中)。 例如,統計使用的頂級郵件客戶端應用程序的統計信息。
通常,如果您執行grep,則可以指定-m在第一次比賽時停止,但是假設電子郵件沒有聯系X-Mailer或我們在標題中尋找的內容? 它將掃描整個電子郵件。 由於大多數標頭的行數少於50行,可以通過告訴grep在任何文件中僅搜索50行來提高性能。 我找不到辦法。
我不知道它是否會更快,但是您可以使用awk做到這一點:
awk '/match me/{print;exit}FNR>50{exit}' *.mail
如果出現在前50行中,則將打印match me
匹配的第一行。 (如果您還想打印文件名,grep樣式,請更改print;
以print FILENAME ":" $0;
)
awk
沒有等效於grep
的-r
標志,但是如果您需要遞歸掃描目錄,則可以將find
與-exec
一起使用:
find /base/dir -iname '*.mail' \
-exec awk '/match me/{print FILENAME ":" $0;exit}FNR>50{exit}' {} +
您可以通過在grep
head -n50
來解決此問題,但這無疑會變慢,因為您必須為每個文件啟動兩個新進程(一個head
和一個grep
)。 您可以只用一個head
和一個grep
但是一旦找到魔術線,您將失去停止匹配文件的能力,並且用文件名標記這些線會很尷尬。
你可以做這樣的事情
head -50 <mailfile>| grep <your keyword>
試試這個命令:
for i in *
do
head -n 50 $i | grep -H --label=$i pattern
done
1.txt: aaaaaaaa pattern aaaaaaaa
2.txt: bbbb pattern bbbbb
ls *.txt | xargs head -<N lines>| grep 'your_string'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.