
Ich mache meine Linux+-Zwischenprüfung und hänge bei einer Frage fest, bei der ich den Kopfabschnitt einschließlich der Tags kopieren und in eine Datei ausgeben soll. Meine Zwischenprüfung ist am 5. fällig, daher wäre es wirklich hilfreich, wenn mir jemand den richtigen Code zeigen würde, den ich beim Suchen nach dem Kopfabschnitt und den Tags verwenden soll. Ich habe es versucht: curl www.hackthissite.org: grep "<head> > ~/data/public/myfirstname\ mylastname/head.txt
aber wenn ich die Datei cate, wird nur angezeigt, <head>
dass der Kopfabschnitt oder das Tag nicht enthalten sind. Was muss ich also eingeben, um die richtige Ausgabe in die Datei zu erhalten?
Antwort1
Es ist etwas komplexer als das, was Sie versuchen.
Erstens gibt es einige Syntaxprobleme mit Ihrem Befehl. Er curl www.hackthissite.org: grep "<head> > ~/data/public/myfirstname\ mylastname/head.txt
sollte lauten:
curl www.hackthissite.org | grep "<head>" > ~/data/public/myfirstname\ mylastname/head.txt
Aber trotzdem würde es nicht das gewünschte Ergebnis erzielen, da Sie nur das Kopf-Öffnungs-Tag erfassen, nicht aber das, was zwischen diesem und dem Schließ-Tag steht.
Mir ist Folgendes eingefallen:
curl www.hackthissite.org > TEMPORARYFILE.txt; grep -A $(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1))) "<head>" TEMPORARYFILE.txt > ~/data/public/myfirstname\ mylastname/head.txt; rm TEMPORARYFILE.txt
Also, in Teilen:
grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1
Dadurch wird die Nummer der Zeile abgerufen, in der sich das schließende Tag befindet. Dasselbe gilt für grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1
, jedoch für das öffnende Tag.
Dann haben wir $(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1)))
, das berechnen soll, wie viele Zeilen sich zwischen dem öffnenden und dem schließenden Tag befinden.
Dies wird mit der -A
Option verwendet grep
, die uns die Kontrolle darüber gibt, wie viele Zeilen nach der Übereinstimmung wir drucken möchten. Es wird also nach dem öffnenden Head-Tag gesucht und alle Zeilen zwischen diesem und dem schließenden Tag gedruckt.
Antwort2
Mit gawk:
curl -s www.hackthissite.org | awk '/<\<head>/,/<\/head>/ {print}'