2015-05-27 14 views
2

操作系統 Ubuntu 14.04 64位LTS - 最小安裝更新。如何在許多大文件中找到電子郵件

規格: 2個6核Xeon, 12 GB ECC內存, 存儲RAID 10 = 4 TB, 文件系統EXT4 =,

以上服務器是專門爲這個項目。

期望的結果: 使用grep更有效,得到更少的誤報和「清潔工」的結果和出口僅電子郵件帳戶TXT文件。

概述: 我有各種格式的許多大型文件,的.csv,.excel,txt文件,.SQL等 一些文件被壓縮ZIP,RAR,GZ等。(我會嘗試zgrep下一步) 這些文件駐留在Windows 2012服務器上,我已將該共享掛載到Ubuntu盒子上,並且我需要將所有電子郵件解壓到txt文件。

我已經完成了大量的研究和玩各種正則表達式,但不能像預期的那樣100%工作。

例子:

第一次嘗試:

grep -Rs .*@.* . >> emails.txt 

第二次嘗試:(後研究)

grep -e '^.*\@.*\..*' -r -n -h >> emails.txt 

第三次嘗試:(BETT爲呃性能)

LANG=C grep -e '^.*\@.*\..*' -r -n -h >> emails.txt 

第四次嘗試:(甚至是 「好」 的表現,但是這取決於硬件)

cat * */* */*/* | parallel --pipe -N 250 --round-robin 「grep -e '^.*\@.*\..*' -r -n -h >> emails.txt" 

問題:

隨着第一,第二和第三次嘗試,我仍然得到一噸「垃圾」出口。 與第四個例子cat仍然抱怨文件夾,我試着用find .運行它,但後來我只得到在輸出中包含郵件帳戶的文件。

更新: 27/05/2015 - 1:35北京時間

從這個論壇進行更多的測試,並輸入和驚人的社區後,我對下面的解決現在:

的grep +電子郵件的正則表達式示例:

grep -r -o -n -h '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt 

grep -r -o -n -h '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt | sort | uniq -i 

變化:

grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt 

grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt | sort | uniq -i 

還在測試/進行:

潛在的速度增加:

LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt 

LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt | sort | uniq -i 

管道平行和分裂成多個進程(應增加速度取決於硬件):

cat * */* */*/* | parallel --pipe -N 250 --round-robin 「grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt" 

cat * */* */*/* | parallel --pipe -N 250 --round-robin 「grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt | sort | uniq -i" 

管道平行和分裂成多個進程(應增加速度取決於硬件)包括LANG = C:

cat * */* */*/* | parallel --pipe -N 250 --round-robin 「LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt" 

cat * */* */*/* | parallel --pipe -N 250 --round-robin 「LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt | sort | uniq -i" 
+0

會做階段性工作?您最終可以分階段刪除垃圾數據。 – npinti

+1

你在[SO]做了一個很好的研究,祝賀和歡迎!爲了更好地幫助您,我們希望看到您的一些輸入和預期輸出,以便我們可以「玩」它並找到更好的結果。還要注意的是一個正則表達式匹配的電子郵件地址[並非總是很短(http://stackoverflow.com/a/719543/1983854)... – fedorqui

+0

@npinti - 嗨,是的,分階段做,絕對會最好的選擇。 – Mookz

回答

0

得到一噸出口

可以使用「垃圾」的電子郵件正則表達式匹配較好,例如從this SO answer

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0‌​-9]‌​)?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$ 

(但也許是一個由@fedorqui更適合。)

我試着用find .運行,但然後我得到只有 包含在輸出

該命令的郵件帳戶文件

$ find . -type f -exec cat {} \; | grep myregex 

給你的每個文件的當前工作文件夾中的內容(它cat file每個項目)(在-type f)(該.)。正如你看到的,你可以把它管道grep/xargs/parallel/...

+0

謝謝你的意見,並指出我在正確的方向。我制定了以下內容,似乎運作良好。 grep -r -o -n -h'[[:alnum:] + \。\ _ \ - ] * @ [[:alnum:] + \。\ _ \ - ] *'。 >> emails.txt – Mookz

+0

@Mookz:你是否嘗試過使用'find *'方法而不是'cat * */* */*/*'? –

+0

yes thanks,「find。-type f -exec cat {} \; | grep -roh'[[:alnum:] + \。\ _ \ - ] * @ [[:alnum:] + \。\ _ \ - ] *'>> emails.txt「工作但不能找到」-type f -exec cat {} \ | | parallel --pipe -N 250 - round-robin「grep -roh'[[:alnum: ] + \。\ _ \ - ] * @ [[:alnum:] + \。\ _ \ - ] *'「>> email.txt」to work :( – Mookz

相關問題