في الحوار الاقتصادي الاستراتيجي أو AWK، كيف أتعامل مع فواصل سجل الذي * قد * خطوط متعددة تمتد؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

وملف السجل بلادي:

 Wed Nov 12 blah blah blah blah cat1
 Wed Nov 12 blah blah blah blah
 Wed Nov 12 blah blah blah blah 
 Wed Nov 12 blah blah blah blah cat2
     more blah blah
     even more blah blah
 Wed Nov 12 blah blah blah blah cat3
 Wed Nov 12 blah blah blah blah cat4

وأريد أن تحليل الخروج إدخالات متعدد الأسطر كاملة حيث تم العثور على القط في السطر الأول. ما هي أفضل طريقة للقيام بذلك في sed و / أو awk؟

وأي بمعنى. أريد بلدي تحليل لإنتاج:

 Wed Nov 12 blah blah blah blah cat1
 Wed Nov 12 blah blah blah blah cat2
     more blah blah
     even more blah blah
 Wed Nov 12 blah blah blah blah cat3
 Wed Nov 12 blah blah blah blah cat4
هل كانت مفيدة؟

المحلول

وإذا قلت كل السطر الذي يبدأ ب الفضاء هو استمرار فولينغ من السهل مع (ز) AWK (وهذا من ذاكرتي، لذلك ربما كان يحتوي على بعض الأخطاء المطبعية طفيفة، ومن أجل قراءة أفضل مع بعض بفواصل إضافية):

awk " BEGIN { multiline = 0;} 
      ! /^ / { if (whatever) 
                 { print; multiline = 1;} 
               else 
                 multiline = 0; 
             } 
        /^ / {if (multiline == 1) 
                 print;
             } 
     " 
      yourfile

وحيث whatever هو الشيك إذا الإخراج الخاص بك ينبغي أن يحدث (على سبيل المثال لقطة).

نصائح أخرى

وعلى افتراض ملف السجل الخاص بك لا يحتوي على '\01' أحرف التحكم و'\02'، وأن خط استمرار يبدأ بالضبط أربع مسافات، ما يلي قد عمل:

c1=`echo -en '\01'`
c2=`echo -en '\02'`
cat logfile | tr '\n' $c1 | sed "s/$c1    /$c2/g" | sed "s/$c1/\n/g" | grep cat | sed "s/$c2/\n    /g"

شرح: هذا يحل محل كل سطر جديد مع ASCII 1 (حرف تحكم ذلك لا ينبغي أبدا تظهر في ملف السجل) وكل تسلسل "السطر الجديد في الفضاء الفضاء الفضاء الفضاء" مع ASCII 2 (حرف تحكم آخر). ومن ثم إعادة يستبدل ASCII 1 مع أسطر جديدة، وحتى الآن يتم وضع كل سلسلة من خطوط متعددة في سطر واحد، مع فواصل الأسطر القديمة حلت محلها ASCII 2. grepped هذا القط، ومن ثم يتم إعادة استبدال-ال ASCII 2 مع الجمع بين السطر الجديد في الفضاء الفضاء الفضاء الفضاء.

وشيء من هذا القبيل؟

awk 'function print_part() { if(cat) print part }  /^  / { part = part "\n" $0; next } /cat[0-9]$/ { print_part(); part = $0; cat = 1; next;  } { print_part(); cat=0} END { print_part() }' inputfile

والتعبير العادي /^ / يحدد خطوط استمرار.

والتعبير العادي /cat[0-9]$/ يحدد خطوط بداية ترغب في الاحتفاظ بها.

وثمة نهج آخر يتمثل في وضع RS أن يكون شيئا آخر غير \n وضعها الطبيعي. على سبيل المثال:

$ awk -v Pre=Wed 'BEGIN {RS = "\\n?\\s*" Pre} /cat.\n?/ {print Pre $0}' file.log
Wed Nov 12 blah blah blah blah cat1
Wed Nov 12 blah blah blah blah cat2
     more blah blah
     even more blah blah
Wed Nov 12 blah blah blah blah cat3
Wed Nov 12 blah blah blah blah cat4
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top