![]() |
Vorlesung "UNIX"von Prof. Jürgen Plate |
vi Dateiname
Ist die Datei vorhanden, wird sie in den Editorpuffer geladen, andernfalls wird sie neu angelegt. Nach dem Aufruf des vi befindet sich der Benutzer im Kommandomodus. Die Arbeit spielt sich in zwei Ebenen ab.
Cursor-Bewegung (falls die Cursortasten nicht das Gewünschte tun)
k ↑ h ← → l ↓ jDie Handhabung des Kommandomodus des vi macht die Bedienung für den Anfänger etwas ungewohnt. Die Cursorpositionierung erfolgt mit verschiedenen Tasten, für die Eingabe von Dateibefehlen oder anderen Funktionen (z. B. Suchen/Ersetzen) ist die Eingabe eines Doppelpunktes nötig. Man befindet sich dann in ex-Modus, der ähnliche Eigenschaften hat, wie der (--> ed).
:wq Text auf die Platte schreiben und vi beenden. ZZ Text auf die Platte schreiben und vi beenden. :w Text auf Platte schreiben. :w Datei Text auf die angegebenen Datei schreiben. :w>>Datei Text an die angegebene Datei anhängen. :x wie :wq. :q Abbrechen, ohne den Text auf Platte zu schreiben. :q! Abbrechen, ohne den Text auf Platte zu schreiben. :r Datei Text aus der angegebenen Datei nach der momentanen Zeile einfügen. :e Datei Neue Datei bearbeiten Umschalten in den Eingabemodus: a (append) Eingabe rechts vom Cursor A Eingabe am Zeilenende i (insert) Engabe links vom Cursor I Eingaben am Zeilenanfang o Eingabe in der folgenden Zeile, Spalte 1. O Eingabe in der vorhergehenden Zeile, Spalte 1.Der Eingabemodus wird durch Drücken der ESC-Taste verlassen. Wenn es die Hardware ermöglicht, ändert sich die Form des Cursors beim Wechsel zwischen Eingabe- und Kommandomodus.
CTRL-F Eine Bildschirmseite vorwärts CTRL-B Eine Bildschirmseite rückwärts CTRL-D Eine halbe Bildschirmseite vorwärts CTRL-L Bildschirm neu aufbauen (wenn z.B. eine Nachricht kam)
Cursorpositionierung (im Kommandomodus):
Normalerweise ist der vi an die Pfeiltasten der Tastatur richtig angepaßt. Daneben gibt es noch folgende Möglichkeiten (Auswahl):
h Zeichen links (auch Backspace) l Zeichen rechts (auch blank) k Spalte höher j Spalte tiefer b Wortanfang e Wortende w Anfang nächstes Wort H Anfang erste Zeile des Bildschirms L Anfang letzten Zeile des Bildschirms 0 (Null) Zeilenanfang $ Zeilenende RETURN nächste Zeile nG (Go) Gehe zu Zeile n. n ist eine Zeilennummer. Fehlt die Zahl, wird zur letzten Zeile der Datei gesprungen.
Löschen von Text (im Kommandomodus) und Text ändern. Die Änderungskommandos wechseln automatisch in den Eingabemodus, der mit der ESC-Taste verlassen werden muß.
x Zeichen unter dem Cursor löschen X Zeichen vor dem Cursor löschen dw ab Cursorpos. bis Wortende löschen db ab Cursorpos. bis Wortanfang löschen dd ganze Zeile löschen r Zeichen ersetzen (kein Abschluß mit ESC) R Mehrere Zeichen ersetzen s Ein Zeichen ersetzen und zusätzliche Zeichen anschließend einfügen cc Gesamte Zeile ändern cw Wort ändern
Suchen nach Zeichen oder Strings. Außer 'fx' und 'Fx' müssen die Suchkommandos mit der Return-Taste abgeschlossen werden.
fx Zeichen 'x' in der momentanen Zeile suchen (vorwärts) Fx Zeichen 'x' in der momentanen Zeile suchen (rückwärts) /str String 'str' vorwärts in der Datei suchen ?str String 'str' rückwärts in der Datei suchen // Letzten Suchbefehl wiederholen (vorwärts) ?? Letzten Suchbefehl wiederholen (rückwärts)
Sonstige Kommandos:
J Zeilen verbinden (nächste Zeile anhängen) u Letzten Befehl rückgängig machen U Aktuelle Zeile wiederherstellen . Letztes Kommando wiederholen
Wirkung | Dateinamen-Expandierung | awk, egrep | sed, ed, grep, csplit, pg, more | ex, vi |
ein beliebiges Zeichen | ? | . | . | . |
beliebige Zeichenkette | * | .* | .* | .* |
vorhergehendes Zeichen 0 mal, 1 mal oder mehrmals | * | * | * | |
1 mal oder mehrmals | + | \ { 1, } \ | ||
0 mal oder 1 mal | ? | \ { 0,1 } \ | ||
genau n mal | \ { n\ } | |||
n bis m mal | \ { n,m\ } | |||
mindestens n mal | \ { n,\ } | |||
aus der Menge 1) | [...] | [...] | [...] | [...] |
... aus der Komplementärmenge | [! ...] | [ ^ ...] | [ ^ ...] | [ ^ ...] |
Ausdruck nur am Zeilenanfang suchen | ^Ausdr. | ^Ausdr. | ^Ausdr. | |
Ausdruck nur am Zeilenende suchen | Ausdr.$ | Ausdr.$ | Ausdr.$ | |
Zeichenfolge am Wortanfang suchen | abc* | \<Ausdr. | ||
Zeichenfolge am Wortende suchen | *abc | Ausdr.\> | ||
logisches Oder (Disjunktion) | A1 | A2 |
1) Klammern können enthalten:
Operator | Beschreibung | Beispiel | Ergebnis |
? | Passt auf ein beliebiges Zeichen einmal, sofern es vorhanden ist | egrep "?erd" sample.txt | Erkennt "berd", "herd" etc. und "erd" |
* | Erkennt das vorstehende Element mehrfach, sofern es vorhanden ist | egrep "n.*rd" sample.txt | Erkennt "nerd", "nrd", "neard" etc. |
+ | Erkennt das vorstehende Element ein- oder mehrmals | egrep "[n]+erd" sample.txt | Erkennt "nerd", "nnerd" etc., aber nicht "erd" |
{n} | Erkennt das vorstehende Element genau n-mal | egrep "[a-z]{2}erd" sample.txt | Erkennt "cherd", "blerd" etc., aber nicht "nerd", "erd", "buzzerd" etc. |
{n,} | Erkennt das vorstehende Element mindestens n-mal | egrep ".{2,}erd" sample.txt | Erkennt "cherd" und "buzzerd", aber nicht "nerd" |
{n, N} | Erkennt das vorstehende Element mindestens n-mal, aber höchstens N-mal | egrep "n[e]{1,2}rd" sample.txt | Erkennt "nerd" und "neerd" |
Operator | Beschreibung | Beispiel | Ergebnis |
^ | Passt auf den Anfang einer Zeile | S/^/rhabarber / | Fügt "rhabarber " am Anfang der Zeile ein |
$ | Passt auf das Ende einer Zeile | S/$/ rhabarber/ | Fügt " rhabarber" am Ende der Zeile ein |
\< | Erkennt den Anfang eines Wortes | S/\</rhabarber/ | Fügt "rhabarber" am Anfang des Wortes ein |
egrep "\<rhabarber" sample.txt | Erkennt "rhabarberkuchen" etc. | ||
\> | Erkennt das Ende eines Wortes | S/\>/rhabarber/ | Fügt "rhabarber" am Ende des Wortes ein |
egrep "\>rhabarber" sample.txt | Erkennt "laberrhabarber" etc. | ||
\b | Passt am Anfang oder Ende eines Wortes | egrep "\brhabarber" sample.txt | Erkennt "rhabarberkuche" und "laberrhabarber" |
\B | Passt in der Mitte eines Wortes | egrep "\Brhabarber" sample.txt | Erkennt "laberhabarbercake" etc. |
[:alnum:] | Alphanumerische Zeichen: [:alpha:] und [:digit:]. |
[:alpha:] | Buchstaben: [:lower:] und [:upper:]. |
[:blank:] | Leerzeichen und Tabulator. |
[:cntrl:] | Steuerzeichen. Bei ASCII sind das die Zeichen 00 bis 1F, und 7F (DEL). |
[:digit:] | Ziffern: 0, 1, 2,... bis 9. |
[:graph:] | Graphische Zeichen: [:alnum:] und [:punct:]. |
[:lower:] | Kleinbuchstaben1: nicht notwendigerweise nur von a bis z. |
[:print:] | Druckbare Zeichen: [:alnum:], [:punct:] und Leerzeichen. |
[:punct:] | Zeichen wie: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ . |
[:space:] | whitespace: Horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf und Leerzeichen. |
[:upper:] | Großbuchstaben1: nicht notwendigerweise nur von A bis Z. |
[:xdigit:] | Hexadezimale Ziffern: 0 bis 9, A bis F, a bis f. |
1Was Buchstaben sind, ist im Allgemeinen locale-abhängig.
Es gibt vordefinierte Zeichenklassen, die allerdings nicht von allen Implementierungen unterstützt werden, da sie lediglich Kurzformen sind und auch durch eine Zeichenauswahl beschrieben werden können. Wichtige Zeichenklassen sind:
; | es können mehr als ein Befehl in einer Zeile untergebracht werden, vorausgesetzt die Befehle werden durch den Strichpunkt getrennt |
& | gibt man einen Befehl gefolgt von dem Et-Zeichen (&) ein, so wird dieser Befehl im Hintergrund ausgeführt, der Befehl nimmt also das Terminal nicht in Anspruch und man kann in dieser Zeit weiterarbeiten; die Standardausgabe dieses Befehls erscheint trotzdem am Bildschirm; wird ein Befehl in den Hintergrun¦d geschickt, gibt das UNIX-System automatisch eine Nummer, die Prozeßindentifikationsnummer (siehe ps und kill), dieses Befehls aus. |
Variable | Bedeutung |
---|---|
$0 | Dateiname des Scripts |
$1 - $9 | Kommandozeilenparameters #1 - #9 |
$# | Anzahl der Kommandozeilenparameter |
$* | Alle Kommandozeilenparameter (als einzelne Worte) * |
$@ | Alle Kommandozeilenparameter (Quotierung blebt erhalten) |
${#*} | Anzahl der Kommandozeilenparameter |
${#@} | Anzahl der Kommandozeilenparameter |
$? | Rückgabewert |
$$ | Prozessnummer (PID) des Scripts |
$- | Übergebene Flags an das Script (set-Befehl) |
$_ | Letztes Argument des vorherigen Kommmandos |
$! | Processnummer (PID) des zuletzt gestarteten Hntergrundprozesses |
* | das Sternchen steht für die Namen (Zeichen) aller Dateien des Verzeichnisses, es kann am Anfang, in der Mitte oder am Ende eines Dateinamens plaziert werden |
? | das Fragezeichen ist Stellvertreter für genau ein Zeichen |
[...] | eine Liste von Zeichen, die erlaubt sein können, werden in eckigen Klammern angegebnen, das erste Zeichen muß allerdings kleiner sein bzw. weiter vorn im Alphabet liegen als das letzte Zeichen; Beispiele: [abc], [123], [0-9], [a-z], aber nicht gültige Substitution: [z-f], [5-1] |
[!...] | ist das erste Zeichen nach der öäffnenden Klammer ein Ausrufezeichen, so
wird dadurch der Sinn der Übereinstimmungsprüfung umgekehrt; Beispiel: [!a-z] = Übereinstimmung mit allen Zeichen ausgenommen Kleinbuchstaben |
[...]*[...] | mischt der Wertebereich mit anderen Zeichen; Beispiele: [a-np-z]* alle Kleinbuchstaben außer o [a-z]*[!0-9] alle Dateien, die mit einem Kleinbuchstaben beginnen und nicht mit einer Zahl enden |
" " | Keine Ersetzung der Metazeichen * ? [ ], jedoch Ersetzung von
Shellvariablen (siehe unten) und Ersetzung durch die Ergebnisse von Kommandos
(Backquote). Auch \ funktioniert weiterhin. Dazu ein Beispiel:
echo Der * wird hier durch alle Dateinamen ersetzt echo "Der * wird hier nicht ersetzt" |
' ' | Das einfache Anführungszeichen unterdrückt jede
Substitution. Zum Beispiel:
echo 'Weder * noch `pwd` werden ersetzt' |
` ` | Zwischen Backquote (Accent Grave) gesetzte Kommandos werden ausgeführt
und das Ergebnis wird dann als Parameter übergeben (d. h. die Ausgabe des Kommandos
landet als Parameter in der Kommandozeile). Dabei werden Zeilenwechsel zu Leerzeichen.
Braucht dieses Kommando Parameter, tritt die normale Parameterersetzung in Kraft.
Zum Beispiel:
echo "Aktuelles Verzeichnis: `pwd`"
Weil die verschiedenen Quotes manchmal schwer zu unterscheiden sind, wurde bei der bash
eine weitere Möglichkeit eingeführt. Statt in Backquotes wird die Kommandofolge
in $( ... ) eingeschlossen., z. B.:
|
< | Umlenken des Standardeingabe |
> | Umlenken der Standardausgabe zum Erzeugen / Überschreiben einer Datei |
>> | Umlenken der Standardausgabe zum Erzeugen / Anhängen einer Datei |
<< | Umlenken der Standardeingabe vom folgenden Text |
n< | öffne für Eingabe von Datei-Deskriptor n |
n> | öffne für Ausgabe von Datei-Deskriptor n (Überschreiben) |
n>> | öffne für Ausgabe von Datei-Deskriptor n (Anhängen) |
n<< | öffne für Eingabe von Datei-Deskriptor n des folgenden Textes |
<&n | verbinde Standardeingabe mit offener Datei in Datei-Deskriptor n |
<&- | schließe Standardeingabe |
>&n | verbinde Standardausgabe mit offener Datei in Datei-Deskriptor n |
>&- | schließe Standardausgabe |
n<&m | verbinde für die Eingabe Datei-Deskriptor n mit Datei-Deskriptor m |
n<&- | schließe Datei in Datei-Deskriptor n |
n>&m | verbinde für die Ausgabe Datei-Deskriptor n mit Datei-Deskriptor m |
n>&- | schließe Datei in Datei-Deskriptor n |
Befehl 2> file | alle Fehlermeldungen, die normalerweise zur Standardfehlerausgabe gelangen würden, werden jetzt in die Datei file umgeleitet |
| | die Pipe (|) verbindet zwei Unix-Befehle miteinander, die Ausgabe des einen Befehls ist die Eingabe für den anderen Befehl; dazu muß es zwischen den betreffenden Befehlen plaziert werden; Beispiel: who | more, seitenweises Auflisten der eingeloggten user; who | wc -l, erstellt eine detaillierte Liste der eingeloggten user |
Ausdruck | Bedeutung |
-e < datei > | datei existiert |
-r < datei > | datei existiert und Leserecht |
-w <datei> | datei existiert und Schreibrecht |
-x <datei> | datei existiert und Ausführungsrecht |
-f <datei> | datei existiert und ist einfache Datei |
-d <datei> | datei existiert und ist Verzeichnis |
-h <datei> | datei existiert und ist symbolisches Link |
-c <datei> | datei existiert und ist zeichenor. Gerät |
-b <datei> | datei existiert und ist blockor. Gerät |
-p <datei> | datei existiert und ist benannte Pipe |
-u <datei> | datei existiert und für Eigentümer s-Bit gesetzt |
-g <datei> | datei existiert und für Gruppe s-Bit gesetzt |
-k <datei> | datei existiert und t- oder sticky-Bit gesetzt |
-s <datei> | datei existiert und ist nicht leer |
-L <datei> | datei ist symbolisches Link |
-S | Datei ist ein Socket |
-t <datei> | datei ist einem Terminal zugeordnet |
-O | Der User ist Eigentümer der Datei |
-G | Group id der Datei ist die eigene Gruppe |
F1 -nt F2 | Datei F1 is neuer als Datei F2 * |
F1 -ot F2 | Datei F1 is älter als Datei F2 * |
F1 -ef F2 | Dateien F1 und F2 sind hard links auf die gleiche Datei * |
! | NOT (invertiert die Bedeutung der obigen Tests) |
Arithmetikvergleich | Stringvergleich | |||
---|---|---|---|---|
Operator | Bedeutung | Operator | Bedeutung | |
-eq | gleich | = == | gleich | |
-ne | ungleich | != | ungleich | |
-lt | kleiner | \< | kleiner (ASCII) * | |
-le | kleinergleich | \> | größer (ASCII) * | |
-gt | größer | -z | String ist leer | |
-ge | größergleich | -n | String ist nicht leer | |
Arithmetikvergleich innerhalb von (( ... )) | ||||
> | größer | |||
>= | größergleich | |||
< | kleiner | |||
<= | kleinergleich |
Ausdruck | Bedeutung |
---|---|
${var} | Wert von var (dasselbe wie $var) |
${var-$DEFAULT} | Wenn var nicht existiert, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var. |
${var:-$DEFAULT} | Wenn var nicht existiert oder leer ist, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var. |
${var=$DEFAULT} | Wenn var nicht existiert, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var. |
${var:=$DEFAULT} | Wenn var nicht existiert oder leer ist, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var. |
${var+$OTHER} | Wenn var existiert, liefert der Ausdruck $OTHER, andernfalls einen leeren String. |
${var:+$OTHER} | Wenn var existiert, liefert der Ausdruck $OTHER, andernfalls einen leeren String. |
${var?$ERR_MSG} | Wenn var nicht existiert, wird $ERR_MSG ausgegeben und das Script mit Rückgabewert 1 beendet, andernfalls gibt es den Wert von var. |
${var:?$ERR_MSG} | Wenn var nicht existiert, wird $ERR_MSG ausgegeben und das Script mit Rückgabewert 1 beendet, andernfalls gibt es den Wert von var. |
${!varprefix*} | Deckt sich mit allen vorher definierten Variablen, die mit varprefix beginnen. |
${!varprefix@} | Deckt sich mit allen vorher definierten Variablen, die mit varprefix beginnen. |
Ausdruck | Interpretation |
---|---|
Eckige Klammern | |
if [ CONDITION ] | Test auf eine Bedingung |
if [[ CONDITION ]] | Erweiterter Test auf eine Bedingung |
[a-z] | Bereich von Zeichen in einem regulären Ausdruck (sed, grep, ...) |
Geschweifte Klammern | |
${variable} | Parametersubstitution |
${!variable} | Indirekte Variablenreferenz |
{ command1; command2; . . . commandN; } | Block von Kommandos |
{} | Textersetzung, z.B. bei find und xargs |
Runde Klammern | |
( command1; command2 ) | Block von Kommandos, die in einer Subshell ausgeführt werden |
Array=(element1 element2 element3) | Array-Initialisierung |
result=$(COMMAND) | Kommandosubstitution, neue Schreibweise |
>(COMMAND) | Prozess-Substitution |
<(COMMAND) | Prozess-Substitution |
var=$(( 20 + 5 )) | Integer-Arithmetik, Zuweisung an Variable |
(( var0 = var1<98?9:21 )) | Bedingter Ausdruck |
PS1=\u:\w\$Um andere Einstellungen auszuprobieren, müssen Sie die Variable neu belegen. Innerhalb dieser Einstellungen können Sie folgende Metazeichen verwenden:
Ausdruck | Bedeutung |
---|---|
${#string} | Länge des $string |
${string:position} | Extrahiert Teilstring aus $string ab $position |
${string:position:length} | Extrahiert einen Teilstring von $length Zeichen aus $string ab $position [erstes Zeichen hat Position 0] |
${string#substring} | Entferne kürzeste Übereinstimmung von $substring am Anfang von $string |
${string##substring} | Entferne längste Übereinstimmung von $substring am Anfang von $string |
${string%substring} | Entferne kürzeste Übereinstimmung von $substring am Ende von $string |
${string%%substring} | Entferne längste Übereinstimmung von $substring am Ende von $string |
${string/substring/replacement} | Ersetze erstes Auftreten $substring durch $replacement |
${string//substring/replacement} | Ersetze alle Auftreten von $substring durch $replacement |
${string/#substring/replacement} | Wenn $substring sich mit dem Anfang von $string deckt, ersetze $substring durch $replacement. |
${string/%substring/replacement} | Wenn $substring sich mit dem Ende von $string deckt, ersetze $substring durch $replacement. |
user$ echo {a,b}{1,2,3} a1 a2 a3 b1 b2 b3 echo {a,b,c}{e,f,g}.{1,2,3} ae.1 ae.2 ae.3 af.1 af.2 af.3 ag.1 ag.2 ag.3 be.1 be.2 be.3 bf.1 bf.2 bf.3 bg.1 bg.2 bg.3 ce.1 ce.2 ce.3 cf.1 cf.2 cf.3 cg.1 cg.2 cg.3
Ausdruck | Interpretation |
---|---|
result=$(COMMAND) | Kommandosubstitution, neue Schreibweise (siehe oben "Backquotes") |
>(COMMAND) | Processsubstitution |
<(COMMAND) | Processsubstitution |
Innerhalb der eckigen Klammern sind die meisten aus der Programmiersprache C bekannten Operatoren erlaubt: + - * / für die vier Grundrechenarten, % für Modulo-Berechnungen, == != < <= > >= für Vergleiche, << und >> für Bitverschiebungen, && und || für logisches UND und ODER etc. Ach Inkrement und Dekrement der Form $var++ oder $var-- sind möglich. Alle Berechnungen werden für 32-Bit-Integerzahlen ausgeführt (Zahlenbereich zwischen -2147483648 und +2147483647).
sed '5d' | lösche Zeile 5 |
sed '/[Tt]est/d' | löscht alle Zeilen, die Test oder test beinhalten |
sed -n '20,25p' text | gibt nur Zeile 20 bis 25 aus |
sed '1,10s/unix/UNIX/g' intro | macht aus unix UNIX, egal an welcher Stelle der ersten 10 Zeilen von intro es auftaucht |
sed '/jan/s/-1/-5' | wechselt das erste -1 in -5 in allen Zeilen, die jan beinhalten |
sed 's/...//' data | löscht die ersten drei Zeichen jeder Zeile von data |
sed 's/...$//' data | löscht die letzten drei Zeichen jeder Zeile von data |
sed -n '1' text | gibt alle Zeilen von text aus, wobei alle nicht druckbaren Zeichen als \nn (nn ist der oktale Wert des Zeichens) und alle Tabzeichen als > ausgegeben werden |
tr char1 char2 | wird benutzt, um Zeichen char1 aus der Standardeingabe zu char2 übersetzen |
tr : '\nnn' | ersetzt den Doppelpunkt durch das Zeichen des entsprechenden oktalen Wertes nn |
tr 'X' 'x' | ersetze alle großen X durch kleine x |
tr '()' '{}' | ersetze alle runden Klammern auf durch geschweifte Klammern auf und alle runden Klammern zu durch geschweifte Klammern zu |
tr '[a-z]' '[A-Z]' | ersetze alle Kleinbuchstaben durch Großbuchstaben |
tr '[A-Z]' '[N-Z]' '[A-M]' | ersetze alle großen A-M durch N-Z und alle N-Z durch A-M |
tr '\11' ' ' | ersetze alle Tabzeichen durch ein Leerzeichen |
tr -s ' ' ' ' | ersetze mehrere aufeinanderfolgende Leerzeichen durch ein einzelnes Leerzeichen |
tr -d '\14' | lösche alle Seitenvorschubzeichen (oktal 14) |
tr -d '[0-9]' | löscht alle Ziffern |
![]() |
![]() |