Как я могу удалить ответы из вывода 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 ---------------------------------------------------------- ...
Полный журнал запросов и ответов доступен на pastebin
И я хочу удалить все ответы (например, 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/ ...
Опять же, полный текст того, что я хочу сохранить, доступен на pastebin .
Если я сохраню записанную сессию LiveHTTPHeaders в текстовый файл и хочу получить результат, подобный второму «коду» в этом вопросе, как мне это сделать? Может быть, с awk
, sed
или perl
? Или что-то другое? Я на Linux.
Р> <ч>
Редактировать:
Я пытаюсь запустить сценарий Синан. Сценарий таков:
#!/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)/ }'
Это работает путем перевода оператора readline в Perl в режим абзаца (через $ / = " "
), который захватывает записи порции за раз, разделенные двумя или более последовательными символами новой строки. р>
Приятно, когда это работает, но немного ломко. Пустые, но не пустые строки будут склеивать работы, но sed
может их очистить.
Эквивалентная и более краткая команда:
$ sed -e 's/^\s*$//' livehttp.txt | perl -000 -ne 'print if /^(GET|POST)/'
Другие советы
В Perl:
local $/ = "\n\n";
while (<>) {
print if /^(?:GET|POST)/; # Add more request types as needed
}
Примечания. Если посмотреть на вывод, сгенерированный LiveHTTPHeaders, записи довольно четко разделены двумя новыми строками, поэтому я думаю, установив $ / = " \ n \ n "
более уместно, чем настройка $ / = ''
. Я полагаю, что ваши проблемы были связаны с тем, что строки во входном файле были с отступом.
Первоначально я загрузил файл из pastebin и использовал полный файл для проверки своего сценария. Я не думаю, что файл, который вы использовали для тестирования на своем компьютере, был идентичен тому, который вы поместили в pastebin .
Если вы хотите надежно работать с возможными отступами строк, оставаясь согласованными с форматом вывода LiveHTTPHeaders, вам следует использовать что-то вроде следующего:
#!/usr/bin/perl
use strict; use warnings;
local $/ = "\n\n";
while (<>) {
next unless /^\s*(?:GET|POST)/;
s!^\s+!!gm;
print;
}
Я считаю использование sed
и perl
в одном и том же конвейере чем-то вроде мерзости.
только одна команда gawk
awk -vRS= '/^(GET|POST)/' ORS="\n\n" file
вы можете использовать оболочку bash
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