
テストファイル:
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ワンライナーを作成しました。
buildit(){ Req=$(grep -oP '(?<=GET \/).*(?=HTTP)' $1); url=$(awk -F":" '/Host/{gsub(/ /, "",$2); print $2}' $1); echo "http://"$url"/"$Req; }
これにより、シェルにbash関数が作成され、次のように呼び出すことができます。
$ buildit testfile
http://my.website.com/_ajax_htmlview?action=28&__and_so_on
ただし、注意点があります。これは、ファイル内に「Host」と「GET」のインスタンスが 1 つだけある場合にのみ機能します。
答え2
より簡単にawk
:
$ awk '/GET.*ajax/ { print $(NF-1); getline; print $NF }' testfile
/_ajax_htmlview?action=28&__and_so_on
my.website.com.
コードawk
は、文字列も含む GET リクエスト行を探しajax
、その行の最後から 2 番目のフィールドを出力して、次の行を読み取ります。次の行から、2 番目のフィールドを出力します。