Beispiele für die Nutzung des GNU-Werkzeugkastens


Einige der nachfolgend gezeigten Kommandos sind interne (eingebaute) Kommandos moderner Shells. Implizit wird immer die Nutzung der Bash unterstellt.


Hilfe:

  # Manual-Seite des Kommandos chown aufschlagen
  man chown
  
  # Manual-Seite des Systemrufs chown aufschlagen
  # (Abschnitt 2 des Manuals)
  man 2 chown
  
  # GNU-Info-Seite des Kommandos chown aufschlagen
  info chown
  
  # Bash-Online-Hilfe für Kommando cd ausgeben
  help cd
  
  # Online-Hilfe der GNU-Tools (hier: Kommando rm)
  # durch Option --help aufrufen
  rm --help

eigene Identität / angemeldete Benutzer:

  # eigene Identität ermitteln
  id

  # Informationen über lokal angemeldete Benutzer ermitteln
  w
  finger

  # Informationen über entfernt an host angemeldete Benutzer ermitteln;
  # funktioniert nur bei Zugriff auf den entfernten finger-Dämon
  finger @host

Ausgabe und Eingabe:

  # drei Argumente unformatiert ausgeben
  echo 1 2 3

  # drei Argumente formatiert ausgeben
  printf '%d: %d(%d)\n' 1 2 3

  # Inhalt der Shell- und Umgebungs-Variablen PATH (Suchpfad) ausgeben
  echo $PATH

  # Ausgabe aller Dateinamen, die auf folgende Muster passen:
  #  - Namen unter /etc, die mit p oder s beginnen
  #  - Namen unter /etc, die mit Punkt und einem beliebigen Zeichen danach enden
  #  - Namen unter /, die nicht mit einem Buchstaben aus dem Intervall a bis f beginnen
  #  - Namen unter /usr/bin, die auf .sh enden
  echo /etc/{[ps]*,*.?} /[^a-f]* /usr/bin/*.sh

  # Datum ausgeben; Ausgabe des Kommandos date wird in das Argument
  # von echo eingefügt
  echo "Heute ist der $(date '+%d.%m.%Y')."

  # Zahl auf Variable zahl einlesen
  read -p 'Zahl: ' zahl
  
  # Zahlen ins Feld array einlesen
  read -p 'Feld: ' -a array
  
  # Feld array geschlossen ausgeben
  echo ${array[*]}
  
  # Feld array zeilenweise ausgeben
  for i in "${array[@]}"
  do
    echo "$i"
  done          

  # erstes Element von Feld array ausgeben
  echo ${array[0]}
  echo $array

  # drittes Element von Feld array ausgeben
  echo ${array[2]}

Umgang mit Prozessen:

  # alle root-Prozesse anzeigen
  ps auxww | grep '^root\b'

  # dito, nur in etwas anderem Format
  ps -ef | grep '^root\b'

  # Funktion psg definieren, die die Prozess-Liste nach einem
  # egrep-Muster durchsucht
  function psg()
  {
    ps auxww | egrep "$1" | fgrep -v "egrep $1" | fgrep -v "grep -E $1"
  }

  # Prozesse suchen, deren Einträge swap oder irq enthalten
  psg 'swap|irq'

  # Prozessbaum-Anzeige mit Prozess-ID und UID-Wechseln
  pstree -up
  
  # Prozess 324 mit Signal 9 (SIGKILL) hart beenden
  kill -9 324
  
  # Signal 15 (SIGTERM) an alle Prozesse senden, die das
  # Kommando sleep ausführen
  killall sleep
  
  # Signal 2 (SIGINT) in der Shell abfangen
  trap 'echo SIGINT' 2

  # dito
  trap 'echo SIGINT' SIGINT
  
  # Laufzeit und Status des Systems (Anzahl Nutzer, Last) anzeigen
  uptime

  # Echtzeit-Anzeige der Prozess-Liste (in Auszügen) und des System-Status
  top

Navigation im File-System:

  pwd        # absoluten Pfad des aktuellen Verzeichnisses anzeigen
             # Das interne pwd der Bash kennt einen logischen und physischen Modus.
             # Der physische Modus kann generell durch die set-Option -P oder spezifisch
             # durch die Option -P von pwd aktiviert werden.

  cd /tmp    # Wechsel des aktuellen Verzeichnisses nach /tmp
  cd         # Wechsel ins Home-Verzeichnis des aktuellen Benutzers
  cd ~max    # Wechsel ins Home-Verzeichnis des Benutzers max
  cd ..      # Wechsel ins Eltern-Verzeichnis
  cd -       # Wechsel ins zuvor aktuelle Verzeichnis

  pushd /    # aktuelles Verzeichnis im Directory-Stack merken und Wechsel nach / (Wurzel)
  pushd ~    # dito, aber Wechsel ins Home-Verzeichnis
  dirs -l -v # Anzeige des Directory-Stacks
  cd /etc    # Wechsel nach /etc
  popd       # letztes Verzeichnis des Directory-Stacks löschen und zum Verzeichnis
             # wechseln, das an der neuen Stack-Spitze steht

elementarer Umgang mit Dateien und Verzeichnissen:

  ls     # Inhalt des aktuellen Verzeichnisses im kurzen Format anzeigen
  ls -l  # Inhalt des aktuellen Verzeichnisses im langen Format anzeigen
  ls -la # dito, aber zusätzlich die Punkt-Dateien anzeigen

  ls -ld    # den Eintrag für das aktuelle Verzeichnis anzeigen
  ls -ld .  # dito
  ls -ld .. # den Eintrag für das Eltern-Verzeichnis anzeigen

  alias l='ls -l' # Alias l als Abkürzung für ls -l definieren
  l /tmp          # entspricht ls -l /tmp

  # Anzeige des Inhalts von /tmp im langen Format, umgekehrt nach der
  # Modifikationszeit geordnet (zuletzt modifizierte Files stehen am Ende der
  # Liste)
  ls -ltr /tmp

  # bei allen Files des aktuellen Verzeichnisses, deren Name auf .sh endet,
  # wird für Gruppe und Welt das Ausführungsrecht gesetzt
  chmod go+x *.sh

  chown otto abc  # File abc bekommt den Eigentümer otto

  mkdir dir1      # Verzeichnis dir1 anlegen
  rmdir dir1      # (leeres) Verzeichnis dir1 löschen
  rm -rf dir1     # Verzeichnis dir1 rekursiv und ohne Rückfrage löschen

  less /etc/passwd # /etc/passwd mit dem Pager less anzeigen

  # die Ausgabe von find . (alle Verzeichniseinträge unterhalb des
  # aktuellen Verzeichnisses) mit dem Pager less anzeigen
  find . | less

  # alle symbolischen Links unterhalb von /etc im langen Format ausgeben und
  # in den Editor vim laden
  find /etc -type l -ls | vim -

  # die Namen aller Dateien unterhalb des aktuellen Verzeichnisses ermitteln
  # und über xargs an das Kommando md5sum weitergeben (berechnet die
  # MD5-Prüfsumme für alle Argumente); durch die korrespondierenden Optionen
  # -print0 und -0 können auch Dateinamen, die Leerräume (Whitespace-Zeichen
  # wie Leerzeichen und Newlines) enthalten und somit bei der Verarbeitung
  # in der Shell Probleme verursachen, sauber behandelt werden;
  # die Ausgabe von find (die Dateiliste) wird durch tee sowohl in der Datei
  # /tmp/filelist abgespeichert als auch über eine Pipe an xargs weitergegeben;
  # das Ergebnis von md5sum wird in der Datei /tmp/summen abgelegt
  find . -type f -print0 | tee /tmp/filelist | xargs -0 md5sum > /tmp/summen

  cp file kopie # kopiert Datei file nach kopie

  # 1:1-Kopie von src nach dst (Dateien oder Dateibäume, Erhalt aller
  # Attribute, kein automatisches Überschreiben existierender Dateien)
  cp -ia src dst

  mv file new        # benennt file in new um
  mv file /tmp       # verschiebt file nach /tmp
  mv file /tmp/new   # verschiebt file nach /tmp/new

  ln -s file symlink # symbolischen Link symlink als Verweis auf file erzeugen

  rm file            # löscht Datei oder Link file

  # die oben gespeicherte Dateiliste wird per Eingabe-Umlenkung an xargs
  # übergeben; dadurch wird rm -v für alle Dateien der Liste aufgerufen;
  # somit werden alle Dateien der Liste gelöscht; durch die Option v wird
  # die Löschung protokolliert
  xargs -0 rm -v < /tmp/filelist

  # Option dotglob aktivieren, so dass Dateinamens-Muster auch Dateinamen
  # einschließen, die mit einem Punkt beginnen (außer . und ..)
  shopt -s dotglob

  # alle Dateien des aktuellen Verzeichnisses mit Ausnahme der Datei myfile
  # löschen
  echo * | fgrep -v myfile | xargs rm -f

  # dito mit alternativer Realisierung unter Verwendung erweiterter Muster
  # (Aktivierung über shopt -s extglob)
  echo !(myfile) | xargs rm -f

  # alle Dateien des aktuellen Verzeichnisses, deren Namen mit p beginnen
  # und nicht auf 29 enden (wieder unter Verwendung erweiterter Muster)
  echo p!(*29)

  # Modifikationszeit von file auf die aktuelle Zeit setzen; leere Datei
  # file anlegen, falls sie bisher nicht existiert
  touch file

  # Inhalt von /etc/hosts auf die Standardausgabe ausgeben
  cat /etc/hosts

  # /etc/passwd und /etc/hosts verketten und Zeilen von hinten nach vorn
  # ausgeben
  cat /etc/{passwd,hosts} | tac

  # Name der Resultat-Datei /tmp/resultat.txt an die Shell-Variable
  # result zuweisen
  result=/tmp/resultat.txt

  # evtl. existierende Resultat-Datei stillschweigend löschen
  rm -f $result

  for file in /etc/{hosts,printcap}
  do
    # die Variable file durchläuft die Liste der Dateinamen /etc/hosts
    # und /etc/printcap
    echo $file >> $result
      # den aktuellen Dateinamen (Inhalt der Variable file) an die
      # Resultat-Datei anhängen
    cat $file >> $result
      # den Inhalt der durch file benannten Datei an die Resultat-Datei
      # anhängen
    echo ======== >> $result
      # Trennzeile an die Resultat-Datei anhängen
  done

Montieren/Demontieren von Dateisystemen:

  # Dateisystem nach /media/floppy montieren; Ort des Dateisystems muss in der
  # Datei /etc/fstab angegeben sein
  mount /media/floppy

  # Dateisystem unter /dev/fd0 (Diskette) nach /media/floppy montieren
  mount /dev/fd0 /media/floppy

  # Dateisystem unter /media/floppy demontieren
  umount /media/floppy

Mtools: Arbeit mit MSDOS-Dateisystemen ohne Montieren/Demontieren:

  # alle Dateien des aktuellen Verzeichnisses, deren Namen auf .sh enden, ins
  # aktuelle Verzeichnis (standardmäßig die Wurzel) von Laufwerk A: (Diskette) kopieren
  mcopy *.sh a:

  # alle Dateien und Unterverzeichnisse des Verzeichnisses DISKETTE unterhalb
  # des Home-Verzeichnisses ins aktuelle Verzeichnis von Laufwerk A: kopieren
  mcopy ~/DISKETTE/* a:

  # Wenn man aktuell im Linux-Home-Verzeichnis steht, kann man kurz
  #   mcopy DISKETTE/* a:
  # schreiben.

  # alle Dateien des aktuellen Verzeichnisses der Diskette in Laufwerk A:
  # ins aktuelle Verzeichnis kopieren
  mcopy a:
  mcopy a: .  # die explizite Angabe des Ziel-Verzeichnisses . ist optional
  mcopy -v a: # Option -v protokolliert die kopierten Dateien auf die
              # Standard-Fehlerausgabe (vorzugsweise also auf den Bildschirm)

  # eine analoge Kopie in ein benanntes Verzeichnis
  mcopy a: ~/DISKETTE  # kopiert ins Verzeichnis DISKETTE unterhalb des Home-Verzeichnisses
  mcopy a: /tmp        # kopiert ins Verzeichnis /tmp

  # alle Dateien, deren Namen auf .sh enden, im aktuellen Verzeichnis von
  # Laufwerk A: (Diskette) löschen
  mdel a:\*.sh

  # Inhalt des aktuellen Verzeichnisses von A: anzeigen
  mdir

  # aktuelles MTOOLS-Verzeichnis nach A:/DATEN wechseln
  mcd a:/DATEN

  # aktuelles MTOOLS-Verzeichnis anzeigen
  mcd

  # Diskette in Laufwerk A: logisch formatieren (leeres Dateisystem erzeugen);
  # dies gestattet ein sehr schnelles Löschen des Disketteninhalts, da keine
  # physische Formatierung der Spuren erfolgt
  mformat a:

Textanalyse/-manipulation:


Komprimieren und Archivieren:

  # Datei file mittels gzip komprimieren, danach das Resultat file.gz
  # wieder dekomprimieren und anschließend file mittels bzip2 nochmals
  # komprimieren (Resultat ist file.bz2)
  gzip file ; gunzip file.gz ; bzip2 file

  # Kompressions-Kommando im Hintergrund ausführen
  gzip file &
 
  # Liste der Hintergrund-Jobs anzeigen
  jobs
 
  # aktuellen Job in den Vordergrund holen
  fg
 
  # Vordergrund-Prozess suspendieren
  Ctrl-Z
 
  # und in den Hintergrund schicken
  bg
 
  # Job 1 beenden
  kill %1
    
  # file.bz2 auf die Standard-Ausgabe dekomprimieren und Zeichen zählen
  bunzip2 -c file.bz2 | wc -c
  bzcat file.bz2 | wc -c

  # das komplette Verzeichnis dir rekursiv ins ZIP-Archiv archiv.zip
  # verpacken
  zip -r archiv.zip dir

  # Inhaltsverzeichnis des ZIP-Archivs archiv.zip ausgeben
  unzip -v archiv.zip

  # ZIP-Archiv archiv.zip entpacken
  unzip archiv.zip

  # der komplette Verzeichnisbaum, der bei dir beginnt, sowie die
  # auf .sh endenden Datei-/Verzeichnisnamen des aktuellen Verzeichnisses
  # werden in das gzip-komprimierte Tar-Archiv arch.tar.gz verpackt;
  # durch die Option v (verbose) wird jede ins Archiv aufgenommene Datei
  # protokolliert
  tar cfvz arch.tar.gz dir *.sh

  # dito, aber mit bzip2-Kompression statt gzip-Kompression
  tar cfvj arch.tar.bz2 dir *.sh

  # analoges unkomprimiertes Tar-Archiv erzeugen
  tar cfv arch.tar dir *.sh

  # Entpacken des bzip2-komprimierten Tar-Archivs arch.tar.bz2
  # mit Protokollierung (Option v), Erhalt aller Zugriffsrechte
  # (Option p), existierende Dateien nicht überschreiben (Option k)
  tar xfvjkp arch.tar.bz2
  # moderne tar-Implementierungen dekomprimieren komprimierte Archive
  # automatisch, so dass man die Option z oder j weglassen kann:
  tar xfvkp arch.tar.bz2

  # dito für das gzip-komprimierte Tar-Archiv arch.tar.gz
  tar xfvzkp arch.tar.gz
  tar xfvkp arch.tar.gz

  # Archiv-Inhalt im kurzen Format ausgeben
  tar tf arch.tar
  tar tf arch.tar.gz
  tar tf arch.tar.bz2
    # die Kompressions-Optionen z bzw. j kann man auch hier
    # bei modernen tar-Implementierungen weglassen

  # Archiv-Inhalt im langen Format (Option v) ausgeben
  tar tfv arch.tar
  tar tfv arch.tar.gz
  tar tfv arch.tar.bz2

  # alle HTML-Dateien (Endung .html) ab dem aktuellen
  # Verzeichnis 1:1 ins Verzeichnis ~/backup (Verzeichnis backup
  # unterhalb des Home-Verzeichnisses des aktuellen Benutzers) kopieren
  tar cf - $(find . -name \*.html) | (cd ~/backup && tar xfvkp -)
    # Das Kommando find ermittelt die gesuchte Dateinamens-Liste.
    # Über die Kommando-Substitution wird diese Liste an das
    # Kommando tar übergeben. Da als Archiv-Name das Minus-Zeichen
    # verwendet wird, schreibt tar sein Archiv auf die Standard-Ausgabe.
    # Über eine Pipe übergeben wir dieses Archiv an eine Sub-Shell, die
    # zunächst ins Verzeichnis ~/backup wechselt und dann mittels
    # tar das aus der Pipe gelesene Archiv entpackt. Das Minus-Zeichen
    # als Archiv-Name symbolisiert hierbei die Standard-Eingabe.
    # Das cd der Sub-Shell hat keine Rückwirkung auf das erste
    # tar-Kommando in der Eltern-Shell.

  # extrahiere diejenigen Einträge aus einem Archiv, deren Endung mit
  # p beginnt (z.B. .py)
  archiv=~/backup/archiv.tgz
  tar xfvkp $archiv $(tar tf $archiv | grep '\.p[^.]*$')
    # Mit tar tf wird der Inhalt des Archivs ausgegeben. Mittels grep
    # suchen wir uns die Files/Einträge mit passendem Namen heraus. Die
    # von grep erzeugte Liste wird via Kommando-Substitution als die
    # Liste der zu extrahierenden Einträge an tar xfvkp übergeben.

Arbeit auf entfernten Rechnern:

  # interaktives Secure-Shell-Login auf Rechner miller
  ssh miller

  # Kommando hostname via SSH auf dem entfernten Rechner miller
  # ausführen
  ssh miller hostname

  # Datei /etc/hosts ins Verzeichnis /tmp von Rechner miller kopieren
  scp /etc/hosts miller:/tmp

Drucken:

Allgemein stehen unter Linux typischerweise die Kommandos lp und lpr zum Ausdruck von Dateien zur Verfügung. Der konkrete Funktions-Umfang sowie die Optionen hängen davon ab, welches Druck-System (CUPS, LPRng) Verwendung findet. Die Details sind den Manuals zu entnehmem. Die folgenden einfachen Beispiele sollen die prinzipielle Handhabung zeigen:

  # die Ausgabe von ls -l auf den Standard-Drucker ausgeben
  ls -l | lpr

  # die Ausgabe von ls -l auf den Drucker printer1 ausgeben
  ls -l | lpr -P printer1

  # die Dateien file1 und file2 auf den Standard-Drucker ausgeben
  lpr file1 file2

  # die Dateien file1 und file2 auf den Drucker printer1 ausgeben
  lpr -P printer1 file1 file2

Holger Trapp

letzte Modifikation: 18.3.2015