Как я могу удалить ответы из вывода LiveHTTPHeaders, используя awk, perl или sed? - PullRequest
2 голосов
/ 28 ноября 2009

Допустим, у меня есть что-то вроде этого (это только пример, фактический запрос будет другим: я загрузил 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? Это сработало?

Полные заголовки

Ответы [ 5 ]

5 голосов
/ 28 ноября 2009

В 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 в одном и том же конвейере чем-то вроде мерзости.

2 голосов
/ 28 ноября 2009

Похоже, у вас есть проблемы с пробелами.

$ 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)/'
0 голосов
/ 29 ноября 2009

вы можете использовать оболочку bash

while read -r line
do    
    case "$line" in
        GET*|POST*) flag=1;;        
        "") flag=0;;
    esac
    [ "$flag" -eq 1 ] && echo "$line"
done < "file" 
0 голосов
/ 29 ноября 2009

только одна команда gawk

awk -vRS= '/^(GET|POST)/' ORS="\n\n" file
0 голосов
/ 28 ноября 2009

Запустите код Синан как:

perl test.pl < infile.txt > outfile.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...