awk, perl 또는 sed를 사용하여 LiveHttPheaders 출력에서 ​​응답을 제거하려면 어떻게해야합니까?

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

  •  06-07-2019
  •  | 
  •  

문제

내가 이와 같은 것이 있다고 가정 해 봅시다 (이것은 예일 뿐이며 실제 요청이 다를 것입니다. livehttpheaders를 사용하여 stackoverflow를로드했습니다.

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? 또는 다른 것? 나는 리눅스에있다.


편집 : Sinan의 대본을 실행하려고합니다. 스크립트는 다음과 같습니다.

#!/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

... 파일 필터링 .txt가 생성되었지만 완전히 비어 있습니다.

내가 페이스트 빈에 붙여 넣은 전체 헤더에서 시도해 본 사람이 있습니까? 작동 했습니까?

전체 헤더

도움이 되었습니까?

해결책

whitespace 문제가있는 것 같습니다.

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

이것은 Perl의 Readline 연산자를 단락 모드에 넣음으로써 작동합니다. $/ = "")는 한 번에 덩어리를 기록하며 둘 이상의 연속 신생으로 분리됩니다.

작동 할 때 좋지만 약간 부서지기 쉬웠습니다. 빈 줄이 아닌 빈 줄이 아닌 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가 생성 한 출력을 살펴보면 항목이 두 개의 NewLines로 명확하게 분리되어 있으므로 설정한다고 생각합니다. $/ = "\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 같은 파이프 라인에서 약간의 가증 한 것입니다.

단 하나의 gawk 명령

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" 

Sinan의 코드를 다음과 같이 실행하십시오.

perl test.pl < infile.txt > outfile.txt
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top