سؤال

وأنا أكتب حاليا النصي .sh بسيط لتحليل ملف سجل الاستيراد والتصدير سلاسل مطابقة "س". حاليا، عند عرض output.txt، كل ما هناك هو 0 المطبوعة على كل خط (606 خطوط). انا التخمين بلدي منطق خاطئ، كما AWK لا يلقي أي أخطاء.

وهنا هو رمز بلادي (محدث للقضايا سلسلة وصفة طبية). تحرير: لقد اعتمدت بعض التعليمات البرمجية الجديدة من الجواب dmckee أن أعمل الآن مع أكثر من القانون القديم لصالح البساطة

awk '/o'\''/ {
         line = "> ";
         for(i = 20; i <= 33; i++) {
           line = line " " $i;
         }
         print line;
    }' /var/log/exim/main.log > output.txt

وأي أفكار؟

وتحرير: لأجل وضوح، وأنا grepping ل "س" في عناوين البريد الإلكتروني، لأن 'هو حرف غير مسموح به في عناوين البريد الإلكتروني (وفي قواعد بياناتنا، لا تظهر الا مع الأسماء مسبوقة خفته)

وتحرير 2: وفقا لطلب التعليق، وهنا عينة مطهرة من بعض الناتج المرغوب فيه:

[xxx.xxx.xxx.xxx] kathleen.o'toole@domain.com <kathleen.o'toole@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] julie.o'brien@domain.com <julie.o'brien@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] james.o'dell@domain.com <james.o'dell@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] daniel_o'leary@domain.com <aniel_o'leary@domain.com> routing defer (-51): retry time not reached

والسبب أنا بدأت في 20 في بلدي حلقة لأن كل شيء قبل هذا المجال انه 20th معلومات السجل فقط القياسية التي ليست هناك حاجة لأغراض بلدي هنا. كل ما تحتاجه هو كل شيء من IP وخارجها لهذا الحل (الرسائل لكل خطأ 550 مختلفة لكل ملقم البريد في استخدام هناك. أنا تجميع قائمة من تلك الشائعة)

هل كانت مفيدة؟

المحلول

وليس هناك حاجة حقيقية لالبقرى هنا. دعونا AWK تحديد خطوط مطابقة بالنسبة لك (وتحديد علة سلسلة الخاص بك وفقا ΤΖΩΤΖΙΟΥ):

awk '/o'\''/ {
             line = "> ";
             for(i = 20; i <= 33; i++) {
               line = line " " $i;
             }
             print line;
        }' /var/log/exim/main.log > output.txt

وبطبيعة الحال، كنت في نهاية المطاف تحتاج إلى بعض غريب الهروب إذا كنت تفعل ذلك في الحجز promp مثل أعلاه. انها أنظف في برنامج نصي ...


وتحرير: على مرور أول فاتني + = مشكلة ...

وعلى افتراض أيضا أن الخط الذي أعطى أعلاه هو جزئي، لأنه ليس لديها سوى 13ish المجالات (عن طريق الحقول الافتراضية هي المساحة البيضاء محدد).

نصائح أخرى

و+ يعني إضافة عددية في AWK. إذا كنت ترغب في سلسلة، مجرد مكان الثوابت و / أو تعبيرات فصل بمسافات.

وهكذا، وهذا

line += " " + $i

وينبغي أن يصبح

line = line " " $i

وتحرير: <م> المنتدى ملفات سجل الاستيراد والتصدير (أنا أكثر في بوستفيكس :) تكون مفصولة بمسافة واحدة، ليست هي التالية أكثر بساطة:

grep -F o\' /var/log/exim/main.log | cut -d\  -f20-33 >output.txt

"" ليست غير قانونية في أجزاء المحلية. من RFC2821 ، القسم 4.1.2:

Local-part = Dot-string / Quoted-string

Dot-string = Atom *("." Atom)

Atom = 1*atext

RFC2822 للحصول على العناصر المحددة غير محليا، لذلك:

atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"

وبعبارة أخرى، "" هو غير المدرجة قانوني تماما characted أن يكون في localpart البريد الإلكتروني. الآن، قد لا تكون قانونية على في موقعك ، لكن هذا ليس ما قلته.

وعذرا لعدم البقاء مباشرة على الموضوع، ولكن أردت أن تصحيح التأكيد الخاص بك.

إيقاف المهمة، وأبسط ما زال: الثعبان

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top