كيف يمكنني إزالة الاستجابات من إخراج LiveHTTPHeaders باستخدام awk أو Perl أو sed؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

لنفترض أن لدي شيئًا كهذا (هذا مجرد مثال، وسيكون الطلب الفعلي مختلفًا:لقد قمت بتحميل StackOverflow مع تمكين LiveHTTPHeaders للحصول على بعض العينات للعمل عليها):

http://stackoverflow.com/

GET / HTTP/1.1
Host: stackoverflow.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

HTTP/1.x 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Sat, 28 Nov 2009 16:04:24 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
Date: Sat, 28 Nov 2009 16:04:23 GMT
Content-Length: 19015
----------------------------------------------------------
...

السجل الكامل للطلبات والاستجابات متاح على باستبين

وأريد إزالة كافة الاستجابات (HTTP/1.x 200 OK وكل شيء في تلك الاستجابة، على سبيل المثال) وجميع الأسطر التي تعرض عنوان الصفحة.أود أن أحصل على كل شيء فقط طلبات اليسار في ملف نصي مع إخراج LiveHTTPHeaders المحفوظة.

لذا فإن الناتج سيكون:

GET / HTTP/1.1
Host: stackoverflow.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

GET /so/all.css?v=5290 HTTP/1.1
Host: sstatic.net
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://stackoverflow.com/

...

مرة أخرى، النص الكامل لما أريد الاحتفاظ به متاح على باستبين.

إذا قمت بحفظ جلسة LiveHTTPHeaders التي تم التقاطها في ملف نصي وأرغب في الحصول على نتيجة مثل "الرمز" الثاني في هذا السؤال، كيف أفعل ذلك؟ربما مع awk, sed أو perl؟أو أي شيء آخر؟أنا على لينكس.


يحرر:أحاول تشغيل نص سنان.البرنامج النصي هو هذا:

#!/usr/bin/perl
local $/ = "\n\n";
while (<>) {
    print if /^GET|POST/; # Add more request types as needed
}

حاولت تشغيله بهذه الطريقة:

./cleanup-headers.pl livehttp.txt > filtered.txt

وهذه الطريقة:

perl cleanup-headers.pl < livehttp.txt > filtered.txt

...تم إنشاء الملف filter.txt ولكنه فارغ تمامًا.

هل جربها أحد على الرؤوس الكاملة التي قمت بلصقها في Pastebin؟هل نجحت؟

رؤوس كاملة

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

المحلول

يبدو أنك تواجه مشكلات تتعلق بالمسافات البيضاء.

$ sed -e 's/^\s*$//' livehttp.txt | \
  perl -e '$/ = ""; while (<>) { print if /^(GET|POST)/ }'

يعمل هذا عن طريق وضع عامل قراءة خط القراءة الخاص بـ Perl في وضع الفقرة (عبر $/ = "")، الذي يلتقط تسجيلات مقطعًا في كل مرة، مفصولة بسطرين جديدين متتاليين أو أكثر.

إنه لطيف عندما يعمل، لكنه هش بعض الشيء.الأسطر الفارغة ولكن ليست الفارغة سوف تفسد الأعمال، ولكن sed يمكن تنظيف تلك.

أمر مكافئ وأكثر إيجازًا:

$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'

نصائح أخرى

في بيرل:

local $/ = "\n\n";
while (<>) {
    print if /^(?:GET|POST)/; # Add more request types as needed
}

ملحوظات: بالنظر إلى المخرجات التي تم إنشاؤها بواسطة LiveHTTPHeaders، يتم فصل الإدخالات بوضوح تام بواسطة سطرين جديدين، لذلك أعتقد أن الإعداد $/ = "\n\n" هو أكثر ملاءمة من الإعداد $/ = ''.أعتقد أن مشاكلك كانت بسبب حقيقة أن الأسطر الموجودة في ملف الإدخال الخاص بك تم وضع مسافة بادئة لها بالفعل.

لقد قمت في الأصل بتنزيل الملف من باستبين واستخدم الملف الكامل لاختبار البرنامج النصي الخاص بي.لا أعتقد أن الملف الذي كنت تستخدمه للاختبار على جهاز الكمبيوتر الخاص بك كان مطابقًا للملف الذي قمت بتثبيته باستبين.

إذا كنت تريد التعامل بقوة مع الأسطر التي من المحتمل أن تكون بها مسافة بادئة مع الحفاظ على الاتساق مع تنسيق مخرجات LiveHTTPHeaders، فيجب عليك استخدام شيء مثل ما يلي:

#!/usr/bin/perl

use strict; use warnings;

local $/ = "\n\n";
while (<>) {
    next unless /^\s*(?:GET|POST)/;
    s!^\s+!!gm;
    print;
}

أنا أفكر في استخدام sed و perl في نفس خط الأنابيب ليكون قليلا من رجس.

أمر واحد فقط

awk -vRS= '/^(GET|POST)/' ORS="\n\n" file

يمكنك استخدام قذيفة باش

while read -r line
do    
    case "$line" in
        GET*|POST*) flag=1;;        
        "") flag=0;;
    esac
    [ "$flag" -eq 1 ] && echo "$line"
done < "file" 

قم بتشغيل كود سنان على النحو التالي:

perl test.pl < infile.txt > outfile.txt
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top