كيف يمكنني إزالة الاستجابات من إخراج LiveHTTPHeaders باستخدام awk أو Perl أو sed؟
سؤال
لنفترض أن لدي شيئًا كهذا (هذا مجرد مثال، وسيكون الطلب الفعلي مختلفًا:لقد قمت بتحميل 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