تبحث عن التعابير المنطقية لاستخراج عناوين البريد الإلكتروني من /etc/passwd

StackOverflow https://stackoverflow.com/questions/95305

  •  01-07-2019
  •  | 
  •  

سؤال

معظم المستخدمين عناوين البريد الإلكتروني المرتبطة الشخصي في /etc/passwd.هم دائما في 5 الميدانية التي لا يمكن الاستيلاء ، ولكنها تظهر في أماكن مختلفة ضمن قائمة مفصولة بفواصل في 5 الميدانية.

شخص ما يمكن أن تعطيني regex لانتزاع فقط عنوان البريد الإلكتروني (delimeted بفواصل) من خط في هذا الملف ؟ (سوف أكون باستخدام البقرى و 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
هل كانت مفيدة؟

المحلول

ماذا عن:

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

حيث تحتوي على عنوان البريد الإلكتروني.

[تحديث استنادا إلى تعليق هذا العنوان لا تحصل دائما على إنهاء بفاصلة]

نصائح أخرى

معيار البريد الإلكتروني العادية التعبير يجب أن تعمل بشكل جيد:

http://regexlib.com/DisplayPatterns.aspx

يمكنك أيضا تجربة ممتازة: الموقع!

في الحقيقة يبدو هذا العمل المثالي بالنسبة Awk.الآن, مثل معظم الناس سوف أقول "أنا لست خبيرا في Awk" قبل الشروع في...

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

سوف تحصل على 5 الميدانية حيث ':' هو فاصل حقل من /etc/passwd - ربما 5 الميدانية كنت ترغب.

awk -F , '{print $1}'

سوف تحصل على 1 الميدانية من المدخلات القياسية حيث ',' كان delimimter حتى

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

سوف تحصل على أول مفصولة بفواصل مجال (اسم الحقل) من الخامسة القولون فصل المجال (الحقل مع كل هذا الغبار المتراكم تحت السرير في ذلك!) في /etc/passwd file.

ضبط الطباعة 1 دولار للحصول على الميدان مع رسائل البريد الإلكتروني الخاص بك في ذلك.

دون شك هناك بعيدا أن تفعل هذا دون الأنابيب في Awk.يمكنني استخدام Awk عن تقسيم من الحقول في الأشياء وليس أي شيء آخر.أجد أنه من مربكة من شخص يحب التعبيرات العادية...

راجع للشغل الخامس الحقل المعروفة باسم النظام العالمي لمراقبة المناخ المجال.مكتوبة في بعض الأحيان GECOS.

sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd

سوف تفعل خدعة

البحث عن كل البريد الإلكتروني-صالح-الأحرف قبل و بعد علامة@.مثل:

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

الجشع مطابقة يجب سحب كل ما يمكن, و سوف تتوقف عند الفواصل أو نقطتين.

تحقق من الشخصيات التي هي صالحة في عناوين البريد الإلكتروني ، على الرغم من.لقد تركت بعض (مثل +)

sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
[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

ماذا عن مستوى 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])+)\])

نعم.هذا هو.:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top