
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 awk
Code 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.