簡體   English   中英

如何使grep在N行之后停止在每個文件中搜索?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM