Vertikale Splitscreens mit Screen

6. Mai 2009 von

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

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

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.

CalSky – Was gibt es heute am Himmel zu sehen?

1. Mai 2009 von

CalSky ist eine Website mit einem Kalender, der für einen gegebenen Standpunkt alle interessanten astronomischen Beobachtungsmöglichkeiten für die nächsten Tage berechnen kann. Neben Iridium Flares können auch Kometen, Planeten, Galaxien, Nebel, die ISS und vieles mehr angezeigt werden.

Zusätzlich ist eine Wettervorhersage vorhanden, die jedoch nur anhand der Wetterdaten mittels eines Modells berechnet und nicht von einem Meteorologen geprüft wird. Auch Fernsehprogramme, Regionale Veranstaltunen und andere Informationen können angezeigt werden.

Auf der Website angekommen klickt man am besten zuerst auf “Start”, wo man seine Position auf einer GoogleMaps-Karte auswählen kann und weitere Angaben machen kann. Diese können auch gespeichert werden. Man kann sich sogar mehrere Profile für verschiedene Standorte einrichten.

Nun kann man den Kalender aufrufen, wo man angeben kann, was man alles angezeigt bekommen möchte und für welchen Zeitraum. Sehr schön finde ich auch die Tageszusammenfassung “Heute am Himmel”, die über die wichtigsten Ereignisse wie Planetensichtbarkeiten, Mondphasen, aktuelle Begebenheiten und ähnliches informiert. Hat man seine Wahl getroffen, klickt man auf “Go” um die Ergebnisse angezeigt zu bekommen. Diese sind Chronologisch sortiert und enthalten alle wichtigen Informationen wie Helligkeit des Objekts, Lage und oft viele weitere Details.
Man kann sich die Termine sogar zu iCal exportieren lassen (allerdings können das recht schnell sehr viele werden).

Ganz oben rechts auf der Kalenderseite sieht man eine Miniaturansicht des Wetters mit einer kleinen Weltkugel. Klickt man auf das Wetter, so gelangt man auf die Wetterseite für seinen Ort. Dort werden die nächsten günstigen Tage für die Beobachtung des Himmels aufgelistet jeweils mit Zeitangabe (ab wann oder bis wann die Sicht gut ist). Darunter sieht man ein Satellitenbild der Region, welches jedoch meist recht alt ist. Besser ist stattdessen Sat24 zu nutzen (dazu habe ich im Artikel Iridium Flares bereits etwas geschrieben). Das Meteogramm ganz unten enthält Daten für die nächsten 7 Tage zu Temperatur, Niederschlag, Windgeschwindigkeit, Seeing, Transparenz und Wolkendecke. Allerdings sollte man sich auf die Wettervorhersage nicht zu sehr verlassen (obwohl das ja für jede Wettervorhersage gilt).

Zusätzlich gibt es noch ein “Space Weather” und sehr viele Informationen rund um das Thema Astronomie.

Das einzige was CalSky meiner Meinung nach fehlt ist ein Filter nach der (scheinbaren) Helligkeit von Objekten beim Astro-Kalender. Ich würde mir wünschen, dass man einstellen kann ab welcher Helligkeit Objekte angezeigt werden. Dies ist nur ganz grob durch die Einstellung der Astronomischen Erfahrung unter “Start” möglich (wobei dies eigentlich nur die zur Auswahl stehenden Objekte einschränkt).

Es gibt viele interessante Objekte am Himmel, die sich teils schon mit bloßem Auge oder einem Feldstecher beobachten lassen. CalSky bietet eine sehr gute Vorbereitung für Beobachtungsnächte und man sollte sich am besten eine ausgedruckte Liste mitnehmen. Wer einen Laptop hat, kann sich die HTML-Seite einfach abspeichern. Dann ist es auch nicht verkehrt direkt noch Stellarium darauf zu installieren, das hilft oft beim finden der Objekte.
Aber auch um nur ganz kurz ein Ereignis wie z.B. einen Iridium Flare oder die ISS zu sehen ist CalSky perfekt zum Planen geeignet.

vim Bewegungskommandos

30. April 2009 von

vim besitzt unglaublich viele Kommandos um den Cursor an eine andere Stelle zu bewegen. Diese können die Navigation in einem Dokument erheblich vereinfachen. Darüber hinaus können viele Kommandos mit den Bewegungskommandos kombiniert werden. Daher hier einige interessante Kommandos zum Bewegen des Cursors. Die Bewegungskommandos erlauben auch die Angabe eines Quantifizierers (Count). z.B. bewegt man den Cursor mittels j eine Zeile nach unten, mit 3j jedoch 3 Zeilen nach unten.

Neben den wohl bekanntesten zeichenweisen Bewegungskommandos h,j,k und l (links, hoch, runter und rechts) gibt es die Wortweisen Kommandos:

  • w – Bewegt den Cursor zum Anfang des nächsten Worts
  • W – Bewegt den Cursor zum Anfang des nächsten WORTS
  • b – Bewegt den Cursor zum Anfang des vorherigen Worts
  • B – Bewegt den Cursor zum Anfang des vorherigen WORTS
  • e – Bewegt den Cursor zum Ende des aktuellen Worts
  • E, – Bewegt den Cursor zum Ende des aktuellen WORTS

Dabei besteht ein Wort nur aus Zeichen, Ziffern und Unterstrichen, während ein WORT auch Sonderzeichen enthält und lediglich durch Whitespaces getrennt wird.

Dann gibt es noch die zeilenweisen Bewegungskommandos 0 und $ (um zum Anfang bzw. Ende einer Zeile zu springen) sowie die dokumentweiten gg und G (um zum Anfang bzw. Ende des Dokuments zu springen).
Mit ( und ) springt man jeweils zum vorherigen bzw. nächsten Satz (genauer gesagt auf das erste nicht whitespacezeichen hinter einem Satzzeichen), wohingegen { und } jeweils einen Absatz (definiert durch eine Leerzeile am Ende) zurück bzw. vor springt .

[[ und ]] springen zur jeweils nächsten öffnenden (bzw. schließenden) geschweiften Klammer, die am Anfang der Zeile steht. Dies ist vor allem beim Programmieren praktisch, da man so immer zur nächsten Funktion kommt (wenn man die öffnende Klammer jeweils in die nächste Zeile setzt). Mit % kann man von einer Klammer auf die korresponiderende Klammer springen. Also z.B. von } nach { oder von [ nach ]. Innerhalb einer Klammer springt % auf die öffnende Klammer. Wird ein Quantifizierer angegeben, so wird das Zeichen wirklich als Prozent interpretiert und man kann z.B. mit 20% an die Stelle Springen, die 20 % der Zeilen vom Dolumentanfang entfernt ist.

Weitere Bewegungskommandos sind t<Zeichen> und f<Zeichen>, so springt ta vor das nächste auftretende a in der Zeile. f; Springt z.B. auf das nächste Semicolon. T und F haben die gleiche Funktionalität aber rückwärts. Diese kann man mit ; wiederholen oder mit , in die entgegengesetzte Richtung.

Auch die Suche mit / und ? gilt als Bewegung wenn sie mit Enter abgeschlossen ist. Diese Kann übrigens auch quantifiziert werden, so dass 3/foo nach dem 3. Vorkommen von foo sucht. (An dieser Stelle sei nochmal darauf hingewiesen, dass die Suche auch komplexe reguläre Ausdrücke beherrscht.) Sprünge zu Markierungen gelten ebenso als Bewegung (hier kann jedoch kein Quantifizierer benutzt werden).

Diese Bewegungskommandos kann man nun mit vielen Kommandos kombinieren. Hier einige Beispiele (der Phantasie sind kaum Grenzen gesetzt):

  • c4/foo – ändert ab der aktuellen Position bis zum vierten vorkommen von “foo”.
  • y3) – kopiert von der aktuellen Position bis zum Ende des übernächsten Satzes.
  • dt, – löscht von der aktuellen Position bis zum nächsten Komma.
  • zf’a – erzeugt eine Faltung bis zur mit a markierten Zeile.
  • gUw – ändert alle Buchstaben bis zum Wortende in Großbuchstaben um.
  • >]] – rückt die Zeilen bis zum Ende des Blocks (also bis zum }) ein.
  • !}sort – Sortiert alle Zeilen bis zum Ende des Absatzes. (Hier wird das Linux-Kommando sort benutzt)

Spezielle Bewegungskommandos

Darüber hinaus gibt es noch spezielle Bewegungskommandos, die nur im Zusammenhang mit anderen Funktionen genutzt werden können:

  • i) zum Bearbeiten des Inhalts einer Klammer so löscht di) den Inhalt einer Klammer, während ci) ihn ändert. Dies Funktioniert mit allen Klammertypen, also auch mit (,{,},[,],< und >.
  • a) beabeitet einen kompletten Klammerausdruck. Also wie i), nur dass die Klammern mit hinzugezogen werden.
  • is und as sind die gleichen Funktionen wie i) und a) nur für Sätze sowie ip und ap für Absätze.
  • i” und a” und i’ und a’ sowie i` und a` sind für Strings bzw. Wörter und Sätze in den entsprechenden Anführungszeichen gedacht.

Auch hier ein Paar Beispiele (die innerhalb der entsprechenden “Blöcke” ausgeführt werden müssen):

  • gui” – ändert alle Buchstaben innerhalb der Anführungszeichen in Kleinbuchstaben um
  • da< – löscht (z.B.) ein HTML Tag
  • yip – kopiert den aktuellen Absatz (ohne Leerzeile dahinter)
  • das – löscht den aktuellen Satz (mit Leerzeichen dahinter)

Im Gegensatz zu den normalen Bewegungskommandos wie w ist es hier egal, wo im “Block” der Cursor steht.

Mit dem Wissen um diese mächtigen Operationen und Kombinationsmöglichkeiten wird das Editieren von Texten noch viel effizienter. Es gibt noch viele weitere Bewegungskommandos für spezielle Einsatzzwecke (z.B. Programmieren) oder zum genaueres navigieren (z.B. erstes/letztes Zeichen eines Satzes). Mehr zu diesem Thema gibt es in der Hilfe von vim, die man mittels :h navigation aufrufen kann.

Iridium Flares – künstliche Leuchterscheinungen am Himmel

28. April 2009 von

Iridium Flares sind Reflektionen der Sonne an Iridium Satelliten. Diese Leuchterscheinungen sind einige Sekunden lang zu sehen und können bis zu -9 mag hell werden. Somit können sie bis zu 1000 mal heller als der hellste Stern am Himmel (Sirius) werden und sogar Schatten werfen.

Iridium-Satelliten sind Teil eines Kommunikationsnetzwerks. Im Februar diesen Jahres ist einer der Satelliten mit einem russischen Satelliten kollidiert, was wohl der erste Zusammenstoß zweier Satelliten im Weltall war.

Bei einem Iridium Flare wird das Sonnenlicht an den Antennen Reflektiert, die ca. 188×86 cm groß sind. Dies erzeugt einen über 100 km breiten Lichtstreifen, der mit fast 30.000 km/h über die Erde rast. Diesen kann man von der Erde als sich bewegenden Lichtpunkt beobachten, der langsam heller wird und – nachdem er sein Maximum erreicht hat – wieder dunkler wird.

Die Bahndaten und somit auch die Iridium Flares lassen sich sehr genau berechnen. Auf Heavens Above (englisch) oder CalSky kann man sich die nächsten Iridium Flares mit Zeitpunkt, Himmelsrichtung und scheinbarer Helligkeit für seinen Standort ausrechnen lassen. Im Schnitt kann man pro Nacht 3 recht helle Flares sehen und einmal die Woche sogar einen, der auch bei Tageslicht zu sehen ist.

Wenn man einen Iridium Flare beochachten möchte sollte man sich überlegen, in welche Richtung man in etwa schauen muss und dann ca. 2 Minuten vorher vor die Türe gehen und in die entsprechende Richtung schauen. Wenn der Flare nicht zum erwarteten Zeitpunkt kommt sollte man ruhig noch eine Minute länger warten. Ich empfehle für die ersten Beobachtungen Flares mit mindestens -3 mag, so dass sie sich deutlich von den Sternen absetzen.

Nicht vergessen auf das Wetter zu achten, da bei einem wolkenbedecktem Himmel natürlich nichts zu sehen ist. Wer zu faul ist aus dem Fenster zu schaun, dem kann ich Sat24 wärmstens empfehlen. Dort gibt es ziemlich aktuelle Satelitenbilder, die alle 15 Minuten aktualisiert werden. Auch ein Infrarot-Modus kann aktiviert werden, der praktisch ist, wenn es schon dunkel ist.

Einige Tipps und Tricks für Screen – Teil 2

26. April 2009 von

Nachdem Ploppor eine Einführung in Screen gegeben hat, habe ich diese um ein paar prakische Tipps erweitert. Hier jetzt noch einige weitere Tipps.
Die Konfigurationsdatei .screenrc, die hier häufig verwendet wird liegt normalerweise im Home-Verzeichnis eines Users. Wenn sie noch nicht existiert, kann man sie einfach anlegen.



Visual Bell abschalten
Wer ein wenig mit Screen gearbeitet hat, dem ist aufgefallen, dass hin und wieder der ganze Bildschirm neu gezeichnet wird, was sich durch ein kurzes Flackern äußert. Dies ist die Visual Bell (quasi als Ersatz für einen Piepton). Da diese häufig stört kann man mit der Tastenkombination Strg+a Strg+g zwischen visuell und audio hin und her schalten. Um sie dauerhaft abzuschalten kann man folgende Zeile in die ~/.screenrc schreiben:

vbell off



Statusleiste von Screen einrichten
Ohne die Statusleiste macht die Arbeit mit Screen keinen Spass. Darum sollte man sie auf jeden Fall einrichten.
In der ~/.screenrc werden 3 Zeilen angelegt. Die ersten beiden sind immer nötig und schalten die Hardline des Terminals ein und geben an, dass sie in der untersten Zeile stehen soll:

hardstatus on
hardstatus alwayslastline

Die Letzte Zeile bestimmt, die Farben und was alles wo zu sehen sein soll. Hier einige Beispiele, die man sich einfach mal anschauen kann. Das Einrichten einer eigenen Statusleiste ist relativ umständlich. Mehr Infos dazu gibt es in der Manpage. (Jeweils immer nur eine Zeile ausprobieren):

hardstatus string "%{=b}%-w%{=bru}%n %t%{-}%+w"

Die Fenster werden nebeneinander in den eingestellten Systemfarben dargestellt. das aktive Fenster ist invertiert.

hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %d.%m.%y %c:%s "

Blaue Leiste, das aktuelle Fenster ist rot hinterlegt. Rechts steht der Name des Computers sowie Datum und Uhrzeit.

hardstatus string "%{rw} * | %H * $LOGNAME | %{bw}%c %D | %{-}%-Lw%{rw}%50>%{rW}%n%f* %t %{-}%+Lw%<"

Graue Leiste, links steht das Hostname und Username sowie die Uhrzeit und der Wochentag. Danach kommen die Fenster wobei das aktive weis hinterlegt ist.



Was tun bei Screen in Screen?
Wenn man überall Screen benutzt, bekommt man oft das Problem, dass man plötzlich Screen in einem Fenster aufruft, in dem Screen schon läuft. Dies ist mir häufig bei ssh passiert. Man hat Screen geöffnet und loggt sich auf einem entfernten Rechner ein, auf dem man Screen startet (oder attached). Wenn man jetzt Screen-Befehle eingibt, wirken sie nur auf das äußere Screen. Für solche Fälle ist das Escape-Kommando Strg+a a gedacht. Dies leitet Strg+a an das innere Screenfenster weiter. So kann man z.B. mit Strg+a a d das innere Screenfenster detachen.



Shortcuts zum Wechseln der Fenster
Statt Strg+a p und Strg+a n zu drücken um ins vorherige bzw. nächste Fenster zu gelangen, kann man sich auch Shortcuts definieren. Schreibt man die folgenden 2 Zeilen in die ~/.screenrc, so kann man mit F7 und F8 je ein Fenster zurück bzw. vorwärts wechseln:

bindkey -k k7 prev
bindkey -k k8 next



Ein Kommando aus Screen heraus in einem neuen Fenster öffnen
Manchmal ist es Praktisch, wenn man einen Befehl direkt in einem neuen Screenfenster starten kann statt erst ein neues Fenster anzulegen und dort den Befehl einzugeben.Dies kann man mit dem Befehl

screen -X screen <befehl>

erreichen. Um das ganze abzukürzen kann man sich einen Alias definieren. Dazu schreibt man folgende Zeile in die ~/.bashrc

alias s='screen -X screen';

Im der nächsten geöffneten Konsole (oder nachdem man die ~/.bashrc mittels source ~/.bashrc neu geladen hat) kann man nun z.B. mittels

s top

top in einem neuen Screenfenster starten. Wenn das Programm geschlossen wird, schließt sich automatisch auch das geöffnete Screenfenster.

Firefox Plugin – Vimperator gibt Firefox die Mächtigkeit von vim

24. April 2009 von

Wie ich neulich in einem Artikel von Devbrain auf Vidar’s Blog gelesen habe ist die Version 2.0 von Vimperator erschienen. Dies schien mir eine günstige Gelegenheit das Teil noch einmal selbst auszuprobieren. Zuletzt hatte ich vor ca. 1 Jahr die Version 1.2 am laufen. Hatte sie jedoch irgendwann wieder verworfen weil ich die Features nicht wirklich nutzte.

Vimperator verwandelt den Firefox in einen Browser, den man komplett über die Tastatur steuern kann. Und zwar ziemlich genauso wie vim. Also wer vim liebt wird bestimmt auch Vimperator mögen.



Navigation auf Seiten

Mit j und k kann man auf einer Seite Scrollen (sowie mit gg und G zum Anfang und Ende springen), mit gt und gT die Tabs wechseln und mit /, ? und n suchen. Alles wie in vim.



Seiten Öffnen und Suchen

Mit o kommt man in den Kommandozeilenmodus, in dem sich automatisch der Befehl :o pen auftut und man kann eine Adresse eingeben. Aber nicht nur das, man kann wie in der Awesomebar einfach ein paar Zeichen eingeben. Mit Tab werden dann die Lesezeichen, die Chronik und sogar das Homeverzeichnis durchsucht (und man kann ähnlich wie in der Konsole mittles Tabcompletion durch seine Verzeichnise Browsen). Bei mehreren Ergebnissen drückt man einfach so oft Tab bis das gewünschte Ergebnis markiert ist und wählt es mit Enter aus. t macht das gleiche zum Öffnen in einem neuen Tab.



Umgang mit Tabs

Es gibt aber noch mehr Funktionen zum Umgang mit Tabs. Mit b wird das Kommando :buffer! im Kommandozeilenmodus vorgeladen und man kann nun einen Teil des Titels oder der URL eines Tabs eingeben. Mit Enter wird direkt zum nächsten passenden Tab gesprungen (und mit gb wieder zum nächsten passenden). Drückt man statt Enter die Tab-Taste, so bekommt man eine Auswahl aller passenden Tabs angezeigt. B Zeigt alle Tabs an. Mit g0 und g$ kommt man zum ersten bzw. letzten Tab. d schließt ein Tab (mit D kommt man danach ins den Tab links davon sonst rechts) und u stellt ein Tab wieder her.



Umgang mit Links

Aber wie klickt man auf Links ohne Maus? Indem man f drückt wird neben jedem Link eine Zahl angezeigt. Nun gibt man die Zahl des Links ein, der geöffnet werden soll (falls die Zahl nicht eindeutig ist wie z.B. 1 bei mehr als 10 Links, muss man die Auswahl noch mit Enter bestätigen). Mit F gehts genauso, nur dass man den Link dann in einem neuen Tab öffnet. Mit ; gibt es noch mehr Möglichkeiten wie Linkadresse kopieren oder Quelltext anzeigen. Dazu schaut man am besten mal in die Hilfe mit :h hints.



Textboxen editieren

Eine sehr schöne Option finde ich den externen Editor. So kann man sich – wie bei It’sAllText! – einen externen Editor (Standard ist natürlich gvim) öffnen um in Textboxen zu schreiben. So wird It’sAllText! nicht weiter benötigt. Dazu geht man mit dem f Kommando (oder der Maus) in die Textbox und drückt Strg+i. Anders als bei It’sAllText! muss gvim aber beendet werden, damit das Ergebnis in die Textbox übernommen wird.



Funktionen wie in vim

Auch Markierungen, Mappings und Makros funktionieren identisch wie bei vim.
Es werden autocommands unterstützt um z.B. für bestimmte Webseiten automatisch Aktionen auszuführen.



Tasten an Firefox durchreichen

Mit Strg+v wird der nächste Tastendruck nicht interpretiert sondern an Firefox weitergegeben. Strg+z startet den Pass-Trough Modus, bei dem alle Zeichen an FF weiter gereicht werden. Dieser wird – wie sollte es auch anders sein – mit ESC beendet. Dies ist ganz praktisch um in Brief oder GMail die Tasten j und k verwenden zu können.



Konfiguration

Wie bei vim gibt es verschiedene Optionen, die man mit :set
ändern kann. Dazu am besten in die Hilfe mittels :h options schauen.
Es kann natürlich auch eine Konfigurationsdatei erstellt werden, die die gleiche Syntax hat wie die .vimrc. Einfach die Datei ~/.vimperatorrc anlegen.
Meine sieht im Moment so aus:

"Highlight für die Suche anschalten
set hlsearch
"Highlighting mit # für die letzte Suche ausschalten
map # :noh
 
"Zege die Lesezeichen- und Adressleiste an
set guioptions=BT
 
"Maps für vorheriges und nächstes Tab
"auf Pfeiltasten und Strg+h bzw. Strg+l legen
map <Right> gt
map <Left> gT
map <C-l> gt
map <C-h> gT
 
"Aktuelles Tab mit Shift+Pfeiltasten oder
"Strg+Shift+l bzw. Strg+Shift+h bewegen
map <S-Right> :tabmove! +1<CR>
map <S-Left>  :tabmove! -1<CR>
map <C-L>     :tabmove! +1<CR>
map <C-H>     :tabmove! -1<CR>
 
"Mit s zwischen den letzten beiden Tabs hin und her schalten
map s <C-6>
 
"autocommand um Pass-Through für Brief automatisch zu aktivieren
autocmd LocationChange .* js modes.passAllKeys = /brief\.xul/.test(buffer.URL)



Nachteile

Wenn Vimperator installiert ist, hat man plötzlich nur noch die Tableiste und unten die Statusleiste sowie eine Kommandoleiste von vimperator. Dies ist sehr gewöhnungsbedürftig, weswegen man sich mittels

:set guioptions=mBT

die anderen Leisten anzeigen lassen kann.

Ein großer Nachteil von Vimperator ist, dass er nicht zusammen mit Tab Mix Plus Funktioniert. Es wird nur noch eine Zeile der Tabs angezeigt und man kann die Tabs nicht mehr anklicken. Daher habe ich mich nach einer Alternative für Tab Mix Plus umgesehen und Tab Kit gefunden. Dieses Plugin beinhaltet die wichtigsten Funktionen, die man aus TMP kennt. Jedoch funktioniert es bei mir nicht immer, dass neue Tabs neben dem aktuellen Tab geladen werden was mich tierisch nervt. Daher habe ich zusätzlich noch das Add-On Tab Control installiert und bin nun recht zufrieden. (Für das Session Management habe ich das Plugin Session Manager ausprobiert. Im Moment ist es jedoch wieder deaktiviert weil ich glaube, dass das auch so recht gut funtkioniert. Einfach den Firefox mittels ZZ schließen.) Da TMP als Ressourcenfresser gilt könnte es sogar sein, dass man durch dessen Ersetzung sogar noch einen Vorteil daraus zieht (zumindest sollte der Ressourcenverbrauch der 2-3 Plugins nicht wesentlich höher sein als von TMP).
Einige Kleinigkeiten waren bei TMP zwar schöner, aber das ist vielleicht auch nur Gewöhnung.



Natürlich bietet Vimperator noch viele weitere Funktionen und Optionen z.B. um das Aussehen von Seiten und Vimperator selbst zu verändern oder JavaScript Code auszuführen. Am besten selbst mal in die Hilfe mit :h schauen.
Vimperator hat zwar einige Nachteile, doch die Vorteile überwiegen zumindest für vim-Nutzer in meinen Augen um ein Vielfaches.

Die Entwickler von Vimperator haben auch gleich ein Plugin für Thunderbird namens “Muttator” geschrieben, was leider nur auf Betaversion Thunderbird 3.0bpre3 läuft und auch dessen Bedienung an vim angleicht. Auch in Arbeit ist Xumulus, was die Vorteile von Vim zu Songbird bringen soll.

Die Offizielle Seite der 3 Plugins ist http://vimperator.org

Faltungen mit vim – Textstellen zusammen klappen

21. April 2009 von

vim unterstützt wie jeder moderne Editor Faltungen (folding), womit sich z.B. Funktionen eines Programms oder Sections eines LaTeX-Dokuments auf eine Zeile reduzieren lassen. Dies kann die Übersichtlichkeit einer großen Textdatei drastisch erhöhen, da nur die Stellen des Textes angezeigt werden, die man im Moment benötigt.

Es gibt 6 verschiedene Methoden um Faltungen anzulegen:

  • Manuell (manual) – Hier kann man die Bereich die gefaltet werden sollen frei definieren.
  • Einrückung (indent) – Es wird entsprechend den Einrückungen (z.B. in Quelltexten) gefaltet.
  • Ausdruck (expr) – Ein Ausdruck definiert die Faltungen.
  • Syntax (syntax) – Die Faltungen werden über das Syntaxhighlighting definiert. Somit wird für jeden Dateityp ein angemessenes Folding erreicht.
  • Unterschiede (diff) – Faltet im diff-Modus von vim die Teile der beiden Texte, die gleich sind so dass nur die Änderungen zu sehen sind. (Diese Methode ist nur im diff-Modus verfügbar)
  • Markierungen (marker) – Hier werden die Faltungen durch bestimmte Markierungen im Text erreicht.

Die Methode ist standardmäßig auf manual eingestellt und man kann sie über die Option foldmethod ändern. So wird z.B. mittels

:set foldmethod=marker

die Methode auf Markierungen umgestellt.

Grundsätzlich werden Faltungen mit zo geöffnet und mit zc geschlossen (mit zO und zC rekursiv auch die inneren). Mit za wird zwischen offen und zu gewechselt (zA wechselt rekursiv). Im Manuell- und Markierungsmodus werden neue Faltungen mittels zf<Bewegung> angelegt oder indem man einen Bereich im visuellen Modus markiert und zf drückt.
Beispiele:

  • zf10G – erstellt eine Faltung bis inklusive Zeile 10
  • zf10j – erstellt eine Faltung von der aktuellen Zeile bis inklusive 10 Zeilen tiefer
  • zf% - auf einer Klammer erstellt eine Faltung bis zur korrespondierenden Klammer
  • zf} - erstellt eine Faltung bis zur nächsten Leerzeile

Im Markierungsmodus ist die Markierung für beginnende Faltungen standardmäßig

/*{{{*/

und für endende Markierungen

/*}}}/*

Dies kann mit der Option foldmarker gesetzt werden die Standardmäßig auf

{{{,}}}

gesetzt ist.
Um auch in Bash oder LaTeX die Markierungen auszukommentieren kann man die Option commentstring ändern, wobei die Markierung durch %s gekennzeichnet wird. Standardmäßig ist die Option also:

/*%s*/

Mittels zd wird im Manuell- und Markieren-Modus eine Faltung (inklusive Markierung) gelöscht (zD löscht rekursiv).

In der Expression-Methode wird automatisch erstmal genau wie in der Einrückungsmethode gefaltet. Um das Verhalten zu ändern, muss die Option foldexpr gesetzt werden. Mit

:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1

werden alle Abschnitte, die durch eine Leerzeile getrennt sind gefaltet. Mehr Infos zu dieser Methode gibt es in der Hilfe von vim mittels :h fold-expr.

Weitere praktische Kommandos für alle Methoden:

  • zv öffnet so viele Faltungen bis man die Zeile sehen kann in der sich der Cursor gerade befindet. Dies ist praktisch, wenn man zu einer bestimmten Zeile springen möchte die in mehreren Faltungen liegt.
  • zi schaltet die Faltungen aus und wieder ein. Dies kann ganz praktisch sein, wenn man den Text kurz ohne Faltungen sehen möchte. Danach sind sie genau wie vorher.
  • zj und zk dienen zum Bewegen zur nächsten bzw. vorherigen Faltung
  • zM schließt alle Faltungen (Das Faltungslevel wird auf 0 gesetzt, zm dekrementiert es nur), während zR alle Faltungen öffnet (Level wird auf Maximum gesetzt während zr es inkrementiert)

Wenn man die Option foldcolumn auf eine Zahl größer 0 setzt, erscheint auf der linken Seite ein Baum, der die Faltungstiefe anzeigt. foldcolumn gibt dabei die breite des Baumes (also die tiefe der Faltungen die durch den Baum angezeigt werden) an.

Auf die Zeile von geschlossenen Faltungen können Operationen wie dd oder yy angewendet werden, die auf die ganze Faltung wirken. Gleiches gilt für Reguläre Ausdrücke. Ist die Zeile im Visual-Modus markiert, so ist auch der gesammte Inhalt der Faltung markiert. In gvim kann man damit auch die Faltungen öffnen und schließen indem man auf die entsprechenden + bzw. – Symbole klickt.

Weitere Informationen gibt es in der Hilfe von vim, die über :h folding aufgerufen werden kann.

In der Konsole suchen mit ls, grep, find und locate

19. April 2009 von

Da ich ein Fan der Linux-Konsole bin, möchte ich einmal das Thema Suche ansprechen.
Es gibt eine ganze Menge Möglichkeiten, wie man Dateien suchen kann.

Der Tracker ist eine praktische Suche, keine Frage. Aber in manchen Fällen können Shell-Kommandos auch recht hilfreich sein. So kann man mit ihnen z.B. nicht-indizierte Wechselmedien durchsuchen oder Dateien mit bestimmten Eigenschaften finden.
Die vorgestellten Kommandos, die ohne Indexierung funktionieren sollten nicht unüberlegt im Wurzelverzeichnis oder in anderen Verzeichnissen mit sehr vielen Datien und Ordnern genutzt werden, da sie teilweise sehr lange brauchen und viel Last erzeugen können.

Suchkommandos ohne Indexierung

ls und grep

Das Kommando ls ist wohl bekannt, daher hier nur ein paar interessante Optionen, die vielleicht nicht so häufig genutzt werden:

  • -R Listet rekursiv auch die Dateien der Unterverzeichnisse mit auf
  • -X Sortiert die Dateien nach ihrem Dateityp (also z.B. erst css, dann alle html-Dateien und danach erst die png-Dateien)
  • -S Sortiert die Dateien nach ihrer Dateigröße
  • -t Sortiert die Dateien nach ihrer letzen Änderung
  • -lh Zeigt die Dateigrößen in einem lesbaren Format an.

Zusammen mit dem grep Kommando kann man nun schon recht gut einzelne Verzeichnisse und (mit der -R Option von ls) deren Unterverzeichnisse durchsuchen.
So listet ein

ls -R | grep png$

alle PNG-Dateien auf. Um genauer zu sein: alle Dateien, die mit png enden also auch eine Datei wie z.B. test.apng
Das Dollar-Zeichen zeigt an, dass der Dateiname dort aufhören soll. Das ^ hingegen zeigt an, dass der Dateiname so beginnen soll: ^test meint alle Dateien die mit “test” beginnen. Der Punkt steht für ein beliebiges Zeichen, der Asterisk (Stern *) für beliebig viele Wiederholungen des letzten Zeichens. Doch dies soll keine Einführung in reguläre Ausdrücke werden. Diese sind in der Wikipedia recht gut beschrieben. (Vielleicht schreib ich auch irgendwann mal was darüber)
Ohne $ werden Dateien angezeigt, die die Zeichenkette “png” im Dateinamen beinhalten.

Praktische Optionen für grep sind

  • -i schaltet die Unterscheidung zwischen Groß- und Kleinschreibung aus
  • -E lässt reguläre Ausdrücke nach POSIX standard zu. Statt dessen kann auch egrep benutzt werden.
  • -r durchsucht auch die Unterverzeichnisse rekursiv. Statt dessen kann auch rgrep benutzt werden.

Mit grep kann man aber auch Dateien nach ihrem Inhalt (durch-) suchen:

grep hallo *

Listet alle Dateien im aktuellen Verzeichnis auf, in denen die Zeichenkette “hallo” vorkommt und gibt die entsprechenden Zeilen aus.

grep -r hallo *

macht das gleiche rekursiv auch für alle Unterverzeichnisse. Auch hier kann die gesuchte Zeichenkette (in diesem Beispiel “hallo”) durch einen regulären Ausdruck beschrieben werden. Der Asterisk gibt an, dass in allen Dateien gesucht werden soll. Hier kann man praktische Einschränkungen machen, wenn z.B. nur in C-Quelltexten gesucht werden soll:

grep hallo *.c

Bei der Angabe der Datei gelten keine regulären Ausdrücke sondern die Regeln der Bash. Wie bei

rm *.c

*.c entspricht nebenbei bemerkt einer Liste aller Dateinamen, die mit .c enden und durch Leerzeichen getrennt sind.

find

Ein weiteres sehr mächtiges Werkzeug, dass ohne Indexierung auskommt ist find.
Mit find kann man z.B. zuletzt geänderte oder geöffnete Dateien suchen:

find -amin -15

listet alle Dateien im aktuellen Ordner und allen Unterordnern auf, die vor 15 Minuten oder kürzer geöffnet wurden. -15 bedeutet “kürzer als”, +10 bedeutet “länger als”.

find -mmin -20

hingegen listet alle Dateien auf, vor weniger als 20 Minuten geändert wurden.
Statt eine Zahl in Minuten anzugeben, kann man auch eine Datei angeben, deren Änderungszeitpunkt als Grenze genommen wird:

find -newer datei.txt

listet alle Dateien auf, deren Änderung neuer sind als die der Datei datei.txt
Statt amin und mmin kann man auch atime und mtime benutzen, um die Zeit in Tagen angeben zu können. Ein Tag ist dann als 24 Stunden definiert. Das bedeutet

find -mtime -2

findet Dateien die jünger als 48 Stunden sind.
Merkhilfe: atime = access time, mtime = modify time, amin = access (time in) minutes, mmin = modify (time in) minutes

Man kann auch große Dateien finden, die viel Speicher belegen:

find -size +1G

sucht alle Dateien, die Größer als 1 Gigabyte sind. Statt G für Gigabyte kann auch M für Megabyte oder k für Kilobyte verwendet werden.
So sucht

find -size -1k

alle Dateien kleiner 1 Kilobyte.

Praktisch ist auch die Suche nach leeren Dateien mittels

find -empty

Schließlich kann man mit find auch nach Dateinamen suchen mittels:

find -name "*.png"

bzw. wenn Groß- und Kleinschreibung ignoriert werden soll:

find -iname "*.png"

Die Anführungszeichen werden benötigt, damit nicht eine Liste der png-Dateien an find übergeben wird sondern genau diese Zeichenkette.
Die maximale Tiefe, die find in Unterverzeichnisse vordringen soll kann mittels -maxdepth begrenzt werden. So sucht

find -maxdepth 1 -emtpy

nach Dateien im aktuellen Verzeichnis und allen Verzeichnissen darin. Jedoch nicht in Verzeichnissen, die in Unterverzeichnissen des aktuellen Ordners liegen.

Auch der Typ einer Datei kann bestimm werden. Um Verzeichnisse von den Suchergebnissen auszuschließen und nur Dateien zu suchen nutzt man die Option -type f. Beispiel:

find -name "test*" -type f

Weitere Typen sind d für Verzeichnisse und l für symbolische Links

Man kann die gefundenen Dateien auch direkt Aktionen unterziehen.
So löscht man mittels -delete die gefundenen Dateien.

find -emtpy -delete

löscht alle leeren Dateien
Es können auch Befehle auf die gefundenen Dateien angewendet werden. So kann man dies auch gut mit grep verbinden um die gefundenen Dateien direkt zu durchsuchen:

find -name "*.txt" -exec grep -Hn hallo "{}" \;

durchsucht alle gefundenen Textdateien nach dem String “hallo”. Die Optionen -H und -n (kurz -Hn) bringen grep dazu die Dateinamen und Zeilennummern auszugeben, wie es bei einem normalen grep hallo * passiert (also wenn grep mehrere Dateien durchsuchen soll). Bei der Verwendung mit find muss dies explizit angegeben werden da sonst nur die gefundenen Zeilen ausgegeben werden. Das liegt daran, dass grep für jede Datei einzeln aufgerufen wird.

Suchbefehle mit Index

In der Konsole gibt es auch Suchkommandos, die einen Index besitzen.
whereis
So kann man mit dem Kommando whereis nach Binarys und Manualpages suchen. Recht praktisch, wenn man wissen möchte, wo ein bestimmtes Programm liegt um z.B. darauf zu verlinken.
Beispiel:

whereis gvim

Sucht die Ausführbare Datei von gvim

locate
Mit locate lassen sich durch den verwendeten Index Dateien nach Dateinamen wesentlich schneller suchen als mit den bisher beschrieben Methoden. Dafür aber nur bereits indexierte Dateien, also keine Wechselspeichermedien oder gerade erstellte Dateien. So finde man mit

locate *.tex

alle LaTeX Dateien im gesammten System. (Auch hier kann man die Option -i verwenden um Groß- und Kleinschreibung zu ignorieren.)
Bei Ubuntu wird die Datenbank täglich aktualisiert. Um sie manuell zu updaten kann man den folgenden Befehl benutzen:

sudo updatedb

Auch locate kann man mit grep verbinden um die gefundenen Dateien zu durchsuchen:

locate *.tex | xargs grep hallo

durchucht alle LaTeX (.tex) Dateien im System nach dem String “hallo”.

tracker
Natürlich kann man auch unter der Konsole den Tracker nutzen. Dafür installiert man unter Ubuntu die Tracker-Utils mittels

apt-get install tracker-utils

und kann dann wie gewohnt mit dem Tracker über den Befehl tracker-search suchen:

tracker-search hallo welt

sucht nach Dateien, die die Wörter “hallo” und “welt” beinhalten.
Wenn man den Tracker öfters benutzt, empfiehlt es sich dafür einen alias zu legen. Man kann z.B. in der Datei ~/.bashrc folgende Zeile anhängen:

alias ts=tracker-search

Dann kann man (in einem neuen Konsolenfenster, damit die ~/.bashrc ausgeführt wird) mit

ts hallo

nach “hallo” suchen

Der wesentliche Unterschied zwischen Tracker und locate ist, dass locate nur nach Dateinamen sucht während Tracker auch den Inhalt der Datei durchsucht. Locate arbeitet Systemweit und Tracker normalerweise nur in ausgewählten Verzeichnissen (die in der Konfigurationsdatei ~/.Tracker/tracker.cfg angegeben werden).

Weitere Informationen zu allen Kommandos findet man in den man-Pages (die Manualseiten) indem man z.B. für find

man find

eingibt. Auch das Ubuntuusers-Wiki enthält zu den hier verwendeten Kommandos entsprechende Artikel.


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