2008-09-18 92 views
1

我的大多數用戶的電子郵件地址都與他們在/etc/passwd中的個人資料相關聯。他們總是在第五個領域,我可以抓住,但他們出現在第五個領域的逗號分隔列表中的不同位置。尋找正則表達式從/ etc/passwd中提取電子郵件地址

有人可以給我一個正則表達式來抓取電子郵件地址(用逗號隔開)從這個文件中的一行嗎? (我將使用grep和從一個bash腳本SED)

採樣線從文件:

user1:x:1147:5005:User One,Department,,,[email protected]:/home/directory:/bin/bash 
user2:x:1148:5002:User Two,Department2,[email protected],:/home/directory:/bin/bash 
+1

[http://www.regular-expressions.info/email.html](http://www.regular-expressions.info/email.html) – 2008-09-18 18:30:07

回答

7

什麼:

,([^ @] + @ [^ ,:] +)

當組包含電子郵件地址。

[基於評論該地址並不總是得到由逗號結尾更新]

+0

該字段僅有時與結束逗號 – Brent 2008-09-18 18:32:17

+0

因此,在使用RegEx之前,請始終預先添加並附加逗號。 – 2008-09-18 18:43:06

+0

或用[^,:]代替[^,]: - 我認爲這很簡單 – Brent 2008-09-18 19:34:15

1

BTW第五個字段的被稱爲全球氣候觀測系統領域。有時拼寫GECOS。

1

在@符號之前和之後搜索所有電子郵件有效字符。如:

[-A-z0-9。 ] + @ [ - A-z0-9。] +

貪婪的匹配應該拉入所有可能的東西,它會停在逗號或冒號處。

雖然,請檢查哪些字符在電子郵件地址中有效。我已經留下了一些了(如+)

+0

下劃線也是有效的... – 2008-09-18 18:30:21

-1
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? 

應該抓住最emials

5

其實,這看起來像一個用awk完美的工作。現在,最喜歡的人,我會說:「我在awk中沒有專家」,然後再繼續......

awk -F : '{print $5}' /etc/passwd 

將獲得第5場,其中「:」是從外地分離器/ etc/passwd文件 - 它可能你想要的第五個領域。

awk -F , '{print $1}' 

會從標準輸入獲得第一場,其中「」是他delimimter所以

awk -F : '{print $5}' /etc/passwd | awk -F , '{print $1}' 

將從第五冒號分隔場得到的第一個逗號分隔的字段(名稱字段)(中在你的/ etc/passwd文件中有所有類型的文件。

調整打印$ 1以獲取包含電子郵件的字段。

毫無疑問,在Awk中沒有管道的情況下,無需這麼做。我使用Awk將事物中的字段分開,而不是其他字段。我覺得很困惑,這也是從別人那愛的正則表達式...

-1

怎麼樣的標準RFC 2822

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

沒錯。而已。 :)

0
sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd 
相關問題