Warum liefert dieser Sed-Befehl nicht die gewünschte Ausgabe?

Warum liefert dieser Sed-Befehl nicht die gewünschte Ausgabe?

Testdatei:

872iirji -- RANDOM STUFF -- skjkfj45j
GET /_ajax_htmlview?action=28&__and_so_on HTTP/1.1.
Host: my.website.com.
connection: blah blah blah
skjfkjfj

gewünschte Ausgabe:

_ajax_htmlview?action=28&__and_so_on
my.website.com

die ich mit Hilfe von sed-Rückverweisen verbinden werde, um es zu machenhttp://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
}'

aber ich bekomme Folgendes:

Host: my.website.com
my.website.com

BEARBEITEN: wenn ich /^GET/{ }wie unten hinzufüge, dann scheint es zu funktionieren, aber wie funktioniert das und das vorherige nicht?

sed -n '/^GET/{
        s=GET \/\(_ajax_htmlview[^ ]*\).*=\1=
        h
        }
        /^Host/{
        s=.*:[ \t]*\(.*\).=\1=
        H
        x
        p
}' testfile

Antwort1

Nun, nur zum Spaß, obligatorische Awk-Lösung …

Ich habe diesen Bash-Oneliner ausgearbeitet, der auch funktioniert

buildit(){ Req=$(grep -oP '(?<=GET \/).*(?=HTTP)' $1); url=$(awk -F":" '/Host/{gsub(/ /, "",$2); print $2}' $1); echo "http://"$url"/"$Req; }

Dadurch wird eine Bash-Funktion in Ihrer Shell erstellt, die Sie dann wie folgt aufrufen können

$ buildit testfile
http://my.website.com/_ajax_htmlview?action=28&__and_so_on

Es gibt jedoch einen Vorbehalt – dies funktioniert nur, wenn die Datei nur eine einzige Instanz von „Host“ und „GET“ enthält.

Antwort2

Einfacher mit awk:

$ awk '/GET.*ajax/ { print $(NF-1); getline; print $NF }' testfile
/_ajax_htmlview?action=28&__and_so_on
my.website.com.

Der awkCode sucht nach GET-Anforderungszeilen, die auch die Zeichenfolge enthalten ajax, gibt dann das vorletzte Feld dieser Zeile aus und liest die nächste Zeile. Ab dieser nächsten Zeile gibt er das zweite Feld aus.

verwandte Informationen