测试文件:
872iirji -- RANDOM STUFF -- skjkfj45j
GET /_ajax_htmlview?action=28&__and_so_on HTTP/1.1.
Host: my.website.com.
connection: blah blah blah
skjfkjfj
期望的输出:
_ajax_htmlview?action=28&__and_so_on
my.website.com
我将使用 sed 反向引用来加入它http://my.website.com/_ajax_htmlview?action=28&__and_so_on
sed -n 's=GET \/\(_ajax_htmlview[^ ]*\).*=\1=
h
/^Host/{
s=.*:[ \t]*\(.*\).=\1=
H
x
p
}'
但我明白了:
Host: my.website.com
my.website.com
编辑:如果我/^GET/{ }
按如下添加,那么它似乎可以工作,但是这是如何工作的,而前一个则不起作用
sed -n '/^GET/{
s=GET \/\(_ajax_htmlview[^ ]*\).*=\1=
h
}
/^Host/{
s=.*:[ \t]*\(.*\).=\1=
H
x
p
}' testfile
答案1
好吧,只是为了好玩,强制性的 awk 解决方案......
我研究出了这个 bash oneliner 也有效
buildit(){ Req=$(grep -oP '(?<=GET \/).*(?=HTTP)' $1); url=$(awk -F":" '/Host/{gsub(/ /, "",$2); print $2}' $1); echo "http://"$url"/"$Req; }
这会在您的 shell 中创建一个 bash 函数,然后您可以像这样调用它
$ buildit testfile
http://my.website.com/_ajax_htmlview?action=28&__and_so_on
但有一个警告 - 仅当文件中只有一个“Host”和“GET”实例时,这才有效。
答案2
更容易使用awk
:
$ awk '/GET.*ajax/ { print $(NF-1); getline; print $NF }' testfile
/_ajax_htmlview?action=28&__and_so_on
my.website.com.
该awk
代码查找任何也包含 string 的 GET 请求行ajax
,然后输出该行的倒数第二个字段并读取下一行。从下一行开始,它输出第二个字段。