Как я могу удалить ответы из вывода 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
----------------------------------------------------------
...

Полный журнал запросов и ответов доступен на 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top