Umgang mit der Shell: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(27 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Einfache Shellsonderzeichen=
 
 
{| class="wikitable" border="1" cellpadding="2"
 
|-
 
|;
 
|Trenne Kommandos
 
|-
 
|#
 
|Kommentar
 
|-
 
|&
 
|Programm im Hintergrund starten
 
|-
 
|<nowiki>|</nowiki>
 
|STOUT von links wird zu STDIN von rechts
 
|-
 
|*
 
|steht für beliebig viel Zeichen auch 0
 
|-
 
|?
 
|steht für genau ein Zeichen
 
|-
 
|[abc]
 
|steht für eins der Zeichen in [ ] hier a b oder c
 
|-
 
|~
 
|das Homeverzeichnis
 
|-
 
|>    und    >>
 
|leite in Datei um  >  überschreibe    >> hänge an
 
|-
 
|<
 
|lesen aus Datei
 
|-
 
|2>&1
 
|leite STDERR auf STDOUT
 
|-
 
|<< ende
 
|Lesen aus Datei (Heredokument)
 
|-
 
|{ ,  ,  , }
 
|Zeichenketten zusammensetzen
 
|-
 
|"..."
 
|Entwertung der Sonderzeichen ausser $ ' \
 
|-
 
|'...'
 
|Entwertung sämtlicher Sonderzeichen ausser ' selbst
 
|-
 
|\ 
 
|Entwertung des folgenden Sonderzeichens
 
|-
 
|}
 
 
 
 
=Eingabe/Ausgabe=
 
=Eingabe/Ausgabe=
Standardeingabe (0): Laufende Programme erwarten von hier ihre Eingaben (normalerweise handelt es sich um die Tastatur).
 
 
Standardausgabe (1): Programme schreiben auf diese ihre Ausgaben (Bildschirm).
 
 
Standardfehlerausgabe (2) : Fehlerausgaben landen hier (Bildschirm, aber nur die aktive Konsole).
 
=Beispiel cat=
 
Das Programm cat liest von STDIN und gibt es STDOUT wieder aus, solange bis das EOF Zeichen kommt.
 
*cat
 
bla bla
 
bla bla
 
{{#drawio:std}}
 
 
=Umleitungen=
 
 
==Einlesen der Datei dat==
 
*cat < dat
 
wichtig
 
 
Schreiben in die Datei dat, dies überschreibt den bisherigen Inhalt der Datei
 
root@zero:~# cat > dat
 
sogar noch wichtiger
 
 
Ausgeben der Datei text
 
root@zero:~# cat dat
 
sogar noch wichtiger
 
 
Lesen aus der Datei dat und schreiben in die Datei neuedat
 
root@zero:~# cat < dat > neuedat
 
root@zero:~# cat < neuedat
 
sogar noch wichtiger
 
 
Anhängen der Ausgabe von date an die Datei neuedat
 
root@zero:~# date >> neuedat
 
root@zero:~# cat neuedat
 
sogar noch wichtiger
 
Do 18. Jun 14:08:58 CEST 2009
 
  
Umleiten des Standardfehlerkanals nach error
+
*[[Shell Einausgabe/Ausgabe]]
root@zero:~# rm sux 2> error
 
root@zero:~# more error
 
rm: Entfernen von „sux“ nicht möglich: No such file or directory
 
  
Zusammenlegen von Standardausgabe und des Standardfehlerkanals
+
=Bash Pipe=
root@zero:~# touch tux
 
root@zero:~# rm -v sux tux > aus-err 2>&1
 
root@zero:~# cat < aus-err
 
rm: Entfernen von „sux“ nicht möglich: No such file or directory
 
„tux“ entfernt
 
  
===Nacheinander auszuführende Kommandos===
+
*[[Bash Pipe]]
root@zero:~# pwd; date
 
/root
 
Do 18. Jun 14:13:05 CEST 2009
 
 
Verknüpfung von cat und wc 
 
root@zero:~# thomas@lydia:~$ cat < aus-err | wc -l
 
2
 
  
Übergeben der Ausgabe von tail als Eingabe von grep mit Hilfe der Pipe "|"
+
=Datenstrom Programme=
root@zero:~# tail /var/log/auth.log | grep xinux
 
Jun 18 13:52:33 zero nss_wins[11433]: pam_unix(login:session): session closed for user xinux
 
  
Übergeben der letzten 100 Zeilen von syslog als Eingabe von grep
+
==Sollte man kennen==
root@zero:~# tail /var/log/syslog -n 100 | grep error
+
*[[Reguläre Ausdrücke#grep|grep]]
Jun 18 09:30:54 zero kernel: [154384.692135] end_request: I/O error, dev fd0, sector 0
 
Jun 18 09:30:54 zero kernel: [154384.712137] end_request: I/O error, dev fd0, sector 0
 
 
 
==Jokerzeichen in der Shell==
 
thomas@cardassia:~$ mkdir test
 
thomas@cardassia:~$ cd test/
 
thomas@cardassia:~/test$
 
thomas@cardassia:~/test$ touch a ab abc abcd abcd b cd efg haij
 
Ein * steht für jedes Zeichen beliebig oft
 
thomas@cardassia:~/test$ ls *
 
a  ab  abc  abcd b  cd  efg  haij
 
thomas@cardassia:~/test$ ls ab*
 
ab  abc  abcd
 
Ein ? steht für ein Zeichen
 
thomas@cardassia:~/test$ ls ?
 
a b
 
thomas@cardassia:~/test$ ls ??
 
ab cd
 
thomas@cardassia:~/test$ ls ???*
 
abc  abcd  efg haij
 
Eine [] steht genau für ein Zeichen das in der Klammer ist
 
thomas@cardassia:~/test$ ls [ab]
 
a  b
 
thomas@cardassia:~/test$ ls [abc]?
 
ab  cd
 
Eine [!] steht genau für ein Zeichen das nicht in der Klammer ist
 
thomas@cardassia:~/test$ ls [!abc]*
 
efg  haij
 
Mit der {element1,element2} kann man Dateinamen generieren
 
thomas@cardassia:~/test$ mkdir -v  dir{1,2,3,4,5,6}
 
mkdir: Verzeichnis „dir1“ angelegt
 
mkdir: Verzeichnis „dir2“ angelegt
 
mkdir: Verzeichnis „dir3“ angelegt
 
mkdir: Verzeichnis „dir4“ angelegt
 
mkdir: Verzeichnis „dir5“ angelegt
 
mkdir: Verzeichnis „dir6“ angelegt
 
Backup mit Dateinamengenerierung
 
*cp -v xx{,.save}
 
 
 
Wenn kein Treffer erfolgt wird das Sonderzeichen eingesetzt
 
thomas@cardassia:~/test$ rm -r *
 
thomas@cardassia:~/test$ mkdir -v *
 
mkdir: Verzeichnis „*“ angelegt
 
thomas@cardassia:~/test$ cd *
 
thomas@cardassia:~/test/*$
 
Entwerten kann man ein Sonderzeichen mit einem \
 
thomas@cardassia:~/test$ rm -rvi \*
 
rm: Verzeichnis „*“ entfernen? n
 
Entwerten kann man mehrereSonderzeichen mit ""
 
thomas@cardassia:~/test$ rm -rvi "*"
 
rm: Verzeichnis „*“ entfernen? n
 
Entwerten kann man mehrereSonderzeichen mit ''
 
thomas@cardassia:~/test$ rm -rvi '*'
 
rm: Verzeichnis „*“ entfernen? n
 
 
 
 
 
 
 
 
 
==wc==
 
 
*[[wc]]
 
*[[wc]]
 
==tr==
 
 
*[[tr]]
 
*[[tr]]
==cut==
 
 
*[[cut]]
 
*[[cut]]
 +
*[[sed]]
 +
*[[sort]]
 +
<!--
 +
==Braucht man seltener==
 +
*[[expand]]
 +
*[[fmt]]
 +
*[[join]]
 +
*[[nl]]
 +
*[[od]]
 +
*[[paste]]
 +
*[[pr]]
 +
-->
 +
=Sonderzeichen=
  
==expand(lpi)==
+
*[[Einfache Shellsonderzeichen]] <--- Matchen von Dateien
Ersetzt Tabulatorzeichen durch Folgen von Leerzeichen und schreibt das Ergebnis auf die Standardausgabe
+
*[[Reguläre Ausdrücke]] <--- Matchen von Strings
root@zero:~# expand /etc/samba/smb.conf
 
...
 
 
 
==fmt(lpi)==
 
#Setzt den Text der Dateien im Blocksatz der angegebenen Breite durch Auffüllen von Zeilen und Entfernen von Zeilenwechseln.
 
Standardgemäß werden Leerzeilen, die Position von Leerzeichen und der Einzug am Zeilenanfang erhalten. fmt versucht,
 
Zeilenumbrüche an Satzenden durchzuführen sowie sie nach dem ersten oder vor dem letzten Wort eines Satzes zu vermeiden.
 
 
fmt [Optionen] [Dateien]
 
 
 
Optionen
 
 
 
* -p ''Präfix'': Formatiert nur Zeilen, die mit ''Präfix'' anfangen
 
root@zero:/tmp# fmt -p '#' text
 
#Setzt den Text der Dateien im Blocksatz der angegebenen Breite durch
 
#Auffüllen von Zeilen und Entfernen von Zeilenwechseln.  Standardgemäß
 
#werden Leerzeilen, die Position von Leerzeichen und der Einzug am
 
#Zeilenanfang erhalten. fmt versucht,
 
Zeilenumbrüche an Satzenden durchzuführen sowie sie nach dem ersten oder vor dem letzten Wort eines Satzes zu vermeiden.
 
 
 
* -u : Erzwingt genau ein Leerzeichen zwischen Wörtern und zwei Leerzeichen zwischen Sätzen
 
 
 
* -w ''Breite'': Setzt die Ausgabebreite auf ''Breite''
 
root@zero:/tmp# fmt -w 30 text
 
#Setzt den Text der Dateien
 
im Blocksatz der angegebenen
 
Breite durch Auffüllen
 
von Zeilen und Entfernen
 
von Zeilenwechseln.
 
#Standardgemäß werden
 
Leerzeilen, die Position von
 
Leerzeichen und der Einzug am
 
Zeilenanfang erhalten. fmt
 
versucht, Zeilenumbrüche
 
an Satzenden durchzuführen
 
sowie sie nach dem ersten
 
oder vor dem letzten Wort
 
eines Satzes zu vermeiden.
 
 
 
==join(lpi)==
 
Führt die Zeilen zweier sortierter Dateien anhand von '''Übereinstimmungen''' in einem gemeinsamen Feld zusammen.
 
 
 
root@zero:~# more name
 
1. karl
 
2. heinz
 
3. hans
 
4. otto
 
root@zero:~# more tel
 
1. 1234
 
2. 4321
 
3. 222
 
4. 121212
 
root@zero:~# join name tel > telefonbuch
 
root@zero:~# more telefonbuch
 
1. karl 1234
 
2. heinz 4321
 
3. hans 222
 
4. otto 121212
 
 
 
root@zero:~# join -t : /etc/passwd /etc/shadow
 
....
 
daemon:x:1:1:daemon:/usr/sbin:/bin/sh:*:14181:0:99999:7:::
 
bin:x:2:2:bin:/bin:/bin/sh:*:14181:0:99999:7:::
 
sys:x:3:3:sys:/dev:/bin/sh:*:14181:0:99999:7:::
 
sync:x:4:65534:sync:/bin:/bin/sync:*:14181:0:99999:7:::
 
...
 
 
 
join in dat1 nach Feld 3 und in dat2 nach Feld 2
 
thomas@lydia:~$ cat dat1
 
hugo:ps:1111
 
erwin:zw:2222
 
karl:sb:3333
 
rudi:kl:4444
 
thomas@lydia:~$ cat dat2
 
blau:1111:svn
 
grün:2222:fcs
 
gelb:3333:fch
 
rot:4444:fck
 
thomas@lydia:~$ join -t : -1 3 -2 2 dat1 dat2
 
1111:hugo:ps:blau:svn
 
2222:erwin:zw:grün:fcs
 
3333:karl:sb:gelb:fch
 
4444:rudi:kl:rot:fck
 
 
 
==nl(lpi)==
 
Nummeriert die Zeilen in einer Datei.
 
 
 
root@zero:~# nl /etc/passwd                                                 
 
    1  root:x:0:0:root:/root:/bin/bash                                     
 
    2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh                               
 
    3  bin:x:2:2:bin:/bin:/bin/sh                                           
 
    4  sys:x:3:3:sys:/dev:/bin/sh                                           
 
    5  sync:x:4:65534:sync:/bin:/bin/sync
 
    ...
 
Nummereriet mit führenden Nullen der Separatir ist ein :
 
root@zero:~# nl -s : -n rz dat1
 
 
 
==od==
 
Gibt Dateien im Oktal und anderen Formaten aus.
 
 
 
od [Optionen] Datei
 
 
 
* -j ''Bytes'': Überspringt die Anzahl ''Bytes'' einer Datei
 
* -N ''Bytes'': Gibt nur die Anzahl ''Bytes'' aus
 
* -c : Gebe ASCII Zeichen aus
 
* -f : Gebe Fließkommazahlen aus
 
* -i : Gebe Dezimal Integer aus
 
* -l : Gebe Dezimal Long aus
 
* -o : Gebe Oktal 2 Byte Einheiten aus
 
* -s : Gebe Dezimal 2 Byte Einheiten aus
 
* -x : Gebe Hexadezimale 2 Byte einheiten aus
 
 
 
Beispiele
 
 
 
Gebe Master Boot Record (die ersten 512 Byte der Festplatte /dev/sda) als Hexadezimal aus
 
root@zero:~# od '''-x -N''' 512 /dev/sda
 
0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e
 
0000020 befb 7c00 00bf b906 0200 a4f3 21ea 0006
 
0000040 be00 07be 0438 0b75 c683 8110 fefe 7507
 
0000060 ebf3 b416 b002 bb01 7c00 80b2 748a 0203
 
0000100 00ff 2000 0001 0000 0200 90fa f690 80c2
 
...
 
 
 
Schreibe "suxer" in die Datei test
 
root@zero:~# echo "suxer" > test
 
Ausgabe Hexadezimal
 
root@zero:~# od -x test
 
0000000 7573 6578 0a72
 
0000006
 
 
 
Ausgabe ASCII Zeichen
 
root@zero:~# od -c test
 
0000000  s  u  x  e  r  \n
 
0000006
 
 
 
==paste(lpi)==
 
Fügt die Zeilen von zwei oder mehr Dateien horizontal zusammen
 
root@zero:~# paste name tel
 
1. karl 1. 1234
 
2. heinz        2. 4321
 
3. hans 3. 222
 
4. otto 4. 121212
 
 
 
==pr(lpi)==
 
Bereitet Textdateien zum Drucken vor.
 
 
 
root@zero:~# echo "Plan für heute" > dokument
 
root@zero:~# more dokument
 
Plan für heute
 
root@zero:~# pr dokument 
 
 
 
 
2009-06-19 12:44                    dokument                    Seite 1
 
 
 
 
 
 
Plan für heute
 
 
 
Anmerkung Ausmaße der Bildschirmausgabe wie eine Druckseite.
 
 
 
==sed==
 
streaming editor. Mit sed ist es möglich, den Inhalt einer Datei automatisch (nicht interaktiv) zu
 
bearbeiten. Wie unter Linux üblich, wird auch hier der Text nicht wirklich verändert sondern die
 
Änderung erfolgt über die Standardausgabe, die wieder umgeleitet werden kann. Die Syntax ist ähnlich
 
des ex modus von vi. Reguläre Ausdrücke können nach Belieben benutzt werden.
 
 
 
Optionen:
 
-e Zeichenkette  wendet die Editorbefehle aus Zeichenkette auf den Text an.
 
-n gibt nur die Zeilen aus, die explizit (durch "p" ausgedruckt werden sollen
 
 
 
Gibt die dritte Zeile der Datei text aus
 
root@zero:~# sed -n "3p" text
 
34
 
 
 
Gibt die erste bis dritte Zeile von text aus
 
root@zero:~# sed -n "1,3p" text
 
sogar noch wichtiger
 
123
 
34
 
 
 
Löschen der Zeile mit "sogar"
 
root@zero:~# sed -e '/sogar/d' < text
 
123
 
34
 
4711
 
test
 
 
 
und schreiben in text2
 
root@zero:~# sed -e '/sogar/d' < text > text2
 
root@zero:~# more text2
 
123
 
34
 
4711
 
test
 
 
 
Alle 3en durch DREI ersetzen
 
root@zero:~# sed -e 's/3/DREI/g' < text
 
sogar noch wichtiger
 
12DREI
 
DREI4
 
4711
 
test
 
 
 
 
 
==sort==
 
 
 
Zum sortieren von Dateien nach Feldern benutzt man sort. sort liest von STDIN, man kann die Datei aber auch als Argument übergeben.
 
 
 
Sortiert nach dem ersten Feld
 
  root@zero:~# sort /etc/passwd
 
 
 
Es wird geprüft ob die Datei schon sortiert ist
 
root@zero:~# sort -c /etc/passwd
 
 
 
Sortiert nach dem ersten Feld (Richtungsumkehr) 
 
root@zero:~#  sort -r /etc/passwd
 
  
Führende Leersortzeichen werden ignoriert
+
=Nacheinander auszuführende Kommandos=
root@zero:~# sort -b /etc/passwd
 
  
Ausgabe  in die Datei pass
+
*[[Nacheinander auszuführende Kommandos]]
root@zero:~# sort  /etc/passwd  -o pass
 
  
nimmt : als Trenner -Voreinstellung ist TAB
+
=Jokerzeichen in der Shell=
  root@zero:~# sort -t : /etc/passwd
 
  
sortiert nach dem  3 Feld,  der Trenner ist : und es wird nummerisch sortiert
+
*[[Jokerzeichen in der Shell]]
 
root@zero:~# sort -t: -k 3 -n /etc/passwd
 
  
Sortiert nach dem  3  bis zum 5 Feld, der Trenner ist : und es wird nummerisch sortiert
+
=Übungen=
+
*[[umgang mit der Shell Übungen]]
root@zero:~# sort -t: -k 3,5 -n /etc/passwd
 

Aktuelle Version vom 18. März 2025, 11:42 Uhr

Eingabe/Ausgabe

Bash Pipe

Datenstrom Programme

Sollte man kennen

Sonderzeichen

Nacheinander auszuführende Kommandos

Jokerzeichen in der Shell

Übungen