2009-11-28 51 views
2

比方说,我有这样的事情(这只是一个例子,实际要求会有所不同:我装StackOverflow上启用有一些样品的LiveHTTPHeaders对工作):如何使用awk,perl或sed从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捕获的会话保存到文本文件中,并且希望从此问题的第二个“代码”中获得结果,那么我该如何执行此操作?也许与awksedperl?或者是其他东西?我在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 

...文件filtered.txt被创建,但它是完全空的。

任何人都试过它在我粘贴到pastebin的全部标题?它有效吗?

+0

请在后相关文本重新提交,以及 - 格式化。另外,你的问题很难理解。你的编程问题是什么? – 2009-11-28 16:29:58

+0

我无法在帖子中提交代码,因为stackoverflow认为我想发布垃圾邮件链接;)。我试图将我在pastebin1中的输出转换为我在pastebin2中的输出 - 这种方式更容易理解,还是我应该解释更多? – Tim 2009-11-28 16:34:26

+0

...我想删除部分pastebin1以获取pastebin2中的内容。我想删除无用的(用于我的任务)该工具(livehttpheaders)正在生成的信息。您可以比较pastebin链接中的标题以查看差异。 – Tim 2009-11-28 16:38:01

回答

2

你看上去有尾随空白的问题。

$ 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)/' 
+1

很好用!谢谢 – Tim 2009-11-28 20:26:33

+0

不客气! – 2009-11-28 20:45:40

+0

不需要将Perl和sed一起使用。sed是无用的。 – ghostdog74 2009-11-29 00:20:55

5

在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; 
} 

我考虑在相同的使用sedperl管道有点憎恶。

+0

这完全是一个聪明的想法,我不会去想它:)。非常感谢,我会尝试! – Tim 2009-11-28 16:46:49

+0

...但是这打印整个部分或只有一个线路已获取或张贴在其中? – Tim 2009-11-28 17:01:16

+0

./test.pl> livehttp。txt 然后它开始工作,不会结束(我没有得到控制台免费回来),当我看文件时,所有内容都被删除:( – Tim 2009-11-28 17:10:59

0

运行思南的代码为:

perl test.pl <infile.txt> outfile.txt 
+0

相同 - filtered.txt是完全空的,您还需要parens以获取和分享锚点:'perl -le'打印“匹配”。现在我觉得笨拙,我甚至不能运行脚本:/ – Tim 2009-11-28 17:24:04

+0

任何人都试过它在我粘贴到pastebin的全部标题?它有效吗? – Tim 2009-11-28 19:10:30

+2

这两者之间没有区别。从“perlop的I/O操作符 部分:”空文件句柄'<>'是特殊的:它可以用来模拟'sed'和'awk'的行为。来自'<>'的输入来自标准输入或来自命令行上列出的每个文件。“ http://perldoc.perl.org/perlop.html#I%2fO-Operators – 2009-11-28 20:03:39

0

只是一个gawk的命令

awk -vRS= '/^(GET|POST)/' ORS="\n\n" file 
0

你可以使用bash shell的

while read -r line 
do  
    case "$line" in 
     GET*|POST*) flag=1;;   
     "") flag=0;; 
    esac 
    [ "$flag" -eq 1 ] && echo "$line" 
done < "file"