awk, perl 또는 sed를 사용하여 LiveHttPheaders 출력에서 응답을 제거하려면 어떻게해야합니까?
문제
내가 이와 같은 것이 있다고 가정 해 봅시다 (이것은 예일 뿐이며 실제 요청이 다를 것입니다. 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