このsedコマンドが目的の出力を取得できないのはなぜですか?

このsedコマンドが目的の出力を取得できないのはなぜですか?

テストファイル:

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

これにより、シェルに次のように呼び出すことができる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番目のフィールドを出力します。

関連情報