Hier erzeugen wir ein paar Text-Dateien, die wir später brauchten:
echo "France
Canada
Burkina Faso
Democratic Republic of the Congo
Russia
New Zealand" > countries.txt
echo "Germany
Austria
Poland" > countries_1.txt
echo -e "1618391758\t192.168.0.140\tindex.html
1618391759\t192.168.0.120\tmy_test.html
1618391762\t192.168.0.140\tlogin.html
1618391765\t192.168.0.140\tbla.html
1618391771\t192.168.0.10\tblub.html" > logfile-example.log
echo -e "192.168.0.10\tsokrates
192.168.0.120\taristoteles
192.168.0.140\tplaton" > rechnernamen.txt
Einstieg in die Bash-Shell - Teil 4
Nach der Unix-Philosophie sind Textströme eine universelle Schnittstelle. Daher gibt es viele Unix-Werkzeuge, die Textströme verarbeiten und manipulieren können. Im folgenden werden die wichtigsten Werkzeuge vorgestellt.
cat
¶Mit cat
kann man (Text-)Dateien (auch) konkatenieren, d.h. unter Beibehaltung der Reihenfolge zusammenfügen.
Dabei muss man lediglich mehrere Dateien als Argumente angeben.
In dem folgenden Beispiel zusätzlich mit Process Substitution, um die Grenzen der ursprünglichen Dateien anzuzeigen.
cat countries.txt <(echo ---------) countries_1.txt
# dies könnte natürlich auch wieder als neue Datei geschrieben werden.
# cat countries.txt countries_1.txt > merged_countries.txt
cut
¶Mit cut
kann man "Spalten" (Felder) aus einer Textdatei extrahieren.
# Hinweis:
# die Zeitstempelangaben können mit `date` für Menschen übersetzt werden:
date -d @1618391759
# extrahiere das 1. und 3. Feld (Spalte) mit cut
# Das Standard Feld-Trennzeichen ist TAB, mit
# -d kann man andere Trennzeichen verwenden.
# -f gibt die Felder an, die man extrahieren will.
cut logfile-example.log -d $'\t' -f1,3
Hier ist das Trennzeichen (delimiter) über den Schalter -d
mittels ANSI C Quoting explizit auf TAB (Tabulator \t
) gesetzt.
sort
¶Mit Hilfe von sort
lassen sich Dateien sortieren, z.B. mit den Schaltern (siehe Manpage)
-t, --field-separator=SEP
use SEP instead of non-blank to blank transition
-k, --key=KEYDEF
sort via a key; KEYDEF gives location and type
Sehen Sie sich z.B. die Manpage für die weiteren Schalter an.
Beispiel:
# Sortieren nach dem zweiten Feld (der zweiten Spalte):
sort -t $'\t' -k2 logfile-example.log
join
¶Mit join
lassen sich Dateien, die ein gemeinsames Datenfeld haben, verbinden.
Z.B. mit einer Datei mit IP-Rechnernamen Zuweisung, können wir das sortierte log-File (in Process Substitution) mit den Rechnernamen verbinden:
join -1 2 -2 1 -t $'\t' <(sort -t $'\t' -k2 logfile-example.log) rechnernamen.txt
Der Schalter -1 2
gibt an, dass von der ersten Datei (hier sortiertes Logfile) das zweite Feld zum Zusammenfügen verwendet werden soll. Analog bedeutet -2 1
von der zweiten Datei (rechnernamen.txt
) das erste Feld.
Beachten Sie, dass mittels Process Substitution <(sort -t $'\t' -k2 logfile-example.log)
, die Datei logfile-example.log
sortiert wird.
tr
¶tr
übersetzt (translate) Zeichen oder löscht diese.
Beispiel alle Leerzeichen "" zu Tabs und alles Großgeschriebene zu Kleingeschrieben.
tr ' [:upper:]' '\t[:lower:]' < countries.txt
Hinweis:
cut
funktioniert nicht bei Trennzeichen, die hintereinander vorkommen, aber keine neuen Felder bestimmen,
z.B.:
# Hier gibt es mehrere Spaces zwischen den Feldern:
echo -e "1618391758 192.168.0.140 index.html
1618391759 192.168.0.120 my_test.html
1618391762 192.168.0.140 login.html
" > logfile-example_.log
cut logfile-example_.log -d' ' -f1,3
tr
kann hier Abhilfe schaffen. Mit dem Schalter -s
(squeeze) werden wiederholte Instanzen eines Zeichens zu einem Zeichen.
# mehrere hintereinanderfolgende "Whitespace" zu einem Zeichen
tr -s '[:space:]' < logfile-example_.log | cut -d' ' -f1,3
tee
¶Mit Hilfe des Kommando tee
wird die Standard-Eingabe (stdin)
in die Standard-Ausgabe geschrieben und zusätzlich in eine Datei.
tee
ist somit ein Verzweigung, die den Input verdoppelt.
Beispielsweise wird hier zusätzlich zur Ausgabe auf der Kommandozeile das Listing in eine Datei geschrieben:
ls | tee inhalt_des_verzeichnisses.txt
Beispiel für eine sinnvolle Anwendung:
Modifiziere "crontab" Datei mit sed
(siehe unten) und erstelle Backup in einem Schritt
crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab -
-
bei crontab Kommando steht für die Pseudodatei stdin siehe man crontab
.crontab
-Datei konfiguriert, mehr siehe z.B. in der Ubuntu-Cron Dokumentation oder in Linux-Praxis: zeitbezogene Kommandos.crontab
-Datei sollte nicht direkt modifiziert werden, sondern über den Befehl crontab
uniq
¶Mit uniq
können Duplikat-Zeilen, die direkt aufeinanderfolgen, beseitigt werden. Eventuell muss die Datei vorher sortiert werden.
Mit dem Schalten -c
kann außerdem gezählt, werden wiehäufig die einzelnen Duplikate vorkommen.
-c, --count
prefix lines by the number of occurrences
Für die weiteren Schalter sehen Sie sich z.B. die Manpage an.
# Erzeuge eine Datei mit Duplikaten:
# zweimal countries für Duplikate und extra France
cat countries.txt countries_1.txt countries.txt <(echo France) | tee duplicate_countries
cat duplicate_countries | sort | uniq -c
paste
¶paste
führt Daten aus mehreren Dateien spaltenweise zusammen.
Beispiele aus https://wiki.ubuntuusers.de/paste/:
#mit
seq 1 4
paste <(seq 1 5) <(seq 11 15) <(seq 21 25)
paste -s <(seq 1 5) <(seq 11 15) <(seq 21 25)
So kann man dies für eine Addition nutzen:
echo $(paste -sd+ <(seq 1 5))
paste -sd+ <(seq 1 5) | bc
Ersetzen Sie die Zeitstempel von logfile-example.log
durch für Menschen lesbare Zeitangaben.
Gewünschte Ausgabe:
Mi 14. Apr 11:15:58 CEST 2021 192.168.0.140 index.html
Mi 14. Apr 11:15:59 CEST 2021 192.168.0.120 my_test.html
Mi 14. Apr 11:16:02 CEST 2021 192.168.0.140 login.html
Mi 14. Apr 11:16:05 CEST 2021 192.168.0.140 bla.html
Mi 14. Apr 11:16:11 CEST 2021 192.168.0.10 blub.html
Hinweis: Eine mögliche Lösung besteht aus der Kombination von paste
, cut
, date
und Process Substitution.
nl
¶nl
erzeugt eine Nummerierung der Zeilen.
whatis nl
echo
nl countries.txt
tac
¶Gibt eine oder mehere Dateien in ungekehrter Reihenfolge aus:
column
¶Mit column
kann man (unter anderem) an Trennzeichen Spalten erzeugen:
whatis column
echo
head -4 /etc/passwd
echo
echo columnized with column:
head -4 /etc/passwd | column -t -s :
colrm
¶z.B. x-tes bis y-te Zeichen einer Zeile ausschneiden (Zeichen sind hier jeweils "Spalten"):
od
¶Dump einer Datei, z.B. im Oktal-Format.
whatis od # ähnlich zu hexdump
od -o longlist
split
¶Aufteilen von einer großen Datei in Teile, z.B. zum Versenden in Emails.
Mit cat
(concatenate) lässt sie sich wieder rekonstruieren.
whatis split
#rm xa*
split -b 20 countries.txt
ls x* # so heißen die Dateien per default
# Anzeigen der Dateien
for file in xa*; do
echo "@"
cat $file
echo "#"
done
echo -------------------
# Zusammensetzen der Teile mit cat (geht auch bei binary files)
cat xa*
sed
¶Mit Hilfe des Stream-Editors sed
kann ein (Zeichen-)Datenstrom nach Regeln verändert werden.
Meistens verwendet man sed
für Ersetzungen mit regulären Ausdrücken.
Beispiel substitute expressions s
: sed -E 's/search-pattern/replacement-string/g
'
g
: steht für global, d.h. das nicht nur das erste gefundene Muster ersetzt wird, sondern alle.-E
für extended regular expressions# Ersetze alle Leerzeichen durch ein underscore `_`
# Mehrere Leerzeichen hintereinander nur mit einem _
cat countries.txt | sed -E 's/[[:space:]]+/_/g'
# Beispiel: Schreibe Fehlerausgabe eines Kommandos zusätzlich in eine log-Datei
# Die log-Datei soll das Datum im Namen haben (ohne Leerzeichen!)
# hier mit echo "..." um es sichtbar zu machen
echo "command 2> $(date | sed -E 's/[[:space:]]+/_/g')_command_errors.log"
# aber besser ist als Name
echo "command 2> $(date -Iseconds)_command_errors.log"
Gefundene Muster können natürlich auch in der Ersetzung genutzt werden. Dazu muss man redex-Gruppen bilden. Diese kann man dann referenzieren: \1
für den Match der ersten Gruppe, \2
für den Match der zweiten Gruppe etc.
Beispiel mit nur einer Gruppe (...)
:
cat countries.txt | sed -E 's/(a.a)/a\1a/g'
Reguläre Ausdrücke sind standardmäßig greedy, d.h. sie entsprechen der längst möglichen Zeilenfolge.
Beispiel:
Wir möchten HTML-Tags aus Text beseitigen.
var="Das em-Tag markiert in HTML den Text <em>kursiv</em>."
Dazu verwenden wir folgendes Muster:
echo $var | sed -E 's/<.+>//g'
Das greedy-Verhalten beseitigt auch den Text zwischen den HTML-Tags, was in unserem Beispiel ungewünscht ist. Daher müssen wir das Muster modifizieren:
echo $var | sed -E 's/<[^>]+>//g'
Machen Sie sich klar, was das regex-Muster bedeutet.
Eine andere Möglichkeit ist es, das Muster lazy zu machen. Dann wird
der minimale Teil des Suchstrings ausgewählt, auf der das Muster zutrifft,
Hierfür dient ein ?
im Muster. Das geht aber nicht mit sed
.
Auf der Kommandozeile bietet sich alternativ perl
(eine Programmiersprache) an:
echo $var | perl -pe 's/<.+?>//g'
# -e lese den Perl-Code direkt von stdin und nicht von einer Datei
# -p prints to stdout, for details see https://www.perl.com/pub/2004/08/09/commandline.html/
Hinweis:
perl
erzielt man mit perl
durch $1
,$2
etc.# Beispiel
echo $var | perl -pe 's/.*(<.+>).*(<.+>)./tags sind $1 und $2/'
Schreiben Sie einen Einzeiler (verknüpfte Befehle), in dem Sie alle URLs aus einer Textdatei erkennen und zeilenwiese ausgeben. Machen Sie vereinfachte Annahmen über das Muster einer URL, z.B. das diese immer mit http://
bzw. https://
beginnt. Die URLs sollen zudem immer von Leerzeichen bzw. Zeilenumbrüchen vom Rest des Textes getrennt sein.
sed
unterstüzt nicht ein optionales Zeichen über ?
. Hier müssen Sie auf range {0,1}
ausweichen. sed -E /pattern/!d
lassen sich alle Zeilen löschen, die nicht auf das Pattern zutreffen.cat text_with_urls.txt
# Kopieren Sie z.B. den Text in eine Datei zu testen Ihrer Lösung
Geben Sie alle Zeilen mit http:\\
bzw https:\\
aus. Ersetzen Sie im Text dabei vor dem ersten "http://" mit Nichts, d.h. folgendes soll ausgegeben werden:
http://wikipedia.de oder http://christianherta.de/ und so weiter.
http://localhost:8080/mein/pfad oder mit einem Usernamen
http://benutzername@www.mydomain.de/seite/beispiel.php für
http://www.mydomain.de/seite//beispiel.php#textmarke
https://192.168.0.1/seite/beispiel.php?vname=christian&ort=berlin Bei dieser Adresse werden noch URL Parameter am Ende übergeben (http get). Der Query String beginnt dabei mit einem Fragezeichen "?" und die Parameter haben die Form name=wert und sind mit "&" getrennt.
egrep 'http://|https://' text_with_urls.txt | perl -pe 's/^.*?(https?:\/\/)/$1/g'
Wenn man mit sed
Teile extrahieren will, kann man die Zeile mit den entsprechenden
Gruppenreferenzen ersetzen.
Hier mit \1
für die erste regEx-Gruppe:
line="Das ist eine IPv4 Adresse 192.168.0.5 in einem privaten Netz."
# Extract the IPv4
echo $line | sed -n -E 's/.*[^[:digit:]](([0-9]{1,3}\.){3}[0-9]{1,3})[^[:digit:]].*/\1/p'
# Machen Sie sich die Bedeutung der regex klar!
Wenn man für Zeilen, die man für ein Ersetzungsmuster ausschießen will, ein Muster angeben will, so geht dies folgendermaßen:
# Ersetze alle "a" durch "e" außer in den Zeilen mit einem großen "C"
sed -E '/C/! s/a/e/g' countries.txt
sed
cheet sheet:
Mehr zu sed
finden Sie z.B. auch
awk
¶awk
ist ein Werkzeug (eigentlich sogar eine Programmiersprache), das sich insbesondere zur Prozessierung von Text in Feldstruktur eignet. Hier beschränken wir uns auf einfache Beispiele.
aus https://www.gnu.org/software/gawk/: "The awk utility interprets a special-purpose programming language that makes it possible to handle simple data-reformatting jobs with just a few lines of code."
Hier ein ganz einfaches Beispiel (als Alternative zu cut
):
awk '{print $2 "\t" $3}' logfile-example.log
# erinnerung
cat logfile-example.log # Logfile der Abrufe
# Zeitstempel IP-des-Web-Servers Abgerufene-Seite
echo
cat rechnernamen.txt # Ip-addresse Webservername
Beispiel: Web-Traffic auf die einzelnen Rechner.
Wir möchten die Uhrzeit zusammen mit dem Namen des Webservers.
Mit gnu-awk gawk
ist eine Funktion strftime
zur Konvertierung von Timestamps zu Datumsangaben verfügbar:
Hinweis: Muss unter Ubuntu/Debian nachinstalliert werden sudo apt-get install gawk
, da standardmäßig mawk
installiert ist.
join -1 2 -2 1 -t $'\t' <(sort -t $'\t' -k2 logfile-example.log) rechnernamen.txt | \
sort -t $'\t' -k2 | awk '{ print strftime("%m/%d/%Y %H:%M:%S", $2) "\t" $4 }'
Mehr zu awk
finden Sie auch im Online-Buch Shell-Programmierung von Jürgen Wolf.
Schreiben Sie einen Einzeiler, die gesamte Anzahl der Duplikate zählt und testen Sie dies an
duplicate_countries
(siehe oben: cat countries.txt countries_1.txt countries.txt <(echo France) > duplicate_countries
)
D.h. für jede Zeile, die mehrfach vorkommt, soll das mehrfache Vorkommen gezählt werden, z.B.
Austria
einmal vor. Somit ist die Anzahl der Duplikate für Austria
Null.Canada
zweimal vor. Somit ist die Anzahl der Duplikate für Canada
Eins.France
dreimal vor. Somit ist die Anzahl der Duplikate für France
Zwei.Das Ergebnis ist für die Datei duplicate_countries
somit 7.
cat duplicate_countries
comm
¶comm
vergleicht zwei alphabetisch sortiere Dateien:
comm <(seq 1 4) <(seq 2 5)
In der ersten Ausgabespalte werden die Zeilen, die nur in Datei 1 vorkommen, dargestellt. in der zweiten Spalte werden die Zeilen angezeigt, die nur in Datei 2 vorkommen. In der dritten Spalte werden die Zeilen dargestellt, die in beiden Dateien vorkommen.
Mit de Schalter -2
kann bespielsweise die Darstellung der zweiten Spate unterdrückt werden. Probieren Sie es aus.
comm -2 <(seq 1 4) <(seq 2 5)
Wie können (mit einem Einzeiler) nur die Länder angezeigt werden, die in den Dateien countries.txt
und countries_2.txt
(siehe unten)
vorkommen?
diff
¶diff
berechnet den Unterschied (differences) (zeilenweise) zwischen zwei Dateien und zeigt diesen an.
Die einfachste Benutzung ist diff datei1 datei2
:
echo "Canada
Burkina Faso
France
Democratic Republic of the Kongo
Austria
New Zealand
Germany
Switzerland" > countries_2.txt
diff countries.txt countries_2.txt
diff
liefert also eine kompake Darstellung der Unterschiede. Dabei werden Operationen
angegeben, die datei1
in datei2
überführen.
Änderung | Beschreibung |
---|---|
l1dl2 |
Lösche (delete) die Zeilen ab Zeile l1 in der ersten Datei, die auftauchen würden bei Zeile l2 der zweiten Datei |
l1cl2 |
Ersetze (bzw. ändere, change) die Zeilen l1 der ersten Datei mit den Zeilen l2 der zweiten Datei. |
l1al2 |
Füge (add) die Zeilen ab Position l1 in der ersten Datei hinzu, die auftauchen bei den Zeilen l2 der zweiten Datei. |
In unserem Beispiel bedeuten die Differenzangaben:
1d0
Lösche die erste Zeile von datei1
. Diese wäre in der 0. Zeile in datei2
.4,5c3,5
Ersetze die Zeilen 4
und 5
der ersten Datei mit den Zeile 3
bis 5
der zweiten Datei.6a7,8
Füge die Zeilen 7
und 8
von datei2
in datei1
ab Zeile 6
hinzu.Neben diesen POSIX-konformen Änderungsangaben (Standard bei diff
) gibt es noch weitere Formate, wie
-c
-u
Diese beeinhalten Kontext, d.h. die Diffenzangaben sind nicht mehr so sensitiv bzgl. Zeilennummerveränderungen.
diff -c countries.txt countries_2.txt
Die Ausgabe beginnt mit den Namen der Dateien und einem Zeitstempel.
***
.---
.Dann werden jeweils die beiden Dateien ausgegeben, hier steht z.B.
--- 1,8 ----
für zweite Datei (---
) mit Zeilen 1 bis 8.
Die Änderungsangaben zur Überführung von Datei 1 in Datei 2 sind:
-
Zeile löschen (kommt nur bei Datei 1 vor)+
Zeile hinzufügen (kommt nur bei Datei 2 vor)
Keine Änderung!
Zeile muss geändert werden. Die jeweiligen Versionen stehen bei den jeweiligen Dateien.diff -u countries.txt countries_2.txt
Das Unified Format ähnelt dem *Context Format* bezüglich der ersten drei Zeilen.
Die Bedeutungen der Zeichen
-,
+und
` ist auch die Gleiche, wie im Context Format.
Am einfachsten sind die Angaben ab Zeile 4 zu verstehen, wenn man die Angaben zeilenweise zusammen mit Datei
1 liest und die Änderungen bzw. Nicht-Änderung anwendet, sodass man Datei 2 erhält.
patch
¶Die Änderungsdatei die diff
erzeugt, kann automatsch mittels patch
auf eine Datei angewendet werden.
So kann man Änderungen einfach nachvollziehen. Wenn außerdem in einer (sehr) großen Datei nur eine kleine Änderung vorgenommen wurde, ist es vorteilhaft nur die Änderung (z.B. über ein Netzwerk) zu übertragen, da diese viel kleiner sind.
Dies wird z.B. auch bei der Entwicklung von Software, wie dem Linux-Kernel, genutzt.
Entwickler erzeugen relative kleine Code-Änderungen auf dem Kernel Source Tree (Dateibaum, kann rekursiv mit diff
durchlaufen werden). Diese werden als diff-Dateien weitergegeben.
Dieser Prozess bei der verteilten Softwareentwicklung wird mit Versionkontrollsystemen, wie git
, durchgeführt, die unter der Haube diff
und patch
verwenden.
Hier zwei weitere Versionen der Datei, um zu zeigen, dass patch
auf Dateien mit
kleinen Änderungen der Ursprungsdatei (außerhalb des Kontextes) angewendet werden kann.
echo "Kanada
Burkina Faso
France
Democratic Republic of the Kongo
Austria
New Zealand
Germany
Schweiz" > countries_3.txt
echo "Kanada
Burkina Faso
France
Democratic Republic of the Congo
Austria
New Zealand
Germany
Schweiz" > countries_4.txt
cat countries_2.txt
In der diff-Datei stehen die Änderungen, die von countries_3.txt
zu countries_2.txt
führen:
# Reduktion des Kontexts auf 2 (default 3)
diff --context=2 countries_3.txt countries_2.txt | tee countries.patch
Aber wir patchen countries_4.txt
. Hier ist die Schreibweise von Congo auf C korrigiert. Dies berücksichtigt
der Patch (Patch-Datei) nicht.
# patch the counties.txt file (which file to patch is in the patch file)
#patch < countries.patch
# but we want path countries_3, so we give this filename
# -i Read the patch from patchfile. If patchfile is -, read from standard input, the default.
# -b for backup would copy the original countries_3.txt to countries_3.txt.orig
patch -b -i countries.patch countries_4.txt
ls countries_4.txt*
cat countries_4.txt
# -R Reverses the previous patch
patch -p0 -R -i countries.patch countries_4.txt
cat countries_4.txt
Was passiert im obigen patch
-Beispiel, wenn beim diff
die Standardgröße des Kontext verwendet wird. Erklären Sie dies.
Zählen Sie die Anzahl der unterschiedlichen Worte der Datei greetings
mit einem Einzeiler.
Dabei sollen Worte die groß- oder kleingeschrieben werden, nur einmal zählten.
Also alle Wörter Hallo
bzw. hallo
zählen nur einmal. Insgesamt gibt es
6 verschiedliche Terme (normalisierte Worte) in greetings
.
echo "Hallo Welt
hallo welt sind Grüße
an die Welt" > greetings
Wie oft kommt das Wort "Technik" auf der www-Startseite der HTW-Berlin vor?
curl --silent https://www.htw-berlin.de
, um den Inhalt der Seite herunterzuladen und pipen Sie den Inhalt direkt weiter in eine Befehlskette. grep
zur Filterung.Analysieren Sie die untenstehenden Beispiele.
man ls | sed -e 's/[^[:alpha:]]/ /g' | tr '\n' " " | tr -s " " | tr " " '\n'| \
tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
man ls | sed -e 's/[^[:alpha:]]/ /g' | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | \
sort | uniq -c | sort -nr | nl | awk ' $2 > 12 && length($3) >= 2 { printf "%3s\t%10s\t%2s\n", $1, $3, $2}'
# $2 > 12: alle Worte, die mehr als 12-mal vorkommen - in zweiten Spalte ($2) steht die Häufigkeit
# length($3) > 1 : Die Wortlänge muss mindesten zwei sein - in der ditten Spalte stehen die Worte
man ls | sed -e 's/[^[:alpha:]]/ /g' | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | \
sort | uniq -c | sort -nr | nl | awk '{ print $2}'| paste -sd+ | bc -l
Modifizieren Sie das Beispiel von oben, so dass nur eine Wort-ID (erste Spalte) und die Worte in der Ausgabe vorkommen. Die häufigsten Worte sollen dabei die niedrigste ID haben, wie oben, d.h. die Ausgabe soll folgendermaßen beginnen:
1 sort
2 of
3 by
4 with
...
Erstellen Sie ein bash-Script, das ein Befehlsinhaltsverzeichnis als HTML-Seite (Grundgerüst einer HTML Seite) mit Link-Referenzen zu den entsprechenden Webseiten erstellt. Die mögliche relevanten Seiten sind alle relative Links der Seite http://christianherta.de/lehre/praktischeInformatik/praktischeInformatik.html.
Die erzeugte HTML-Seite soll in etwas wie folgt aussehen:
<!DOCTYPE html>
<!-- from https://wiki.selfhtml.org/wiki/HTML/Tutorials/HTML5/Grundger%C3%BCst -->
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Befehlsverzeichnis</title>
</head>
<body>
<a href="http://christianherta.de/lehre/praktischeInformatik/./bash/bash_1.html">cd</a></br>
<a href="http://christianherta.de/lehre/praktischeInformatik/./bash/bash_1.html">chmod</a></br>
....
<a href="http://christianherta.de/lehre/praktischeInformatik/./Netzwerke/Netzwerke_1.html">traceroute</a></br>
</body>
</html>
Hinweise:
Versuchen Sie nicht eine perfekte Lösung zu finden. Solche Skripte sind oft ein Hack für eine schnelle Lösung. Überlegen Sie sich zur Extraktion der Befehle entsprechende Extraktionspipelines. Dies arbeiten typischerweise mit regulären Ausdrücken. Sehen Sie sich hierzu den HTML-Quellcode der Seiten an. Bei vielen Browser können Sie hierzu die Tasktenkombination Strg Shift c verwenden.
Bei der Extraktionspipeline müssen Sie zudem typischerweise eine Abwägung zwischen Precision und Recall machen:
Überlegen Sie sich außerdem,welche Probleme beim Programmieren auftreten. Insbesondere welche Datenstrukturen die Entwicklung erleichtern würden. Wo liegen die Grenzen von bash-Skripten?