1

私のユーザーのほとんどは、 のプロファイルに関連付けられた電子メール アドレスを持っています/etc/passwd。それらは常に 5 番目のフィールドにあり、これを取得できますが、5 番目のフィールドのコンマ区切りリスト内のさまざまな場所に表示されます。

このファイルの行から電子メール アドレス(コンマで区切られたもの)だけを取得するための正規表現を教えてもらえますか? (bash スクリプトから grep と sed を使用します)

ファイルからのサンプル行:

user1:x:1147:5005:User One,Department,,,email@domain.org:/home/directory:/bin/bash
user2:x:1148:5002:User Two,Department2,email2@gmail.com,:/home/directory:/bin/bash
4

7 に答える 7

6

どうですか:

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

グループに電子メール アドレスが含まれる場所。

[アドレスが常にコンマで終了するとは限らないというコメントに基づいて更新]

于 2008-09-18T18:28:45.627 に答える
5

実際、これは Awk にとって完璧な仕事のように見えます。さて、ほとんどの人と同じように、先に進む前に「私は Awk の専門家ではありません」と言うことにします...

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

':' が /etc/passwd からのフィールド区切り文字である 5 番目のフィールドを取得します。これはおそらく、必要な 5 番目のフィールドです。

awk -F , '{print $1}'

標準入力から最初のフィールドを取得します。ここで、「、」は区切り文字でした

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

/etc/passwd ファイルの 5 番目のコロンで区切られたフィールド (そのような類の雑多なフィールド!) から最初のカンマで区切られたフィールド (Name フィールド) を取得します。

print $1 を調整して、メールが含まれるフィールドを取得します。

間違いなく、Awk のパイプなしでこれを行う方法はありません。私は Awk を使用してフィールドを分割しますが、それ以外はあまり使用しません。紛らわしいと思いますが、それは正規表現が大好きな人からのものです...

于 2008-09-18T18:39:21.063 に答える
2
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd

トリックを行います

于 2008-09-18T19:12:11.107 に答える
1

@ 記号の前後にあるすべての email-valid-characters を検索します。お気に入り:

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

貪欲なマッチングは、可能な限りすべてを引き込む必要があり、コンマまたはコロンで停止します。

ただし、電子メール アドレスで有効な文字を確認してください。私はいくつかを残しました (+のように)

于 2008-09-18T18:29:02.273 に答える
0
sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
于 2010-03-19T04:29:42.770 に答える
-1

標準のRFC2822はどうですか?

(?:[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])+)\])

うん。それでおしまい。:)

于 2008-09-18T22:51:03.437 に答える
-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])?

ほとんどのエミアルをキャッチする必要があります

于 2008-09-18T18:29:08.357 に答える