Das Hubble Space Telescope HST – Ein Weltraumteleskop im All

21. Mai 2009 von zimon
Hubble Space Telescope im Februar 1997

Hubble Space Telescope im Februar 1997

Das Hubble Space Telescope ist ein Gemeinschaftsprojekt der NASA und ESA. Es wurde 1990 in eine Umlaufbahn in Höhe von 590 km gebracht und wird (aufgrund der letzten Servicemision vor einigen Tagen) noch bis mindestens 2014 in Betrieb bleiben. Aufgrund seiner Bahnneigung (28,45°) ist es von Mitteleuropa aus leider nicht zu sehen.

Der Vorteil von Weltraumteleskopen gegenüber den hier auf der Erde existierenden ist, dass es keine atmosphärischen Störungen gibt. So wird von der Atmosphäre das Ultraviolette und Infrarote Spektrum zum Teil ausgefiltert. Auch Störungen durch Luftbewegungen erschweren die Beobachtungen auf der Erde.

Technische Daten
Das HST ist zylinderförmig und hat eine Länge von 13,1 Meter mit einem Durchmesser von 4,3 Meter. Es wiegt 11,6 Tonnen. Der Durchmesser des Hauptspiegels beträgt 2,4 Meter, wodurch eine effektive Brennweite von 57,6 Metern erreicht wird. Solarzellen sichern die Stromversorgung von 2800 Watt.
6 Gyroskope dienen der Lageregelung. Daneben dienen 3 Sternensensoren (Fine Guidance Sensors FGS) der Ausrichtung. Das Teleskop wurde so konstruiert, dass Reparaturen sowie das Einsetzen neuer Gräte durch bemannte Servicemissionen möglich ist.

Aufbau des Hubble Teleskops

Aufbau des Hubble Teleskops - Bild: Andrew Buck (Quelle: Wikimedia Commons)

Das HST kann 5 wissenschaftliche Instrumente aufnhemen und verfügt derzeit über folgende:

Wide Field Camera 3

Wide Field Camera 3

  • Wide Field / Planetary Camera 2 (WFPC-2) – bestehend aus 4 800×800 Pixel CCD-Sensoren (nun durch WFC-3 ersetzt)
  • Wide Field Camera 3 (WFC-3) – bestehend aus 2 2048×2048 Pixel CCD-Sensoren
  • Near Infrared Camera and Multiobject Spectrometer (NICMOS) – mit Kameras und Spektrometer für den nahen Infrarot-Bereich
  • Space Telescope Imaging Spectrograph (STIS) – Ein Spektrograph, der während der letzten Servicemission repariert wurde. Ob er nun wieder funktioniert ist noch nicht klar.
  • Advanced Camera for Surveys (ACS) – das meistgenutzte Instrument
  • Cosmic Origins Spectrograph (COS) – Ein Spektrograph, der das Licht im ultravioletten Bereich analysieren kann und STIS ergänzen soll.

Probleme und Servicemissionen
Durch eine Abweichung des Spiegels von 2,5µm zum Rand hin lieferte das Teleskop bis 1993 nur sehr unscharfe Bilder. Ein neues Spiegelsystem (Corrective Optics Space Telescope Axial Replacement COSTAR) konnte diesen Fehler jedoch ausgleichen.

2 Aufnahmen der Galaxie M100 links ohne und rechts mit COSTAR

2 Aufnahmen der Galaxie M100 links ohne und rechts mit COSTAR

Dieses System wurde auf der ersten Wartungsmission im Dezember 1993 eingebaut. Auch die WPFC-2 wurde auf dieser Mission installiert.

Danach gab es noch 4 weitere Servicemissionen, von denen die letzte am 11. Mai 2009 startete. In dieser Mission wurden die Batterien und Gyroskope gewechselt sowie neue Instrumente angebracht. Dabei wurde COSTAR durch den Spektographen COS ersetzt, da nun alle Geräte selbstständig den Spiegelfehler korrigieren können. In dieser Mission wurde die WPFC-2 durch die WFC-3 ersetzt. Auch STIS wurde repariert, hat sich beim Funktionstest jedoch in einen Wartungsmodus geschaltet weil die Temperatur zu stark abgesunken ist. Ein weiterer Test soll folgen.

Bilder
Das Hubble-Teleskop hat eine Reihe beeindruckender Bilder geschossen. Viele Bilder von Nebeln in Star Trek sind nicht am Computer generiert sondern stammen von Hubble. Nebel finde ich persönlich auch am schönsten anzuschauen.

Die wohl bekanntesten Bilder, die Hubble je erstellt hat sind wohl das Hubble Deep Field und Das Hublle Ultra Deep Field. Das sind die tefsten Bilder unseres Universums, die je aufgenommen wurden. Das Hubble Deep Field wurde innerhalb von 10 Tagen im Dezember 1995 aufgenommen. Dafür hat ein Wissenschaftler seine gesammte zur Verfügung stehende Zeit zur Benutzung des Teleskops auf dieses Bild verwendet.

Hubble Deep Field mit eingezeichneten Sensoren

Hubble Deep Field mit eingezeichneten Sensoren

Es ist ein winziger Ausschnitt in der Nähe des großen Bärens, welches von jedem Punkt in der Umlaufbahn von Hubble gesehen werden konnte. Die 342 Einzelbilder wurden mit jedem Sensor der WPFC-2 aufgenommen. Die Belichtungszeit betrug insgesammt ca. 100 Stunden. Dieses Bild wurde sehr populär in der gesammten Astonomischen gemeinschaft. Es beinhaltet über 3000 klar erkennbare Galaxien. Über 400 wissenschaftliche Artikel wurden über dieses Bild und dessen Interpretation geschrieben.
Die ca 2 MB große Datei des ca. 3000×3000 Pixel Bildes kann in den Wikimedia-Commons heruntergeladen werden. (Ob es noch eine größere Version gibt weis ich nicht, ich habe keine gefunden.)

Aufgrund der großen Bedeutung des Deep Fields wurde neben dem Hubble Deep Field South (welches mit der WPFC-2 eine von der Südhalbkugel der Erde sichtbare Region abbildet) das Hubble Ultra Deep Field von September 2003 bis Januar 2004 generiert. Dieses wurde mit den beiden Instrumenten ACS (ingesammt 11,3 Tage Belichtungszeit) und NICMOS (insgesammt 4,5 Tage Belichtungszeit) aufgenommen. Es ist das tiefste Bild des Universums was im sichtbaren Bereich je geschossen wurde.
Auch dieses 6000×6000 Pixel große Bild von ca. 20 MB gibt es in den Wikimedia-Commons

Neben den Deep Fields hat das Hubble Teleskop viele wunderschöne Aufnahmen von Nebeln und Galaxien geschossen. Davon möchte ich hier die schönsten und bekanntesten zeigen.

Der Krebsnebel M1 im Sternbild Stier

Der Krebsnebel M1 im Sternbild Stier

Planetarische Nebel haben nichts mit Planeten zu tun. Sie sind Überreste von Supernova-Explosionen.

Orionneble M42 im Sternbild Orion

Orionnebel M42 im Sternbild Orion

Wenn ein Stern ab einer gewissen Größe seinen gesammten Wasserstoff zu Helium fusioniert hat und dieses weiter die ganze Reihe der Elemente durch bis Eisen, explodiert er als Supernova und zurück bleibt ein weißer Zwerg. Zwischenzeitlich werden die Hüllen aus Gas ins All geschleudert, die diese wunderschönen Nebel bilden. Auf einigen der Bilder kann man die weißen Zwerge noch sehen (vor allem im Katzenaugen-Nebel).

Der Orionnebel kann schon mit einem einfachen Fernglas ausgemacht werden. er Befindet sich etwas unterhalb des Schwerts des Orions.

Katzenaugen-Nebel NGC 6543 im Sternbild Drache

Katzenaugen-Nebel NGC 6543 im Sternbild Drache

Pferdekopfnebel B 33 im Sternbild Orion

Pferdekopfnebel B 33 im Sternbild Orion

Der Krebsnebel kann leider nur mit einem Teleskop beobachtet werden.

Meine Lieblingsnebel sind der Katzenaugen-Nebel sowie der Eskimonebel. Aber ich finde fast alle Nebel wunderschön und faszinierend. Der Carinanebel sowie der Orionnebel sind Emissionsnebel während der Pferdekopfnebel eine Dunkelwolke ist. Alle anderen hier gezeigten Nebel sind planetarische Nebel.

Eskimonebel NGC 2392 im Sternbild Zwillinge

Eskimonebel NGC 2392 im Sternbild Zwillinge

Helixnebel NGC 7293 im Sternbild Wassermann

Helixnebel NGC 7293 im Sternbild Wassermann

eta Carinae-Nebel NGC 3372 im Sternbild Kiel des Schiffs

eta Carinae-Nebel NGC 3372 im Sternbild Kiel des Schiffs



Antennen-Galaxien im Sternbild Rabe

Antennen-Galaxien im Sternbild Rabe

Viele Galaxien wurden früher auch als Nebel bezeichnet (z.B. Andromedanebel – eigentlich Andromeda-Galaxie),

Blackeyegalaxy M64 im Sternbild Haar der Berenike

Blackeyegalaxy M64 im Sternbild Haar der Berenike

da sie mit damaligen Fernrohren nicht von Nebeln zu unterschieden waren. Es gab nur “neblige Objekte”. Während planetarische Nebel überreste von Sternen sind, sind Galaxien Sternhaufen wie unsere Milchstraße. Besonders Spektakulär ist es, wenn 2 Galaxien zusammentreffen und ihre gewaltigen Massen wechselwirken, wie es bei den Antennen-Galaxien der Fall ist.

Warped Galaxy ESO 510 G13

Warped Galaxy ESO 510 G13

Alle Bilder in diesem Artikel sind (wenn nicht anders angegeben) von der NASA und somit Public Domain. Natürlich kann man auch auf die Bilder klicken um sie größer angezeigt zu bekommen. Trotzdem haben die meisten Bilder hier nicht die volle Auflösung. Aber ich denke es reicht um sich die Objekte einmal anzuschauen. Für Bilder mit höherer Auflösung am besten mal in den Wikimedia-Commons gucken. Ansonsten gibt es bei http://heritage.stsci.edu eine Sammlung aufbereiteter Hubble Bilder.

Weitere Weltraumteleskope

Grafik des Herschel-Weltraumteleskops

Grafik des Herschel-Weltraumteleskops

Es gibt noch eine Reihe weiterer Weltraumteleskope wie z.B. SOHO (Solar and Heliospheric Observatory) zur Beobachtung der Sonne oder das Spitzer-Weltraumteleskop. Alleine dieses Jahr wurden drei weitere Weltraumteleskope ins All gebracht (zwei davon diesen Monat von der ESA):

Als Nachfolger des HST gilt das James Webb Space Telescope, welches von der NASA für 2013 geplant ist.
Auf Wikipedia gibt es eine Übersicht über die meisten Weltraumteleskope.
[UPATE]Das Spitzer-Weltraumteleskop hat diesen Monat sein Kühlmittel aufgebraucht und somit seine Hauptmission abgeschlossen.[/UPDATE]

Links

vim Completion – Text vervollständigen mit WordCompletition, LineCompletition, FileCompletition und CodeCompletition

20. Mai 2009 von zimon

vim bietet jede Menge Funktionen an, um durch Vervollständigung Tipparbeit zu sparen. Mit einigen Tastendrücken können sich so schon einmal geschriebene Wörter und ganze Zeilen vervollständigen lassen. Aber auch Dateinamen im Dateisystem und Methodenaufrufe beim Programmieren lassen sich ergänzen. Wenn es mehrere Möglichkeiten gibt, etwas zu vervollständigen, so wird eine Reihe von Vorschlägen unterbreitet, von denen man sich die passende Ergänzung mit den Pfeiltasten auswählen und mit Enter bestätigen kann. Wird direkt der gewünschte Teil vervollständigt (unabhängig davon ob noch mehr vorgeschlagen wird oder nicht), kann man einfach weiter schreiben.
Statt den Pfeiltasten kann man auch mit Strg+n und Strg+p durch die Vorschläge navigieren.

WordCompletition
Die wohl häufigste und einfachste Möglichkeit der Vervollständigung ist die Wortvervollständigung. Hat man angefangen ein Wort zu tippen, was bereits in einem geöffneten Dokument existiert, so kann man Strg+n drücken um es zu Vervollständigen. Dabei geht vim im Text nach unten und fängt – wenn die Option wrapscan gesetzt ist – danach von oben wieder an. Möchte man die Vorschläge in umgekehrter Reihenfolge angezeigt bekommen, so wird mit Strg+p rückwärts nach Wörtern zur Vervollständigung gesucht.

LineCompletion
Sehr praktisch kann es auch sein, komplette Zeilen zu vervollständigen. Ich habe auch erst überlegt, wie selten man soetwas wohl brauchen mag, doch jedes mal wenn man nach oben geht um mit yy eine Zeile zu kopieren und sie unten wieder mit p einfügen möchte kann man dies auch mittels LineCompletion erreichen. Und das meist einfacher. Da erst viel mir auf wie häufig ich diese Funktion verwenden könnte (und mittlerweile auch verwende).
Hat man den Anfang einer Zeile geschrieben, drückt man Strg+x Strg+l (kleines L) und schon macht vim einem Vorschläge bzw. vervollständigt die Zeile automatisch, wenn es eindeutig ist.

FileCompletition
Wer sich schoneinmal gewünscht hat beim aufschreiben von Pfaden und Dateien in vim eine Möglichkeit zur Vervollständigung zu haben, der kann diese nun einfach mittels Strg+x Strg+f einleiten.

DictionaryCompletion
Über die Variable dictionary können Dateien angegeben werden, die nach Wörtern zum kompletieren durchsucht werden. Dann kann man mittels Strg+x Strg+k Wörter über ein Wörterbuch vervollständigen. Die Variable dictionary kann dabei z.B. auf /usr/share/dict/ngerman gesetzt werden, wenn aspell installiert ist.

CodeCompletion
Die CodeCompletion (OmniCompletion) wird normalerweise über Plugins der entsprechenden Sprache hinzugefügt. Diese kann man in den offiziellen Scripten suchen (am besten nach “omni” oder omnicompletion” suchen). Ist das Script der gewünschten Sprache installiert, kann man mit der Tastenkombination Strg+x Strg+o die Code-Vervollständigung einleiten. Dabei werden meist auch die Klassen nach ihren Methoden und Attributen durchsucht, so dass man diese auch vervollständigen kann.

Es werden aber auch schon von vim einige Möglichkeiten zur CodeCompletition geboten. So kann man mit Strg+x Strg+i Schlüsselwörter ergänzen, die in der aktuellen und allen inkludierten Dateien gesucht werden.
Mit Strg+x Strg+d werden Definitionen und Makros vervollständigt, die in der aktuellen und den inkludierten Dateien definiert sind.
Für diese Funktionen muss die Option include und für Definitionen zusätzlich die define Option einen regulären Ausdruck enthalten, der entsprechende Zeilen matched.

Automatische WordCompletion beim Schreiben
Mit dem Plugin autocomplpop kann man in vim schon beim Schreiben mögliche Vervollständigungen angezeigt bekommen ohne extra Strg+n oder Strg+p zu drücken. Die Autocompletion beginnt sobald man zwei oder mehr Zeichen getippt hat. Dateinamen werden vervollständigt, sobald ein Pfad erkannt wird. Auch CodeCompletion für Ruby und Python (wenn die entsprechenden Plugins installiert sind) sowie (X)HTML und CSS wird unterstützt. Um die vorgeschlagene Ergänzung zu nutzen, kann man sie mit Enter bestätigen. Mit den Pfeiltasten (oder Strg+n und Strg+p) kann man in den Vorschlägen navigieren.



Es gibt noch weitere Vervollständigungsfunktionen, die man in der Hilfe mit :h completion nachschlagen kann.

Praktische alias-Kommandos für die Bash

17. Mai 2009 von zimon

Sehr praktisch bei der Bash ist die Möglichkeit sich alias-Befehle zu konfigurieren. Damit kann man bestehende Befehle überschreiben oder Abkürzungen hinzufügen. Ich habe mal einige praktische alias-Kommandos zusammen gestellt. Es wären natürlich noch viel mehr denkbar, aber vielleicht regen die hier genannten ja beim einen oder anderen die Phantasie an.

Übrigens kann man die “Ursprungsversion” eines Kommandos, welches durch einen Alias überschrieben wurde durch ein Vorrangestelltes \ aufrufen. Also wenn es z.B. folgenden alias gibt:

alias ls="ls --color=auto"

so kann man durch die Eingabe von

\ls

den Befehl ls ohne –color=auto aufrufen.

Grundlegende Kommandos im Dateisystem

# Macht die Ausgabe von ls farbig:
alias ls='ls --color=auto' 
 
# Gibt zu jeder Datei weitere Informationen aus. Größenangaben immer "menschenlich lesbar":
alias ll='ls -lh' 
 
# Wie ll, aber es werden auch versteckte Dateien aufgelistet:
alias la='ls -lha' 
 
# Für Vertipper recht praktisch:
alias cd..='cd ..' 
alias cd-='cd -'
 
# Abkürzung für cd .. :
alias ..='cd ..' 
alias ...='cd ../..'
 
# Alle nicht existierenden Verzeichnisse automatisch erstellen:
alias mkdir='mkdir -p'
 
# Für Anfänger zu empfehlen (es wird bei jeder Datei nachgefragt)
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

Befehle die immer mit bestimmten Optionen ausgeführt werden sollen sowie Abkürzungen

# Bei df die Größen immer "menschlich lesbar" anzeigen:
alias df='df -h' 
 
# Bei du die Größen immer "menschlich lesbar" anzeigen:
alias du='du -h' 
 
# Suche in less case-insensitive:
alias l='less -i' 
 
# Zeigt Änderungen einer Datei an (wie tail -f):
alias lf='less -i +F' 
 
# Beispielhafte Abkürzung für ssh
alias meinserver='ssh user@meinserver.tld'
 
# lässt grep case-insensitive arbeiten und markiert die Treffer farbig:
alias grep='grep -i --color=auto'

Die Follow-Option von less (less +F) ist recht praktisch, da sie einfach mit Strg+c unterbrochen und mit F weitergeführt werden kann. So kann man leicht nochmal zurück scrollen.

Befehle zum Suchen, Installieren und Updaten

# Da apt-get ja meist mit sudo aufgerufen wird:
alias apt-get='sudo apt-get' 
 
#Statt dessen kann man auch die folgenden Befehle nutzen:
alias agi='sudo apt-get install'
alias acs='apt-cache search'
 
# Das ganze System updaten:
alias update='sudo apt-get update && sudo apt-get upgrade'

Komplexere Befehle

# Starte Kommando in neuem Screen-Fenster:
alias s='screen -X screen' 
 
# Dateinamen im aktuellen Verzeichnis nach Ausdruck durchsuchen:
alias lg='ls --color=always | grep --color=always -i' 
 
# Timestamp generieren:
alias timestamp='date "+%Y%m%d%H%M%S"' 
 
# Verzeichnis mit aktuellem Timestamp erstellen:
alias tsdir='timestamp | xargs mkdir' 
 
# Änderungen bei allen angegebenen Logdateien live anzeigen:
alias mylogs='sudo tail -f /var/log/{syslog,messages}' 
 
# Einen Prozess (nach Namen) suchen:
alias psg='ps ax | grep -v grep | grep ' 
 
# Die öffentliche IP ausgeben:
alias myip="wget -qO - http://checkip.dyndns.org | sed 's/[a-zA-Z<>/ :]//g'" 
 
# Zuletzt bearbeitete Datei in vim öffnen:
alias lvim="vim -c \"normal '0\"" 
 
# Die 10 Prozesse anzeigen, die den meisten RAM verbrauchen:
alias psram='ps aux | sort -rnk 4 | head'
 
# Zeige alle Prozesse bei ps (außer ps selbst) mit langer Ausgabe
alias ps='ps ax | grep -v "ps ax"'

vim Plugin – gnupg verschlüsselt Dateien

16. Mai 2009 von zimon

Mit dem Plugin gnupg können Dateien sehr leicht gpg-verschlüsselt werden. Zur Installation läd man sich die Datei gnupg.vim herunter und kopiert sie ins Verzeichnis ~/.vim/plugin. Als nächstes fügt man die folgende Zeile zur ~/.bashrc hinzu:

export GPG_TTY=‘tty‘

Um die .bashrc neu einzulesen führt man nun

source ~/.bashrc

aus oder startet eine neue Konsole.

Wenn nun vim neu gestartet wird, werden Dateien mit der Endung .pgp, .gpg oder .asc automatisch verschlüsselt. Dabei wird keine viminfo oder Swapdatei angelegt.
Beim Anlegen einer Datei öffnet sich ein horizontaler Splitscreen, in den man die Empfänger schreiben kann. Sobald dieser geschlossen wird, wird die Liste der Empfänger übernommen. Beim Speichern wird die Datei nun für die angegebenen Empfänger verschlüsselt.
Öffnet man eine Datei, die man (oder jemand anderes) für sich verschlüsselt hat, so wird man nach dem Passwort seines GPG-Schlüssels gefragt. Danach wird die Datei geöffnet.

Man kann aber auch die symmetrische Verschlüsselung von GPG verwenden. Dafür fügt man der Datei ~/.vimrc folgende Zeile hinzu:

let g:GPGPreferSymmetric = 1

Wird nun eine Datei mit einer der oben genannten Endungen angelegt, wird man beim Speichern nach einem Passwort gefragt, um die Datei zu verschlüsseln. Öffnet man eine so gespeicherte Datei, wird man wiederrum nach dem Passwort gefragt. Bei jeder Speicherung muss dann jedoch das Passwort angegeben werden.

Filter unter vim – externe Programme aus vim heraus ausführen

13. Mai 2009 von zimon

vim bietet mit dem Filterkommando ! die Möglichkeit externe Programme zu starten. Damit kann man seine Scripte direkt aus vim heraus testen oder mit Konsolenkommandos den Text manipulieren.

Externe Programme Ausfüren
Um das gerade geöffnete Script (was natürlich Ausführungsrechte besitzen muss) zu starten gibt man also folgenden Befehl ein, den man mit ENTER bestätigt:

:!./%

Die Variable % beinhaltet den aktuellen Dateinamen. Alternativ kann man natürlich auch andere Skripte starten oder den Dateinamen ausschreiben:

:!./script.pl

startet das Script script.pl im aktuellen Ordner.
Bei so gestarteten Programmen wird die Ausgabe des Programms angezeigt. Danach kommt man mit ENTER wieder zurück zu seinem Text. Man kann genausogut ganz gebräuchliche Kommandos wie ps, df, free oder ls ausführen und sich nur die Ausgabe ansehen, wenn man grad nicht die Konsole wechseln will oder kann.
Um die Ausgabe eines Kommandos in seinen Text zu übernehmen kann man das Kommando :r (für read) mit dem Filter kombinieren:

:r !free

fügt die Ausgabe von free in die Datei nach der aktuellen Zeile ein. Ein Quantifizierer kann dabei optional die Zeile angeben, hinter welche die Ausgabe eingefügt werden soll:

:4r !df -h

fügt die Ausgabe von df -h hinter die Zeile 4 ein.
Nebenbei bemerkt kann man mit dem read-Kommando auch komplette Dateien einfügen:

:r ~/.vimrc

fügt die Datei ~/.vimrc hinter die aktuelle Zeile in die Datei ein.

Text mit externen Programmen manipulieren
Um einen Text mit einem externen Kommando zu bearbeiten kann man z.B. im visuellen Modus einen Teil des Textes markieren und dann

:!sort

eingeben um die Zeilen alphabetisch zu sortieren.

Eine andere Möglichkeit ist ein Bewegungskommando mitzugeben, wodurch das externe Programm auf den Text von der aktuellen Cursorposition bis zum Ende der Bewegung ausgeführt wird. Dabei entfällt der Doppelpunkt:

!}sort

sortiert die Zeilen von der aktuellen Cursorposition bis zum Ende des Abschnitts.

Um den gesammten Text mit einem externen Programm zu bearbeiten gibt es die Bereichsangabe %. Das folgende Beispiel formatiert das komplette gerade geöffnete Perlscript mit perltidy:

:%!perltidy

Ansonsten können Bereiche auch durch ihre Zeilennummern angegeben werden. Im nächsten Beispiel werden die Zeilen 5 bis 10 sortiert:

:5,10!sort

Auch die Rechtschreibprüfung mit aspell nutzt Filter.
Praktisch kann auch die Kombination mit awk sein.

Weitere Informationen über Filter gibt es in der Hilfe, die man mit :h filter aufrufen kann.

Tipps und Tricks für die Bash

10. Mai 2009 von zimon

Hier ein paar kleine Tipps und Tricks für die Bash.

Livesuche in der History
Sucht man ein Kommando, welches man schon einmal eingegeben hat, so kann man die History (welche in der Datei ~/.bash_history gespeichert wird) durchsuchen. Die Bash stellt dafür sogar eine Livesuche bereit. Diese wird mit der Tastenkombination Strg+r eingeleitet. Danach kann man eine beliebige Zeichenkette eingeben, die in irgendeinem Befehl schonmal vorgekommen ist. Mit jedem eingegebenen Buchstaben werden Vorschläge gemacht, wobei die Suche immer Rückwärts läuft.
Durch erneutes Drücken von Strg+r kann man weiter suchen. So kann man dann z.b. mit Strg+r sudo Strg+r zum vorletzten sudo-Befehl gelangen.

Weitere History-Funktionen
Mit dem Befehl history werden alle eingegebenen Kommandos, die sich in der History befinden mit Zeilennummer ausgegeben. Gibt man dem Befehl noch eine Zahl x als Parameter mit, so werden nur die letzten x Einträge angezeigt. Mit der Option -c (clear) kann man die History löschen.
Normalerweise wird die Datei ~/.bash_history erst beim beenden der Shell geschrieben. Man kann sie aber auch sofort schreiben, indem man den Befehl history -w ausführt. Umgekehrt kann man die aktuelle History auch mittels history -r aus der Datei ~/.bash_history einlesen.

Praktische Tastenkombinationen

  • Strg+l – (kleines L) löscht den Bildschirm
  • Strg+u – löscht alles vor dem Cursor
  • Strg+t – tauscht die letzten beiden Zeichen
  • Alt+. – fügt das letzte Argument ein
  • Strg+d – beendet die Sitzung bzw. sendet ein EOF (z.B. für at).

Praktische Variablen

  • !! – kompletter letzter eingegebener Befehl
  • !$ – letztes Argument
  • $$ – PID der aktuellen Bash
  • !String – letztes Kommando, das mit String angefangen hat
  • !?String – letztes Kommando, welches String enthielt.

So kann man mit sudo !! den letzten Befehl mit root-Rechten erneut ausführen oder ihn mit echo “!!” > script.sh in eine Datei schreiben.
Nach einem Kopierbefehl wechselt man mit cd !$ in das Verzeichnis, wohin die Datei(en) kopiert wurde(n).
Mit kill -9 $$ wird die Bash geschlossen ohne dass die Historydatei geschrieben werden kann.

vi-Modus
Die Bash beinhaltet einen vi-Modus, wodurch man vi-Befehle in der Bash nutzen kann. Den Modus startet man mittels

set -o vi

Danach kann man mit ESC in den Kommandomodus gelangen und mit hjkl statt Pfeiltasten navigieren. auch dd, D , p , A, 0 und $,… funktionieren.
Die obige Zeile kann man sich auch in die ~/.bashrc schreiben, damit der vi-Modus standardmäßig aktiviert ist.
Leider funktioniert danach die Tastenkombination Strg+l nicht mehr. Diese kann man jedoch mit einem Binding wieder aktivieren. Dafür schreibt man folgendes in die ~/.bashrc:

# Strg+l - clear screen
bind -m vi-insert "\C-l":clear-screen

Geänderte Konfigurationsdatei einlesen ohne neues Terminal aufzumachen
kann man mit folgendem Befehl:

source ~/.bashrc

Prozesskontrolle
Um ein Programm im Hintergrund zu starten hängt man dem Befehl ein & an.
Hat man dies vergessen, so kann man das Programm mit Strg+z anhalten, wodurch man wieder einen Prompt bekommt. Dann kann man den Prozess mittels bg im Hintergrund weiterlaufen lassen. Um ihn wieder in den Vordergrund zu holen genügt ein fg.
Wenn mehrere Prozesse im Hintergrund laufen, so holt fg den letzten Prozess zurück, der in den Hintergrund geschickt wurde. Möchte man einen anderen Prozess in den Vordergrund holen, so kann man fg die entsprechende Job-ID (diese steht in Eckigen klammern, wenn ein Prozess gestoppt oder in den Hintergrund verschoben wird) als Argument mitgeben. Alternativ kann man als Paramter für fg ein % gefolgt von einigen Anfangsbuchstaben des Befehls mitgeben.

fg %v

holt zum Beispiel einen vim-Prozess aus dem Hintergrund (wenn keine anderen Prozesse mit v im Hintergrund sind).

Um zwei Befehle nacheinander auszuführen, kann man sie mit einem Semikolon trennen. Möchte man, dass der 2. Befehl nur ausgeführt wird, wenn der erste Befehl erfolgreich war, so trennt man sie mit &&. dies ist praktisch beim compilieren von Programmen:

./configure && make && make install

So wird make nur ausgeführt, wenn das configurescript ohne Fehler durchgelaufen ist. make install wird nur ausgeführt, wenn make auch wirklich compiliert hat.

Einige Tipps und Tricks für vim

9. Mai 2009 von zimon

Normalerweise schreibe ich ja lieber über bestimmte Funktionen von vim, da lange Listen von Befehlen langweilig und schwer zu merken sind. Wenn man sich jedoch immer nur mit einer bestimmten Funktion vertraut macht und diese eine Zeit lang nutzt, hat das einen viel größeren Lerneffekt als alles auf einmal zu versuchen.
Trotzdem gibt es einige kleine Funktionen bzw. Tricks, die sehr praktisch sind jedoch keinen eigenen Artikel ausfüllen können. Solche Tipps werde ich hier aufführen.



Zwischen den Zeilen navigieren
Wer kennt es nicht, man schreibt einen Blog- oder Forenbeitrag und die Zeile wird am Ende des Bildschirms umgebrochen. Wenn man nun mit j und k navigiert, kann man nur relativ große Textblöcke überspringen.
In solchen Fällen kann kann man gj und gk nutzen um eine sichtbare Zeile nach oben oder unten zu springen. Hierfür kann man sich nun folgende Mappings erstellen um mit Strg+j und Strg+k statt gj und gk zu navigieren:

noremap <C-J> gj
noremap <C-K> gk

Diese Zeilen kann man sich einfach in die Datei ~/.vimrc schreiben.



Text aus der Zwischenablage in Ex-Befehl einsetzen
Bei einem Suchen/Ersetzen Befehl ist es häufig lästig, das ganze Wort, welches man ersetzen möchte abzuschreiben. Statt dessen kann man es auch kopieren (z.B. mit yw) und dann wenn es benötigt wird mit Strg+r” in den Ex-Befehl einfügen. Statt ” kann man auch jeden anderen Registernamen benutzen.
Noch einfacher geht es mit Strg+r Strg+w mit dem man das Wort unter dem Cursor einfügt. Strg+r Strg+a fügt hingegen das WORT unter dem Cursor ein.



Spezialregister
Hier noch die Spezialregister, die möglicherweise mit der obigen Funktion Strg+r recht praktisch sein können:

  • – Unbenanntes Register, in dem der letzte gelöschte oder kopierte Text liegt
  • % – Der Dateiname der gerade bearbeiteten Datei
  • * – Zwischenablage der mittleren Maustaste
  • + – Zwischenablage des Systems (von Strg+c oder Strg+x)
  • / – Der letzte Suchausdruck
  • : – Das letzte Kommando im Kommandozeilenmodus
  • . – Der zuletzt eingefügte Text



Weitere praktische Tastenkombinationen für den Kommandozeilen-Modus

  • Strg+w – löscht das Wort unter dem Cursor
  • Strg+u – löscht vom Cursor bis zum Anfang
  • Strg+b – setzt den Cursor auf den Anfang
  • Strg+e – setzt den Cursor ans Ende



Einrücken beim Einfügen verhindern
Ich habe ständig das Problem, dass ich irgendetwas mit der mittleren Maustaste einfügen möchte und durch die autoindent bzw. smartindent Funktionen wird alles treppenartig eingerückt oder auskommentiert. Um dies zu umgehen ohne jedes mal die Optionen zu ändern, kann man einfach die oben beschriebenen Register * und + nutzen. So kann man den Text mit dem Befehl “*p oder “+p einfügen.



Vergessen vim mit sudo aufzurufen
Man will nur mal schnell in eine Konfigurationsdatei rein schaun ohne sie zu ändern. Dann fällt einem etwas auf und man ändert sie doch ohne daran zu denken, dass man sie garnicht mit sudo geöffnet hat. Jetzt alle Änderungen verwerfen und mit sudo öffnen oder die Datei zwischenspeichern? Nein mit folgendem Befehl kann man mit sudo in die Datei schreiben:

:w !sudo tee %

Zuerst wird man nach dem Passwort gefragt, dann muss man noch einmal Enter drücken und die Datei mit l (kleines L) neu einlesen.



Navigieren in der Hilfe
Wenn man mittels :h <Suchbegriff> nicht fündig wird, kann man den Befehl :helpgrep <Suchwort> nutzen, der alle Hilfedateien wie grep durchsucht. Mit :cnext kommt man jeweils zum nächsten vorkommen des Suchwortes. Um sich alle gefundenen Stellen anzeigen zu lassen dient :list. Ein \c ignoriert die Groß- und Kleinschreibung. So sucht :helpgrep foo\c nach “foo”, wobei Groß- und Kleinschreibung ignoriert wird.

Oft sieht man in der Hilfe weiterführende links wie z.B. |:helpgrep|. Um diesen Links zu folgen geht man mit dem Cursor darauf und drückt Strg+]. Um wieder zurück zu springen ist die Tastenkombination Strg+t gedacht.



Während des Einfügens einen Befehl ausführen
Manchmal ist man am Schreiben und würde gerne einen Befehl im Befehlsmodus ausführen wie z.B. ein eine Zeile löschen oder eine Bewegung machen. Dies kann man mit der Tastenkombination Strg+o erreichen. Danach befindet man sich weiterhin im Insert-Modus.

Ein paar Beispiele:

Strg+o dd

löscht die aktuelle Zeile.

Strg+o )

springt zum nächsten Satz.

Strg+o di)

löscht alles innerhalb der aktuellen Klammer.



Praktische Tastenkombinationen im Insert-Modus

  • Strg+i – fügt zuletzt eingefügten Text ein
  • Strg+@ – fügt zuletzt eingefügten Text ein und beendet den Insert-Modus
  • Strg+r – fügt inhalt eines Registers ein (Registername danach eingeben)
  • Strg+u – löscht von der Aktuellen Cursorposition bis zum Zeilenanfang
  • Strg+w – löscht das Wort vor dem Cursor
  • Strg+t – aktuelle Zeile einrücken
  • Strg+d – Einrückung der aktuellen Zeile rückgängig machen



Praktische Tastenkombinationen im Kommando-Modus

  • Strg+a – inkrementiert die Zahl unter dem Cursor (Quantifizierer möglich)
  • Strg+x – dekrementiert die Zahl unter dem Cursor (Quantifizierer möglich)
  • Strg+f – herunterscrollen (Anzahl der Zeilen kann mit der Option scroll definiert werden) Standard: halber Bildschirm (Quantifizierer gibt Anzahl der Zeilen an)
  • Strg+b – wie Strg+f nur zum hochscrollen
  • Strg+g – Zeigt Informationen über die Datei an
  • g Strg+g – Zeigt Informationen über die aktuelle Stelle der Datei an
  • * – Sucht nach dem Wort unter dem Cursor

Wenn man scroll auf 1 setzt gibt das einen ziemlich coolen Effekt, weil dann der Cursor an der Stelle bleibt und nur das Dokument dahinter mittels Strg+f und Strg+b nach unten und oben gescrollt wird.

Vertikale Splitscreens mit Screen

6. Mai 2009 von zimon

Heute hat mir Ploppor erzählt, dass Screen bei neueren Versionen (Ich habe es mit 4.00.03jw4 probiert, welches beim aktuellen Ubuntu 9.04 in den Standardquellen ist) vertikale Split Screens unterstützt. Diese Funktion ist noch nichteinmal in der manpage dokumentiert, weshalb es meiner Meinung nach einen eigenen Blogeintrag wert ist. Bisher kannte ich nur Patches, mit denen man Screen diese Funktion beibringen konnte. Dafür muss man es jedoch neu kompilieren.

Also mit der Tastenkombination

Strg+a |

kann man nun den Bildschirm vertikal teilen. Der Rest funktioniert wie bei normalen Splitscreens. Mit Strg+a TAB kann man zwischen den beiden Fensterhälften wechseln und mit Strg+Q wird nur noch das aktuelle Fenster angezeigt. Mit Strg+a X wird das aktuelle Fenster geschlossen.

Um die Größe des aktuellen Fensters zu ändern geht man mit Strg+a : in den Kommandozeilenmodus und gibt

resize -v size

ein, wobei size die Anzahl der Zeichen ist, die das Fenster breit sein soll. Genau wie bei horizontalen Splits kann man auch mit +size und -size das Fenster um die entsprechenden Zeichen vergrößern bzw. verkleinern. Wenn man für size ein = eingibt, so werden beide Fenster gleich groß.

Man kann die horizontalen und vertikalen Splitscreens beliebig kombinieren.

Gefunden hat er die Funktion übrigens in der Befehlsübersicht, die sich mit Strg+a ? aufrufen lässt (ganz unten)

vimdiff – 2 Dateien mit vim vergleichen und Unterschiede feststellen

5. Mai 2009 von zimon

vim hat auch eine diff-Funktion um 2 Dateien miteinander zu vergleichen und sich die Unterschiede zwischen ihnen anzeigen zu lassen. Dazu ruft man vim mit folgendem Befehl auf:

vimdiff <datei1> <datei2>

Dadurch startet vim im Diffmodus, öffnet die Dateien in einem vertikalen Splitscreen und faltet alle Stellen der beiden Dateien, die identisch sind, so dass nur die Unterschiede zu sehen sind.
Wenn man bereits eine Datei geladen hat und diese mit einer anderen vergleichen möchte, so kann man dies mit dem Kommando

:diffsplit <datei>

erreichen.

Mittels ]c kann man nun zum ersten (bzw. nächsten) Unterschied springen. Mit [c springt man zum vorherigen Unterscheid.
Mittels do (diff obtain) an einer der unterschiedlichen Textstellen übernimmt die Datei, die den Fokus besitzt die entsprechende Stelle der anderen Datei. Mit dp (diff put) wird der aktuelle Unterschied der Datei mit dem Fokus auf die andere Datei übertragen.

So kann man nun durch die Unterschiede springen und jeweils die eine oder andere Datei anpassen, bis beide Dateien gleich sind.
Übrigens kann man sich die Dateien zusätzlich in einem anderen Tab ohne Diffmodus anzeigen lassen.

Ich habe mir auch ein Mapping definiert, so dass ich mit Strg+m vorwärts durch die Unterschiede springen kann. Dazu schreibt man folgende Zeile in die ~/.vimrc

map <C-m> ]c

Weitere Hilfe zum Diffmodus in vim gibt es in der Hilfe, die mittels :h diff aufgerufen werden kann.

Keine Angst vor awk – ein Schnelleinstieg

2. Mai 2009 von zimon

Um meine Commandline-Fu Skills zu trainieren hab ich mir mal awk vorgenommen. awk gilt bei vielen Linux-Anwendern als eines der kompliziertesten Kommandos. Um mit awk zurecht zu kommen ist es jedoch einfacher es als sehr leichte Programmiersprache zu sehen und nicht als kompliziertes Kommando (zumindest ging es mir so). awk ist auch eigentlich eine Programmierspache primär um Textdateien zu verarbeiten. Sie eignet sich auch hervorragend für die Standardeingabe STDIN. Aber auch wer nicht programmieren kann, wird vielleicht an den einfachen Konstrukten gefallen finden. Dies hier wird jedoch keine Programmieranleitung.

Ich gehe hier auf nawk (new awk) ein, dass auf den meisten Linux-Distributionen der Standard ist. Es gibt noch eine erweiterte Version namens gawk (GNU awk), auf der die hier genannten Beispiele aber genauso funktionieren.

Wer irgendeine Programmiersprache (am besten C, Java oder Perl) beherrscht, wird mit awk recht schnell zurecht kommen. awk liest meist eine Textdatei (oder andere Eingabe) ein und zerstückelt sie direkt in Zeilen und diese wiederrum in Felder (Wörter). Dadurch hat man sich schon etwas Programmieraufwand gespart. Nun geht awk den Text Zeile für Zeile durch und führt das Programm auf jeder einzelnen Zeile aus. Es gibt einige Standardvariablen, die man verwenden kann:

  • $0 ist die aktuelle Zeile
  • $1 .. $n sind die Wörter der Zeile
  • NF (Number of Fields) ist die Anzahl der Felder der aktuellen Zeile
  • NR (Number of Records) ist die Nummer der aktuellen Zeile

Mit diesen Variablen kann man schon recht praktische Programme schreiben. Dabei wird für jede Zeile nach folgendem Schema vorgegangen

Muster { Aktion }

Wobei das Muster meist ein regulärer Ausdruck ist, bei dessen Gültigkeit (für die Zeile) die Aktion auf die Zeile ausgeführt wird. Es kann jedoch eine beliebige Bedingung sein. Oft wird das Muster weggelassen, was dazu führt, dass die Aktion auf jede Zeile ausgeführt wird.

Ein paar einfache Beispiele:

awk '{print $2}' datei.txt

Gibt von jeder Zeile das 2. Wort aus

awk '{print NF}' datei.txt

Gibt von jeder Zeile die Anzahl der Wörter aus

awk '{print $NF}' datei.txt

Gibt von jeder Zeile das letzte Wort aus

awk '{print NR ": " $0}' datei.txt

Gibt jede Zeile mit vorangestellter Zeilennummer aus.

Wie man sieht können Strings einfach verkettet werden indem sie aneinander geschrieben werden (ein Leerzeichen dazwischen erhöht die Lesbarkeit). Variablen werden hingegen mit , konkateniert. Ein Semikolon trennt (wie bei vielen Programmiersprachen) 2 Anweisungen.

awk 'END{print NR}' datei.txt

Gibt die Anzahl der Zeilen aus. Das END ist ein Muster, das besagt, dass die Aktion erst ausgeführt werden soll, wenn alle Zeilen bearbeitet wurden. Entsprechend gibt es ein Muster BEGIN, dessen Aktion vor dem Einlesen der Datei ausgeführt wird.

Die Hochkommata umschließen das eigentliche Programm und verhindern, dass die Shell Zeichen daraus interpretiert. Entsprechend müssen Strings innerhalb des Programms mit doppelten Anführungszeichen gekennzeichnet werden.



Variablen
Es gibt nur 2 Typen von Variablen: Zahlenwerte und Strings. Variablen brauchen nicht deklariert zu werden und werden standardmäßig mit 0 bzw. “” initialisiert. Wie bei Perl wird der Typ automatisch bestimmt.

Ein einfaches Beispiel könnte so aussehen:

awk '{sum+=$NF} END{print sum}' datei.txt

Dieses Programm addiert das letzte Wort jeder Zeile zu der Variablen sum hinzu und gibt am Ende den Inhalt von sum aus. Dies ist recht praktisch, wenn man sich die einzelnen Posten einer Bestellung in eine Datei schreibt wobei als letztes Wort jeweils der Preis steht. So kann einfach die Gesamtsumme berechnet werden ohne jeden Betrag einzeln in einen Taschenrechner tippen zu müssen.

Ein weiteres schönes Beispiel ist den Durchschnitt zu errechnen:

awk '{sum+=$NF} END{print sum/NR}' datei.txt

Hier wird das Ergebnis noch durch die Anzahl der Zeilen geteilt. Dies ist praktisch z.B. für einen Notendurchschnitt.

Ich kenne kaum eine Programmiersprache, bei der man mit so wenig Kenntnissen (Variablen, Print-Anweisung und Arithmetik) schon so viele praktische Dinge erledigen kann. Nimmt man nun noch einfache reguläre Ausdrücke hinzu, kann hat man noch mehr praktische Möglichkeiten.



Reguläre Ausdrücke als Muster Die folgenden Beispiele ließen sich so oder ähnlich auch mit anderen Kommandos realisieren, doch hier geht es ja um awk:

ls | awk '/png$/{print}'

Gibt alle png-Dateien in einem Verzeichnis aus. Statt print $0 reicht auch ein einfaches print, da ohne ein Argument standardmäßig die aktuelle Zeile ausgegeben wird. Dies ist also die gleiche Funktionalität wie ein simples grep. Genauso kann man auch wie mit grep Dateien durchsuchen:

awk '/foo/{print}' datei.txt

Gibt (wie grep) alle Zeilen aus, die “foo” enthalten. Um auch die Zeilennummern mit auszugeben, braucht man nur zusätzlich noch NR:

awk '/foo/{print NR": "$0}' datei.txt

Hier noch einige Beispiele mit dem Kommando ls:

ls -l | awk '/png$/{sum+=$5} END{print sum}'

Gibt die Gesammtgröße aller png-Dateien in einem Verzeichnis aus.

ls -l | awk '/png$/{sum+=$5; print} END{ print sum/(1024*1024)" MB"}'

Zeigt die Ausgabe von ls -l für alle png-Dateien an und gibt am Ende die Gesamtgröße in Megabytes aus.

ls -l | awk '/png$/{sum+=$5; anz++; print} END{print "Anzahl der PNG-Dateien: "anz; print "Gesammtgröße der PNG-Dateien: "sum/1024" kB ( "sum" Bytes )"; print "Durchschnittliche Größe einer PNG-Datei: "(sum/anz)/1024" kB"}'

Gibt alle PNG-Dateien mit ls -l aus und darunter, wieviele Dateien es waren, wie viel Speicher von allen png-Dateien im Verzeichnis verbraucht werden und wie groß eine Datei im Durchschnitt ist.

awk kennt auch Arrays, die beliebig dimensional sein können (mehr- und gemischtdimensional) und deren Länge vorher nicht festgelegt werden braucht. Auch assoziative Arrays sind möglich. Beispiele:

arr[5]=7; # setzt den 6. Wert des Arrays auf 7
arr[5,3]="hallo"; # setzt den 4. Wert des 6. Arrays auf "hallo". (Genauer gesagt setzt es "5 SUPSEP 3" auf "hallo")
arr["first"]=8; # assoziatives Array

Die kürzeren Programme überlegt man sich in der Regel jedes mal neu und verwirft sie nach Gebrauch wieder. Bei längeren Programmen lohnt es sich jedoch auch mal sie zu speichern. Dafür wird der Teil in den Hochkommata in eine Datei geschrieben, die nun mit awk -f aufgerufen werden kann. Statt dessen kann man auch in die erste Zeile

#!/usr/bin/awk -f

schreiben und die Datei ausführbar machen. Dann kann man sie jederzeit aufrufen.



Vordefinierte Funktionen
Bevor ich nun weiter auf die Kontrollstrukturen eingehe, möchte ich kurz einige vordefinierte Funktionen vorstellen, mit denen sich wieder viele Probleme lösen lassen.
Am praktischsten ist wohl getline, mit dem die nächste Zeile in $0 geladen wird. So kann man sich mittels

ifconfig | awk '/eth0/{getline; print $2}'

die IP-Adresse von eth0 anzeigen lassen. Doch es steht noch ein “Adresse:” davor. Um dieses Wort noch weg zu bekommen (um die IP-Adresse z.B. in Scripten verwenden zu können) kann man die Funktionen substr(s,i[,n]) und index(s,t) nutzen. substr gibt einen Teilstring von s ab der Position i aus. Das Optionale n gibt an wieviele Zeichen ausgegeben werden sollen. index gibt die Position des ersten vorkommens von t in s aus.
Daraus kann man das Programm verfeinern, so dass wirklich nur die IP-Adresse ausgegeben wird:

ifconfig | awk '/eth0/{getline; print substr($2,index($2,":")+1)}'

Ein substr($2,9) hätte es in diesem Fall zwar auch getan, das hätte bei einer englischen Ausgabe jedoch nicht mehr funktioniert (und ich habe so direkt 2 Funktionen erklärt ;-) )

Einige weitere vordefinierte Funktionen sind:

  • sin(x),cos(x) – Sinus und Cosinus von x (mit x in Radiant)
  • int(x) – Gibt Ganzzahl zurück, indem Nachkommastellen von x abgeschnitten werden
  • sqrt(x) – Wurzel von x
  • rand() – Zufallswert zwischen 0 und 1
  • and(a,b), or(a,b), xor(a,b), compl(a) – Logische Operationen
  • gsub(r,s[,t]) – ersetzt jedes vorkommen von von r durch s in der Variablen t (bzw. $0, falls t nicht gesetzt)
  • length(s) – gibt Länge von s zurück (ohne Argument Länge von $0)

Das folgende Beispiel gibt die längste Zeile eines Textes mit Zeilennummer aus:

awk 'length($0) > longest {line=$0; longest=length($0); num=NR} END{print num": "line}' datei.txt

Hier wurde als Muster eine Bedingung gewählt, deren Aktion ausgeführt wird, wenn sie wahr ist.



Kontrollstrukturen
Die Kontrollstrukturen von awk sind denen von C, Perl und Java sehr ähnlich. Die if, while und for Konstrukte sind syntaktisch identisch. Daher werde ich hier nur ein Beispiel angeben. Wegen der Lesbarkeit habe ich das Programm in mehrere Zeilen geschrieben. Man kann jedoch auch einfach alles in eine Zeile schreiben.

awk '{
	for(i=1;i<=NF;i++){
		if(length($i)>length(biggest)){
			biggest=$i;
		}
	}
}
END{print biggest}' datei.txt

gibt das längste Wort einer Datei aus. Für jede Zeile wird eine Variable i von 1 bis “Anzahl der Felder” hochgezählt und die Länge des entsprechenden Feldes mit dem bisher längsten Feld (biggest) verglichen. Ist das aktuell verglichene Feld größer als das bisher größte, so wird das größte Feld auf das aktuelle gesetzt. Am Ende wird das längste Feld ausgegeben. Als Einzeiler sieht das Programm so aus:

awk '{for(i=1;i<=NF;i++){if(length($i)>length(biggest)){biggest=$i;}}}END{print biggest}' datei.txt



Operatoren
Die Operatoren sind im Prinzip auch die gleichen wie in anderen Programmiersprachen und einige davon wurden ja auch schon benutzt. Interessant sind hier die Operatoren ~ und !~, die prüfen, ob ein regulärer Ausdruck matcht (bzw. nicht matcht).
Das folgende Beispiel bestimmt die IP-Adresse von eth0. Hier wird zusätzlich zu den oben angegebenen Programmen noch geprüft, ob das entsprechende Wort eine Folge von Ziffern mit abschließendem Punkt beinhaltet. Wenn nicht, wird ein leerer String ausgegeben:

ifconfig | awk '/eth0/{getline; if($2 ~ /[0-9]+\./){print substr($2,index($2,":")+1)} else {print ""}}'



Funktionen
Natürlich lassen sich in awk auch eigene Funktionen schreiben. Diese sind einfach nach der Syntax

function name(arg1, arg2){
...
}

zu schreiben und können wie gewohnt aufgerufen werden. Das folgende Beispiel definiert eine Funktion, die prüft, ob das übergebene Argument eine Primzahl ist. Das Programm nimmt nun jede Zeile der übergebenen Datei, die nur aus Ziffern besteht und gibt sie aus. dahinter wird geschrieben ob es eine Primzahl ist oder nicht.

#!/usr/bin/awk -f
 
function isprim(number){
	if(number==1)
	{
		return 0;
	}
	else if(number<4)
	{
		return 1;
	}
	else if(number%2==0)
	{
		return 0;
	}
	else if(number<9)
	{
		return 1;
	}
	else if(number%3==0)
	{
		return 0;
	}
	else
	{
		r=int(sqrt(number)+0.5);
		f=5;
		while(f<=r)
		{
			if(number%f==0)
			{
				return 0;
			}
			if(number%(f+2)==0)
			{
				return 0;
			}
			f=f+6;
		}
	}
	return 1;
}
 
/^[0-9]+$/{
	if(isprim($0)){
		prim=": prim";
	}else{
		prim="";
	}
	print $0,prim;
}



Ändern der Wort und Zeilentrenner
Welche Zeichen 2 Wörter bzw. Zeilen voneinander trennen, kann auch festgelegt werden. Dafür sind die beiden Variablen FS und RS zuständig. Setzt man z.B. FS=’,’ so kann man recht gut csv-Dateien (csv=Comma Separated Values) verarbeiten. Dabei dürfen die Variablen mit regulären Ausdrücken belegt werden, so dass man mit RS=’\. |\.\n|\! |\!\n|\? |\?\n’ mit Sätzen statt Zeilen arbeitet.
Ein awk-Programm, welches jeden Satz in einer eigenen Zeile ausgibt wäre z.B.

awk 'BEGIN{RS="\. |\.\n|\! |\!\n|\? |\?\n"} {print}' datei.txt

Da print ohne Parameter automatisch $0 ausgibt.
Die Variablen FS und RS können jederzeit und überall im Programm geändert werden.



Dies war jetzt nur ein kurzer Anriß um awk ein wenig zu erklären. Es gibt natürlich noch Zahlreiche weitere Funktionen, vordefinierte (oder definierbare) Variablen, Aufrufoptionen, Kontrollstrukturen, Operatoren,…
Aber mit diesem Wissen kann man schon recht schöne kleine awk-Programme schreiben um sich das Leben zu erleichtern. Auch für das Commandline-Fu sollten die hier vorgestellten Aspekte zumindest eine Zeit lang ausreichen.

Eine sehr schöne und ausführliche Anleitung zu awk gibt es unter http://www.ostc.de/awk.pdf.
Ein schönes cheat sheet bekommt man unter http://www.catonmat.net/download/awk.cheat.sheet.pdf (englisch).
Ansonsten hält wie immer die manpage weitere Informationen bereit.


Bloggeramt.de frisch gebloggt Blogverzeichnis - Blog Verzeichnis bloggerei.de