# 1.5 Kommandozeile

Quelle: https://inf.zone/lectures/1-c/short-1-5-kommandozeile/

## Video

[Video ansehen](https://oc.streams.uni-bamberg.de/paella7/ui/watch.html?id=57d39e8e-6a23-4e5d-ac95-38b657a41ce2)

### Alternativen

- [Video auf YouTube](https://youtu.be/alb3FoE_CuY)
- Download (1080p) (demnächst)
- Download (720p) (demnächst)
- Download (540p) (demnächst)

## Hinweise zu diesem Video

**Korrekturen**

Die Korrekturen betreffen das Video. In den Folien zum Herunterladen sind sie eingearbeitet, soweit sie die Folien betreffen.

- Folie 20: In der Pipeline muss es „cut -d&#39;:&#39; -f3“ heißen, denn die PIN steht hinter dem zweiten Doppelpunkt. Mit -f2 werden die Benutzernummern gezählt, und die doppelt vergebene PIN bleibt unentdeckt.
- Folie 17, zweites Beispiel: Vor „uniq -c“ fehlt ein „sort“, und bei einer CSV-Datei ist das Trennzeichen ein Komma. Richtig wäre: cat data.csv \| cut -f2 -d&#39;,&#39; \| sort \| uniq -c

## Material

- [Folien](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf)
- Folien und Transkript: unten auf dieser Seite

## Folien und Transkript

*Folientext aus den PDF-Folien, darunter jeweils der gesprochene Text des Videos. Der gesprochene Text ist maschinell transkribiert und nachkorrigiert, kann aber noch Fehler enthalten; im Video sprechen abwechselnd Prof und eine AI-Figur, die Sprecherwechsel sind nicht markiert. Die Zuordnung zu den Folien ist ungefähr. Die Zeitangaben verlinken auf die Stelle im Video (YouTube). Maßgeblich sind Video und Folien.*

### Folie 1 — Kommandozeile

[Folie 1 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=1)

#### Transkript

**[Video 00:00–00:25](https://www.youtube.com/watch?v=alb3FoE_CuY&t=0)**

Dies ist Inf-Einf-B. Heute die Kommandozeile. Ah, the command line, where keyboards become scalpels, where typos become regrets, and where students learn the true meaning of: With great power comes great responsibility and occasional data loss. Hoppa, falsche Sprache. Komm jetzt, fang einfach mal an. Jawohl, Herr Professor.

### Folie 2

[Folie 2 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=2)

Die Kommandozeile (command line interface, CLI) ist eine textbasierte Schnittstelle, die eine direkte Interaktion mit dem Betriebssystem eines Computers über ein Shell-Programm ermöglicht, auf das in der Regel über eine Terminal-Anwendung zugegriffen wird.

Gerade Linux, ein weit verbreitetes und frei zugängliches Betriebssystem, bietet viele praktische Werkzeuge, die über die Kommandozeile erreicht werden können. Beim Programmieren und Administrieren von IT-Systemen, aber auch zum Lösen von Alltagsproblemen ist es sehr nützlich.

#### Transkript

**[Video 00:00–00:25](https://www.youtube.com/watch?v=alb3FoE_CuY&t=0)**

Die Kommandozeile.

**[Video 00:25–00:52](https://www.youtube.com/watch?v=alb3FoE_CuY&t=25)**

Englisch Command Line Interface, abgekürzt CLI, ist eine textbasierte Schnittstelle, die eine direkte Interaktion mit dem Betriebssystem eines Computers über ein Shell-Programm ermöglicht, auf das in der Regel über eine Terminalanwendung zugegriffen wird. Das ist ganz anders als bei einer grafischen Benutzeroberfläche, die nennt man auch Graphical User Interface, abgekürzt GUI. Das kennen die meisten. Da nimmt man die Maus oder den Finger. Gerade Linux, ein weit verbreitetes und frei zugängliches Betriebssystem.

**[Video 00:52–01:26](https://www.youtube.com/watch?v=alb3FoE_CuY&t=52)**

bietet viele praktische Werkzeuge, die über die Kommandozeile erreicht werden können. Beim Programmieren und Administrieren von IT-Systemen, aber auch zum Lösen von Alltagsproblemen, ist es sehr nützlich. Viele Aufgaben können sowohl mit einer grafischen Benutzeroberfläche als auch mit der Kommandozeile erledigt werden. Auf der Kommandozeile ist man aber bei vielen Aufgaben deutlich schneller.

### Folie 3

[Folie 3 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=3)

Die in Inf-Einf-B verwendeten CS50 Dev Container führen eine virtuelle Ubuntu-Linux-Maschine aus; Register „Terminal“ in VS Code bietet direkten Zugriff auf die Kommandozeile dieser Linux-Umgebung.

Die gleiche Kommandozeilen ist in Github Codespaces erreichbar, wenn Sie den CS50 Dev Container nutzen.

Das Windows Subsystem für Linux oder macOS bieten ebenfalls Zugriff auf die Kommandozeile.

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 00:52–01:26](https://www.youtube.com/watch?v=alb3FoE_CuY&t=52)**

Und vor allem kann man sich die dort eingegebenen Befehle speichern und später wieder ausführen und damit Aufgaben automatisieren. Wenn Sie Ihren Code in einem CS50 Dev-Container in VS Code ausführen, egal ob lokal auf Ihrem Rechner,

**[Video 01:26–01:56](https://www.youtube.com/watch?v=alb3FoE_CuY&t=86)**

Oder in einem GitHub Codespace wird er tatsächlich auf einer virtuellen Ubuntu Linux-Maschine ausgeführt. Die Registerkarte Terminal in VS Code bietet direkten Zugriff auf die Befehlszeile dieser Linux-Umgebung, sodass Sie mit Kommandozeilen-Tools mit Ihrer Entwicklungsumgebung interagieren können. Ihr Code läuft quasi in einer Box, die sich in einer anderen Box befindet und über ein magisches Textfenster zugänglich ist. Irgendwie kurios, oder? Oder wir sagen einfach, dass es eine virtuelle Maschine ist und ersparen uns die metaphysische Krise.

**[Video 01:56–02:30](https://www.youtube.com/watch?v=alb3FoE_CuY&t=116)**

Wie kann man denn jetzt auf die Kommandozeile noch zugreifen? Dafür gibt es mehrere Möglichkeiten. Zum Beispiel das Windows Subsystem für Linux oder macOS bieten ebenfalls Zugriff auf die Kommandozeile. Oder Sie installieren einfach eine Linux-Distribution auf Ihrem Rechner. Das gibt Pluspunkte bei der Hackers Street Credibility. Schauen wir uns die wichtigsten Befehle an, die es unter Linux auf der Kommandozeile gibt. Wenn ich in VS Code im Terminal ls eingebe und dann Enter drücke, sehe ich Folgendes: test, test.c, Übung eins und Übung zwei. Die letzten zwei sind blau gefärbt und haben einen Schrägstrich am Ende.

### Folie 4 — ls

[Folie 4 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=4)

Steht für „list“. Mit diesem Befehl werden alle Dateien und Ordner im aktuellen Verzeichnis angezeigt.

`ls` `-a` (zeigt alle, auch versteckte Dateien)

`ls -l` (langes Format mit Details)

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 02:30–02:56](https://www.youtube.com/watch?v=alb3FoE_CuY&t=150)**

um anzuzeigen, dass es Verzeichnisse sind, in die wir navigieren können. Die meisten Befehle nehmen Parameter entgegen, die mit einem Bindestrich oder Minus gekennzeichnet sind. Bei ls kann man sich zum Beispiel auch versteckte Dateien anzeigen lassen. Das sind unter Linux Dateien, die als erstes Zeichen im Dateinamen einen Punkt haben. Mit -l kann man eine ausführlichere Ausgabe erzeugen, in der man zum Beispiel die Größe der Dateien sieht und wann sie das letzte Mal verändert worden sind.

### Folie 5 — cd verz

[Folie 5 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=5)

Kurz für „change directory“.

Mit diesem Befehl wechseln Sie das aktuelle Verzeichnis und gehen ins Verzeichnis verz.

Kurzname für aktuelles Verzeichnis ist `.`

Der Kurzname für das übergeordnete Verzeichnis (parent) lautet `..`

Wenn Sie nicht mehr wissen, was der Pfad des aktuellen Verzeichnisses ist, können Sie `pwd` (print working directory) eingeben. Meist steht das aktuelle Verzeichnis vor dem Prompt (`$`).

Mit der Tabulatortaste (↹) auf der Tastatur kann man Pfade und Dateinamen bei der Eingabe automatisch vervollständigen lassen.

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 02:56–03:25](https://www.youtube.com/watch?v=alb3FoE_CuY&t=176)**

Der nächste Befehl ist cd. Das steht für change directory. Mit diesem Befehl wechseln Sie das aktuelle Verzeichnis und gehen in das Verzeichnis, das Sie hinter cd geschrieben haben. Es gibt ein paar besondere Verzeichnisse. Der Kurzname für das aktuelle Verzeichnis ist einfach ein Punkt. Der Kurzname für das übergeordnete Verzeichnis, man sagt oft auch parent dazu, lautet Punkt Punkt. Wenn Sie nicht mehr wissen, was der Pfad des aktuellen Verzeichnisses ist, können Sie pwd eingeben. Das steht für print working directory.

**[Video 03:25–03:51](https://www.youtube.com/watch?v=alb3FoE_CuY&t=205)**

Meist steht das aktuelle Verzeichnis aber eh vor dem Prompt, also vor dem Dollarzeichen, hinter dem der Cursor steht, mit dem man die Befehle eingibt. Die Textkonsole bedient sich viel bequemer als man denkt, weil es ein paar praktische Bedienhilfen gibt. Die Namen von Pfaden und Dateien muss man auf der Konsole nicht jedes Mal komplett hinschreiben. Man muss nur die ersten paar Zeichen tippen und kann dann die Tabulator-Taste auf der Tastatur drücken. Dann werden auf magische Weise die noch fehlenden Zeichen hinzugefügt.

**[Video 03:51–04:25](https://www.youtube.com/watch?v=alb3FoE_CuY&t=231)**

Und falls das nicht passiert, drückt man zweimal hintereinander die Tabulator-Taste und bekommt eine Liste aller Namen, die noch in Frage kommen, angezeigt. Echt magisch, oder? Ja, das sollte man einfach einmal selbst ausprobieren. Zeig doch mal ein Beispiel. Ja, hatte ich eh vor. Hier habe ich cd Übung eins eingegeben, um in das Verzeichnis zu wechseln. Dass ich dorthin gewechselt bin, sieht man am Prompt. Dort steht nun ganz vorne Übung eins. Danach schaue ich mit ls den Inhalt an. Es wird nichts ausgegeben. Also ist das Verzeichnis offenbar leer. Und danach wechsle ich mit cd punkt punkt

**[Video 04:25–04:58](https://www.youtube.com/watch?v=alb3FoE_CuY&t=265)**

Wieder ins übergeordnete Verzeichnis, also da, wo ich herkam. Ah, übrigens verwendet man unter Linux keinen Backslash, sondern einen normalen Schrägstrich, um die Namen von Verzeichnissen abzutrennen. Das ist für Windows-Benutzer vielleicht ungewohnt.

### Folie 6 — Dateien und Verzeichnisse

[Folie 6 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=6)

Ein Dateisystem ist in einer baumartigen Struktur organisiert.

Verzeichnisse (Ordner) können Dateien und andere Verzeichnisse enthalten.

Ein Pfad ist der Weg zu einer bestimmten Datei oder einem bestimmten Verzeichnis.

Absolute Pfade beginnen im Stammverzeichnis (normalerweise mit „/“ gekennzeichnet).

Relative Pfade beginnen im aktuellen Verzeichnis (haben keinen / am Anfang).

Dateinamen enthalten oft Erweiterungen (z. B. .docx, .c, .txt, .py), die den Dateityp angeben.

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 04:25–04:58](https://www.youtube.com/watch?v=alb3FoE_CuY&t=265)**

Moment, nicht so schnell! Einige unserer Studierenden tun sich mit Pfaden und Dateisystemen vielleicht schwer. Ja, das verstehe ich. Moderne Betriebssysteme verstecken oft die baumartige Struktur von Dateisystemen. Sollen wir uns kurz Zeit nehmen, um Pfade, Dateien und Dateinamen genauer zu erklären? Ja, unbedingt, das sollten wir.

**[Video 04:58–05:27](https://www.youtube.com/watch?v=alb3FoE_CuY&t=298)**

In Betriebssystemen gibt es ein Dateisystem, das in einer baumartigen Struktur organisiert ist. Verzeichnisse, zu denen man oft auch Ordner sagt, können Dateien und weitere Verzeichnisse enthalten. Ein Pfad gibt den Weg zu einer bestimmten Datei oder einem bestimmten Verzeichnis an. Man schreibt dabei getrennt mit Schrägstrichen auf, durch welche Verzeichnisse man sich bewegen muss, um dorthin zu kommen. Es gibt absolute und relative Pfade. Absolute Pfade beginnen im Stammverzeichnis, also von der Wurzel des Baums.

**[Video 05:27–05:54](https://www.youtube.com/watch?v=alb3FoE_CuY&t=327)**

Dazu sagt man in Linux Root-Verzeichnis. Solche Pfade kennzeichnet man mit einem Schrägstrich am Anfang. Relativpfade beginnen stattdessen immer im aktuellen Verzeichnis und sind daran zu erkennen, dass sie eben keinen Schrägstrich am Anfang haben. Dateinamen enthalten oft Erweiterungen, zum Beispiel docx, c, txt oder py, die den Dateityp angeben. Anhand der Endung erkennen manche Betriebssysteme, mit welchem Programm sie eine Datei öffnen sollen.

**[Video 05:54–06:26](https://www.youtube.com/watch?v=alb3FoE_CuY&t=354)**

Nicht jede Datei ist mit jedem Programm lesbar. Wenn wir in VS Code ein C-Programm kompilieren und ausführen, entsteht eine ausführbare Datei ohne Dateiendung.

### Folie 7 — mkdir verz

[Folie 7 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=7)

Dieser Befehl ist die Abkürzung für „make directory“; erstellt ein neues Unterverzeichnis mit dem Namen verz im aktuellen Verzeichnis.

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 05:54–06:26](https://www.youtube.com/watch?v=alb3FoE_CuY&t=354)**

Im Beispiel heißt die einfach test. Der Quellcode, den wir geschrieben haben, liegt in test.c. Jetzt erholen wir uns kurz mit einem einfachen Befehl: mkdir. Dieser Befehl ist die Abkürzung für make directory. Damit erstellt man im aktuellen Verzeichnis ein neues Unterverzeichnis mit dem Namen verz. Ich glaube, das ist weitgehend selbsterklärend.

### Folie 8 — cp source destination

[Folie 8 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=8)

Dieser Befehl ist die Kurzform von „copy“ und ermöglicht es, ein Duplikat der Datei zu erstellen, die man als source angibt; gespeichert wird die neue Datei unter destination.

Mit ▲und ▼kann man die letzten Befehle durchgehen, verändern und mit ENTER noch einmal ausführen.

Wenn man ganze Verzeichnisse kopieren will, muss man den Befehl leicht abändern:

```text
cp -r source_dir dest_dir
```

Das „-r“ steht für rekursiv und weist cp an, den ganzen Teilbaum dieses Verzeichnisses zu durchwandern und alles darin zu kopieren (einschließlich aller darin enthaltenen Unterverzeichnisse).

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 05:54–06:26](https://www.youtube.com/watch?v=alb3FoE_CuY&t=354)**

Also machen wir gleich weiter. Als nächstes kommt cp.

**[Video 06:26–07:00](https://www.youtube.com/watch?v=alb3FoE_CuY&t=386)**

Dieser Befehl ist die Kurzform von Copy und ermöglicht es, ein Duplikat der Datei zu erstellen, die man als Source angibt. Gespeichert wird die neue Datei unter dem Namen Destination. Man kann statt eines Dateinamens hier auch ein Verzeichnis angeben. Dann wird die Datei dorthin kopiert und hat den gleichen Namen. Was ich meine, sieht man in dem Beispiel. Da habe ich den zweiten Copy-Befehl übrigens nicht selbst geschrieben, sondern mit der Pfeilaufwärts-Taste auf der Tastatur den vorherigen Befehl wiederhergeholt und dann nur den Dateinamen durch Übung eins ersetzt. Das spart viel Zeit. Wie jetzt? Du kannst auch gar keine Tastatur benutzen?

**[Video 07:00–07:31](https://www.youtube.com/watch?v=alb3FoE_CuY&t=420)**

Egal, mach einfach weiter. Wenn man ganze Verzeichnisse kopieren will, muss man den Befehl leicht abändern. Das -r ist ein Parameter, der für rekursiv steht. Damit weist man den Befehl an, den ganzen Teilbaum des angegebenen Verzeichnisses zu durchwandern und alles darin in das angegebene Zielverzeichnis zu kopieren, also alle darin enthaltenen Dateien und alle Unterverzeichnisse.

### Folie 9 — mv source destination

[Folie 9 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=9)

Dieser Befehl ist die Kurzform von „move“ und ermöglicht es, eine Datei in ein anderes Verzeichnis zu verschieben oder sie umzubenennen.

Unter Umständen wird man beim Überschreiben noch einmal gefragt, ob man sicher ist. Gibt man dort etwas anderes als „y“ ein, wird nichts überschrieben.

Man kann auch ganze Verzeichnisse verschieben; bei mv ist dazu kein `-r` erforderlich.

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 07:00–07:31](https://www.youtube.com/watch?v=alb3FoE_CuY&t=420)**

Okay, weiter. Mit dem Befehl mv, was die Kurzform von move ist, können wir eine Datei in ein anderes Verzeichnis verschieben oder sie umbenennen. Je nachdem, wie das System

**[Video 07:31–08:05](https://www.youtube.com/watch?v=alb3FoE_CuY&t=451)**

Konfiguriert ist, wird man vor dem Überschreiben von Dateien gefragt, ob man sich sicher ist. Das sieht man hier im Beispiel. Gibt man dort etwas anderes als y ein, wird nichts überschrieben. Die CS50-Umgebung ist so konfiguriert, dass man immer gefragt wird. Viele Systeme sind aber so konfiguriert, dass sie Dateien ohne Rückfrage überschreiben. Also Vorsicht! Man kann auch ganze Verzeichnisse verschieben. Beim Move ist dazu kein -r erforderlich.

### Folie 10 — rm filename

[Folie 10 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=10)

Abkürzung für „remove“ (entfernen). Löscht Dateien oder Verzeichnisse.

Vorsicht: es gibt keinen „Papierkorb“ und kein „rückgängig“.

Um ein ganzes Verzeichnis zu löschen, muss man es rekursiv entfernen:

```text
rm -r directory
```

Um die Sicherheitsabfrage zu deaktivieren, kann man bei vielen Befehlen den Parameter `-f` („force“) hinzufügen.

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 07:31–08:05](https://www.youtube.com/watch?v=alb3FoE_CuY&t=451)**

Der Befehl rm ist das digitale Äquivalent eines Shredders. Einmal gelöscht ist es weg. Und daher, liebe Studierende, machen wir immer ein Backup von unseren Daten.

**[Video 08:05–08:38](https://www.youtube.com/watch?v=alb3FoE_CuY&t=485)**

So ist es. Wie sagt man so schön: Kein Backup, kein Mitleid. Dieser Befehl löscht also Dateien oder Verzeichnisse. Und wie gesagt: Vorsicht! Es gibt auf der Kommandozeile keinen Papierkorb und kein Rückgängig. Um ein ganzes Verzeichnis zu löschen, muss man es rekursiv entfernen, indem man wieder den Parameter -r verwendet. Genauso wie Copy und Move fragt der Remove-Befehl bei uns immer noch einmal nach, bevor er löscht. Um diese Sicherheitsabfrage zu deaktivieren, kann man bei vielen Befehlen den Parameter -f, wie Force, hinzufügen. Wenn ich keine Ahnung hätte, wäre ich jetzt verwirrt.

**[Video 08:38–09:11](https://www.youtube.com/watch?v=alb3FoE_CuY&t=518)**

Im Beispiel steht doch minus rf. Stimmt. Bei vielen Befehlen kann man die Parameter zusammenfassen und hinter dasselbe minus schreiben.

### Folie 11 — Textdateien ausgeben

[Folie 11 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=11)

`cat`: Abkürzung für „concatenate“ (verketten). Zeigt Dateiinhalte an, entweder von einer oder mehrerer Dateien hintereinander.

`head`: Zeigt die ersten Zeilen einer Datei an.

`tail`: Zeigt die letzten Zeilen einer Datei an.

Mit `-n` `anzahl` kann man bei `head` und `tail` die Anzahl der Zeilen festlegen, standardmäßig werden 10 Zeilen ausgegeben.

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 08:38–09:11](https://www.youtube.com/watch?v=alb3FoE_CuY&t=518)**

Minus rf ist das gleiche wie minus r minus f. Gut, dann hätten wir das auch geklärt. Es gibt eine Reihe von Befehlen, die Textdateien ausgeben, zum Beispiel cat. Das ist die Abkürzung von concatenate. Damit kann man eine oder mehrere Dateien ausgeben. Man schreibt einfach die Dateinamen mit Leerzeichen getrennt hintereinander. In dieser Reihenfolge werden sie dann auch ausgegeben. Der Befehl head

**[Video 09:11–09:44](https://www.youtube.com/watch?v=alb3FoE_CuY&t=551)**

Englisch für Kopf zeigt nur die ersten zehn Zeilen der angegebenen Datei an. Der Befehl tail, Englisch für Schwanz, nur die letzten zehn Zeilen. Wie viele Zeilen angezeigt werden, kann man mit dem Parameter n festlegen. Das Beispiel zeigt das beim Befehl tail, der hier nur drei Zeilen ausgibt. Das Schöne an der Kommandozeile ist, dass man dort ziemlich einfach mit mehreren Dateien hantieren kann. Oft ist man deswegen viel schneller als mit der grafischen Benutzeroberfläche, wo man alles mühsam mit der Maus anklicken muss.

### Folie 12 — Wildcards / Leerzeichen

[Folie 12 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=12)

Ein Stern `*` steht für beliebig viele Zeichen im Dateinamen:

`ls` `*.txt` (listet alle .txt Dateien)

Ein Fragezeichen `?` steht für genau ein Zeichen:

`cat` `file??.txt` (zeigt file01.txt, fileA1.txt, etc. an)

Umgang mit Leerzeichen in Dateinamen:

Entweder: Backslash vor Leerzeichen schreiben:

```text
My\ File.txt
```

oder in Anführungszeichen setzen: `"My File.txt"`

#### Transkript

**[Video 09:11–09:44](https://www.youtube.com/watch?v=alb3FoE_CuY&t=551)**

Praktisch sind zum Beispiel Wildcards. Wildcards sind wie Joker in einem Kartenspiel.

**[Video 09:44–10:16](https://www.youtube.com/watch?v=alb3FoE_CuY&t=584)**

Sie können für beliebige Zeichen im Dateinamen stehen. Es gibt da zum einen den Stern und zum anderen das Fragezeichen. Mit ls Sternchen .txt werden zum Beispiel nur die .txt-Dateien im aktuellen Verzeichnis angezeigt. Das Sternchen kann für beliebig viele Zeichen stehen. Man kann auch nur ein Sternchen anstelle eines Dateinamens schreiben. Dann wirkt sich ein Befehl auf sämtliche Dateien und Unterverzeichnisse im aktuellen Verzeichnis aus. Das Fragezeichen steht stattdessen für genau eine Stelle. Damit kann man wie im angezeigten Beispiel alle Dateien behandeln.

**[Video 10:16–10:49](https://www.youtube.com/watch?v=alb3FoE_CuY&t=616)**

Deren Dateiname mit irgendwelchen zwei Zeichen endet. Fairerweise muss man sagen, dass nicht alles in der Kommandozeile bequemer ist als in einer grafischen Oberfläche. Dateinamen mit Leerzeichen sind zum Beispiel immer etwas mühsam, wenn man sie einem Programm übergibt. Woher weiß das Programm, ob es sich um einen oder mehrere Namen handelt? Daher muss man vor ein Leerzeichen im Dateinamen immer einen Backslash schreiben. Oder man setzt den ganzen Dateinamen in Anführungszeichen.

### Folie 13 — Textdateien: Sortieren

[Folie 13 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=13)

Der Befehl `sort` dient zum Sortieren von Zeilen in Textdateien. Gängige Parameter:

`sort` `file.txt` (alphabetische Sortierung)

```text
1
100
2
A
B
Z
```

`sort` `-n` `file.txt` (numerische Sortierung)

```text
A
B
Z
1
2
100
```

`sort` `-r` `file.txt` (umgekehrte Sortierung)

#### Transkript

**[Video 10:16–10:49](https://www.youtube.com/watch?v=alb3FoE_CuY&t=616)**

Schauen wir uns noch ein paar Befehle an. Ein praktischer Befehl für den Umgang mit Text ist zum Beispiel sort.

**[Video 10:49–11:21](https://www.youtube.com/watch?v=alb3FoE_CuY&t=649)**

Damit kann man die Zeilen in einer Textdatei sortieren. Standardmäßig wird dabei alphabetisch sortiert. Mit dem Parameter n kann man numerisch sortieren. Mehrstellige Zahlen wie 100 werden dann an die richtige Stelle sortiert.

### Folie 14 — Textdateien: Dubletten behandeln

[Folie 14 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=14)

Der Befehl `uniq` sucht gleiche Zeilen in Textdateien, die bereits sortiert sind.

Datei ausgeben, aber ohne aufeinanderfolgende gleiche Zeilen zu wiederholen:

```text
uniq sorted_file.txt
```

Für jede Zeile ausgeben, wie oft sie vorkommt:

```text
uniq -c sorted_file.txt
```

Nur mehrfach auftretende Zeilen ausgeben

```text
uniq -d sorted_file.txt
```

#### Transkript

**[Video 10:49–11:21](https://www.youtube.com/watch?v=alb3FoE_CuY&t=649)**

Mit dem Parameter r kann man die Zeilen in umgekehrter Reihenfolge sortiert ausgeben. Der Befehl uniq ist ebenfalls recht nützlich. Es ist wichtig zu beachten, dass uniq nur dann korrekt arbeitet, wenn es auf bereits sortierten Zeilen arbeitet. In seiner einfachsten Form gibt uniq den Inhalt einer Datei aus, ohne aufeinanderfolgende identische Zeilen zu wiederholen.

**[Video 11:21–11:49](https://www.youtube.com/watch?v=alb3FoE_CuY&t=681)**

Dies erreichen Sie, indem Sie einfach uniq gefolgt vom Namen der sortierten Datei eingeben. Wenn Sie wissen möchten, wie oft jede Zeile vorkommt, können Sie die Option -c, das steht für count, verwenden. Der Befehl uniq -c sorted file gibt jede eindeutige Zeile aus, wobei davor eine Zahl steht, die die Auftretenshäufigkeit angibt. Manchmal interessieren wir uns nur für Zeilen, die mehrfach auftreten.

### Folie 15 — Textdateien: einzelne Spalten ausgeben

[Folie 15 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=15)

Wenn in einer Textdatei jede Zeile aus mehreren Teilen besteht, die mit einem Trennzeichen (Delimiter) getrennt sind, kann man mit `cut` bestimmte Teile ausgeben.

Werte in der zweiten Spalte einer kommaseparierten CSV-Datei ausgeben:

```text
cut -f2 -d',' data.csv
```

Erstes Wort jeder Zeile ausgeben:

```text
cut -f1 -d' ' story.txt
```

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 11:21–11:49](https://www.youtube.com/watch?v=alb3FoE_CuY&t=681)**

In diesem Fall kommt die Option -d zum Einsatz.

**[Video 11:49–12:16](https://www.youtube.com/watch?v=alb3FoE_CuY&t=709)**

Mit dem Befehl cut, wie ausschneiden, kann man einzelne Spalten aus einer Textdatei, die mehrere Werte pro Zeile enthält, extrahieren. Dazu muss man die Nummer der Spalte mit dem Parameter f, wie Feld, angeben. Außerdem benötigt cut den Delimiter. Das ist das Zeichen, das die einzelnen Spalten voneinander trennt. Bei den oft verwendeten CSV-Dateien ist das ein Komma. Das sieht man schon an der Abkürzung CSV, Comma Separated Values.

### Folie 16 — Standard-Eingabe (stdin) und -Ausgabe (stdout)

[Folie 16 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=16)

Kanäle für Ein- und Ausgabe auf der Konsole:

stdin: normalerweise Tastatur stdout: normalerweise Bildschirm stderr: für Fehlermeldungen

Werden auch in unseren C-Programmen verwendet:

`get_int(…)` liest mittels stdin, `printf(…)` sendet die Ausgabe an stdout

Umleitung in Dateien möglich:

`befehl` `> datei.txt` (überschreibt Datei mit Ausgabe)

`befehl` `>> datei.txt` (hängt Ausgabe an Datei an)

`befehl` `< datei.txt` (liest Eingaben aus Datei)

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 11:49–12:16](https://www.youtube.com/watch?v=alb3FoE_CuY&t=709)**

Manchmal ist es auch ein Strichpunkt oder ein Leerzeichen.

**[Video 12:16–12:48](https://www.youtube.com/watch?v=alb3FoE_CuY&t=736)**

Nachdem wir jetzt schon ein paar Befehle kennengelernt haben, ist es an der Zeit, sich das Konzept der Standardein- und Ausgabe anzusehen. Standardin und Standardout sind grundlegende Konzepte in vielen Betriebssystemen. Sie sind der Mechanismus, mit dem Konsolenprogramme Eingaben empfangen und Ausgaben erzeugen. Im Wesentlichen ist Standardin die Standardeingabequelle für ein Programm, typischerweise die Tastatur, während Standardout das Standardausgabeziel ist, normalerweise der Bildschirm. Darüber hinaus gibt es noch Standarderror, das speziell für Fehlermeldungen verwendet wird.

**[Video 12:48–13:20](https://www.youtube.com/watch?v=alb3FoE_CuY&t=768)**

Darauf gehen wir hier aber nicht näher ein. Standard Input und Output wird auch von unseren C-Programmen verwendet. Wenn wir mit get_int eine Zahl einlesen, wird diese von Standardin gelesen. Wenn wir mit printf Text ausgeben, wird er an Standardout geschickt. Das Schöne daran ist, dass wir in der Kommandozeile Eingabe und Ausgabe umleiten können. Beispielsweise würde Befehl größer Datei.txt Standardout von Befehl in Datei.txt umleiten. Achtung: Falls es die Datei vorher schon gab, wird der Inhalt dabei überschrieben und zwar ohne Rückfrage.

**[Video 13:20–13:48](https://www.youtube.com/watch?v=alb3FoE_CuY&t=800)**

Wenn stattdessen zwei Größerzeichen verwendet werden, wird das, was das Programm ausgibt, an die vorhandene Datei angehängt. Um die Eingabe aus einer Datei einzulesen, also nicht von der Tastatur, können wir das Kleinerzeichen verwenden.

### Folie 17 — Pipes

[Folie 17 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=17)

Pipes

Pipes (|) verbinden stdout eines Befehls mit stdin eines anderen.

Dadurch ist es möglich, Befehle hintereinander in einer Pipeline zur Verarbeitung von Daten anzuordnen.

Die Ausgabe des letzten Befehls in der Pipeline wird angezeigt (sofern nicht umgeleitet).

Syntax:  `Befehl1 | Befehl2 | Befehl3`

Typische Beispiele:

```text
cat zahlen | sort | uniq -c
cat data.csv | cut -f2 -d',' | sort | uniq -c
```

#### Transkript

**[Video 13:20–13:48](https://www.youtube.com/watch?v=alb3FoE_CuY&t=800)**

Das werden wir in unserem Kurs aber kaum benötigen. Pipes sind eine leistungsstarke Funktion der Unix-Shell, mit der wir Befehle verketten können. Das Pipe-Symbol, also der Senkrechtstrich, wird verwendet, um Standardout eines Befehls mit dem Standardin eines anderen zu verbinden.

**[Video 13:48–14:15](https://www.youtube.com/watch?v=alb3FoE_CuY&t=828)**

Wir können damit aus einfachen Befehlen komplexe Datenverarbeitungsworkflows bauen. Nehmen wir an, in der Datei Zahlen stehen irgendwelche Zahlen. In jeder Zeile genau eine Zahl. Mit der gezeigten Pipeline können wir ausgeben lassen, wie häufig welche Zahl vorkommt. Dazu sortieren wir die Datei zuerst mit sort und reichen das Ergebnis dann an uniq weiter, wobei wir mit dem Parameter -c erreichen, dass uniq für jede Zahl angibt, in wie vielen aufeinanderfolgenden Zeilen sie vorkam.

**[Video 14:15–14:40](https://www.youtube.com/watch?v=alb3FoE_CuY&t=855)**

Also, wie häufig sie in der Datei Zahlen enthalten war. Ich glaube, an dieser Stelle müssen wir noch erwähnen, dass viele Befehle, die einen Dateinamen als Parameter erwarten, also zum Beispiel sort und uniq, aber auch cut, auch ohne solche Parameter funktionieren. Wenn man ihnen keinen Parameter übergibt, dann lesen sie teilweise die Daten von Standardin. Das ist praktisch, weil man sie dann zum Beispiel in Pipelines verwenden kann. Stimmt.

**[Video 14:40–15:06](https://www.youtube.com/watch?v=alb3FoE_CuY&t=880)**

Sort und uniq haben in diesem Beispiel keinen Dateinamen als Parameter. Die Datei, die sie verarbeiten, wird erst einmal mit cat ausgegeben. Man könnte das cat auch weglassen und die Pipeline direkt mit sort Zahlen beginnen. Meist baut man solche Pipelines aber Schritt für Schritt zusammen und führt sie immer wieder aus, um sich anzuschauen, wie die Ausgabe gerade aussieht, bevor man sie dann um einen weiteren Befehl erweitert. Daher fängt man oft mit einem cat an.

**[Video 15:06–15:34](https://www.youtube.com/watch?v=alb3FoE_CuY&t=906)**

Man sieht, jeder Befehl in der Pipeline führt eine bestimmte Aufgabe aus und zusammen erreichen sie einen komplexeren Vorgang. Man könnte diese Pipeline auch um einen weiteren Sort mit dem Parameter -rn erweitern, um die Zahlen absteigend nach Häufigkeit sortiert auszugeben und danach noch den Befehl head -n5 anhängen, wenn man nur an den fünf häufigsten Zahlen interessiert ist. Das ist ein gutes Beispiel.

### Folie 18

[Folie 18 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=18)

E X T R A S I N 3 M I N U T E N FRAGEN – ANTWORTEN – RÄTSEL UND KURZE ZUSAMMENFASSUNG

#### Transkript

**[Video 15:06–15:34](https://www.youtube.com/watch?v=alb3FoE_CuY&t=906)**

Es zeigt, wie wir mit einer Reihe von einfachen Befehlen zusammen

**[Video 15:34–16:05](https://www.youtube.com/watch?v=alb3FoE_CuY&t=934)**

ein recht anspruchsvolles Problem lösen können, also eine kompliziertere Datenanalyse machen können. Diese Aufgabe würde viel länger dauern, wenn man sie manuell oder mit einem Programm wie Excel macht. Die Stärke von Pipes liegt in ihrer Fähigkeit, einfache spezialisierte Tools zu kombinieren, um komplexe Probleme effizient zu lösen. Und das ist ein Prinzip, das Sie nicht nur sich zu Herzen nehmen sollten bei der Verwendung der Konsole, sondern auch beim Programmieren und beim Problemlösen im Allgemeinen. Damit sind wir am Ende dieses Themas, also fast.

**[Video 16:05–16:38](https://www.youtube.com/watch?v=alb3FoE_CuY&t=965)**

Es fehlt ja noch etwas. Hier kommen die drei Extra Minuten und weil wir in den letzten paar Videos ein wenig überzogen haben, machen wir heute da etwas weniger. Hier sind ein paar Fragen zu den Inhalten, die wir heute behandelt haben. Sehr schön. Haben wir noch etwas? Moment, ich schaue nach. Oh, interessant. Wir haben hier eine Publikumsfrage zu einem Programm, das Pins generiert. Eine Studentin möchte wissen, wie man überprüfen kann, ob alle Pins in der Ausgabe unterschiedlich sind, ohne sie manuell durchzugehen. Hmm. Warum kommt mir das so bekannt vor?

**[Video 16:38–17:04](https://www.youtube.com/watch?v=alb3FoE_CuY&t=998)**

Haben wir nicht kürzlich etwas Ähnliches in einer Aufgabe gefragt? Ja, ganz recht. Ich glaube, wir haben das in unserem Video über Schleifen in C behandelt. Oh ja, stimmt. Netter Versuch. Ach, geh weiter. Das ist doch super. So können wir den Studierenden gleich zeigen, wie man die Aufgabe vom letzten Mal mit unseren neuen Kommandozeilenwerkzeugen elegant lösen kann. Dann sehen die gleich, wie praktisch die Kommandozeile ist und wie schnell man damit ans Ziel kommt. Hast recht.

**[Video 17:04–17:32](https://www.youtube.com/watch?v=alb3FoE_CuY&t=1024)**

Das ist sicher gut für die Motivation.

### Folie 19

[Folie 19 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=19)

Was ist der Unterschied zwischen einem absoluten und einem relativen Pfad? F1:

Welcher Befehl wird verwendet, um den Inhalt einer Datei anzuzeigen? F2:

Was bewirkt der Parameter `-r` beim `cp`-Befehl? F3:

F4:

Wie kann man in der Kommandozeile mehrere Dateien auf einmal löschen, die alle mit „temp“ beginnen?

#### Transkript

*Kein Transkriptabschnitt eindeutig dieser Folie zugeordnet. Möglicherweise eine Aufbau-/Grafikfolie oder eine Abweichung zwischen PDF und Video.*

### Folie 20 — „Ich habe hier ein Programm pins.c, das eine Ausgabe erzeugt, die in etwa so aussieht:“

[Folie 20 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=20)

„Ich habe hier ein Programm pins.c, das eine Ausgabe erzeugt, die in etwa so aussieht:“

```text
User: 10, PIN: 126531
User: 11, PIN: 123456
…
User: 99, PIN: 531216
```

„Ich muss herausfinden, ob alle PINs unterschiedlich sind. Wie kann ich das überprüfen, ohne von Hand die ganze Liste durchgehen zu müssen? Geht das vielleicht auf der Kommandozeile?“

Ja!

```text
./pins | cut -d':' -f3 | sort | uniq -c | sort -n
```

#### Transkript

**[Video 17:04–17:32](https://www.youtube.com/watch?v=alb3FoE_CuY&t=1024)**

Also gut, um das Problem zu lösen, könnten wir eine Pipe-Kombination verwenden. Zuerst extrahieren wir die Pins mit cut, dann sortieren wir sie und zählen die eindeutigen Werte. Die Befehlskette würde also so aussehen: Pins gepiped nach cut -d ':' -f2 gepiped nach sort gepiped nach uniq -c gepiped nach sort -n. Dann schauen wir ans Ende der Liste und gucken, ob dort Pins stehen.

**[Video 17:32–17:51](https://www.youtube.com/watch?v=alb3FoE_CuY&t=1052)**

Die mehr als einmal vorkamen. Wenn ja, dann haben nicht alle Nutzer unterschiedliche PINs. Das klingt gut.

### Folie 21 — Wildcards (\*,?) vereinfachen Arbeit

[Folie 21 als PDF](https://inf.zone/download/lectures/1-c/1.5-kommandozeile.pdf#page=21)

Kommandozeile ermöglicht

direkte Interaktion mit

mit mehreren Dateien auf einmal

Betriebssystem

Wichtige Befehle: ls, cd, mkdir, cp, mv, rm

Textverarbeitung: sort, uniq

und cut für Datenanalyse

Dateisystem: Baumstruktur mit absoluten (/) und

Pipes verbinden Befehle für komplexe

relativen Pfaden

Datenverarbeitung

> Bildinhalte sind nicht transkribiert; siehe Originalfolie.

#### Transkript

**[Video 17:32–17:51](https://www.youtube.com/watch?v=alb3FoE_CuY&t=1052)**

Sehen Sie, es lohnt sich, ein paar Handgriffe auf der Kommandozeile zu beherrschen. Das soll für heute reichen. Bis bald. Dies war Inf-Einf-B.
