為什麼這個 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; }

這會在您的 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,然後輸出該行的倒數第二個欄位並讀取下一行。從下一行開始,它輸出第二個欄位。

相關內容