Umgang mit der Shell

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Einfache Shellsonderzeichen

; Trenne Kommandos
# Kommentar
& Programm im Hintergrund starten
| 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

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).

Std.jpg

Umleitungen

cat

Das Programm cat liest von STDIN und gibt es STDOUT wieder aus, solange bis das EOF Zeichen kommt.

root@zero:~# cat 
bla bla
bla bla

Einlesen der Datei dat

root@zero:~# 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

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

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

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 "|"

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

root@zero:~# tail /var/log/syslog -n 100 | grep error
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

tr

tr ist ein Programm um Zeichen zu übersetzen. Dies betrifft nur die Ausgabe, die Datei selbst bleibt unverändert.

Ersetzt Kleinbuchstaben durch Großbuchstaben aus der Datei text

root@zero:~# tr "a-z" "A-Z" < text
SOGAR NOCH WICHTIGER
123
34
4711
TEST

Ersetzt alle Zahlen durch X

root@zero:~# tr "0-9" "X" < text
sogar noch wichtiger
XXX
XX
XXXX
test


root@zero:~# cat > test
+++++
###
1111

-s löscht mehrfach kommende Zeichen

root@zero:~# tr -s "+" < test
+
###
1111

-d löscht vorkommende Zeichen

root@zero:~# tr -d "#" < test
+++++ 

1111

cut

Spalten aus einer Datei schneiden. Dies betrifft nur die Ausgabe, die Datei selbst bleibt unverändert.

Schneidet die erste Spalte aus, der Delimiter ist :

root@zero:~# cut -f 1 -d : < /etc/passwd
root
daemon
bin
...
xinux
root@zero:~# more test
1234#5678#9999

Schneidet die zweite Spalte aus, der Delimiter ist #

root@zero:~# cut -f 2 -d "#" < test
5678

Schneidet bis zum 3 Zeichen ab

root@zero:~$ echo S01policykit | cut -c 4-
policykit

expand(lpi)

Ersetzt Tabulatorzeichen durch Folgen von Leerzeichen und schreibt das Ergebnis auf die Standardausgabe

root@zero:~# expand /etc/samba/smb.conf
...

fmt(lpi)

  1. 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

root@zero:~# sort -b /etc/passwd

Ausgabe in die Datei pass

root@zero:~# sort  /etc/passwd   -o pass	 

nimmt : als Trenner -Voreinstellung ist TAB

 root@zero:~# sort -t : /etc/passwd

sortiert nach dem 3 Feld, der Trenner ist : und es wird nummerisch sortiert

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

root@zero:~# sort -t: -k 3,5 -n /etc/passwd