bash - Tipps & Tricks
Das letzte Argument der Kommandozeile
Häufig braucht man das Argument aus der letzten Kommandozeile in der nächsten Kommandozeile wieder. Ein Beispiel:
konsolero@nitidelo ~ $ cp /etc/profile newFile
konsolero@nitidelo ~ $ more newFile
Hier wird der Inhalt der Datei /etc/profile in die Neue Datei newFile kopiert und dann mit more angezeigt. Nun muss aber newFile in der zweiten Zeile nicht von Hand eingegeben werden. Sie drücken einfach einmal Esc und dann . oder geben !$ ein und schon steht das letzte Argument der letzten Zeile (hier also newFile) in der Zeile. Bei längeren Argumenten spart man sich auf diese Weise viel Arbeit.
Suchen in der History
Manchmal hat man eine längere Kommandozeile eingegeben (vielleicht vor einigen Tagen) und möchte diese Zeile nochmals ausführen. Wenn diese Zeile noch in der History der Bash gespeichert ist muss man sie also nur suchen. Wenn man dazu aber die Pfeiltasten benutzt (damit kann man ja ältere Kommandozeilen wieder hervorzaubern), dauert dieser Vorgang häufig ziemlich lange. Damit hat man aber nichts gewonnen, und man könnte die Zeile gleich neu eingeben. Es gibt aber eine Lösung:
Wenn man die Tasten Strg-R drückt, kann man in der History suchen. Die Bash sucht einfach nach dem ersten befehl, in dem die eingegebenen Buchstaben vorkommen. Wenn Strg-R nochmals gedrückt wird, wird die nächste Fundstelle angezeigt.
Textdateien zeilenweise sortieren
Mit dem sort Befehl lassen sich die Zeilen einer Textdatei sortiert ausgeben:
konsolero@nitidelo ~ $ sort myfile.txt
oder speichern:
konsolero@nitidelo ~ $ sort myfile.txt -o myfile.txt
Systeminfos
konsolero@nitidelo ~ $ uname -a
Linux debian 2.6.3 #7 Mon Mar 1 18:25:58 CET 2004 i686 unknown
Der Befehl »uname -a« liefert Kernelname (Linux), Hostname (debian), Kernelversion (2.6.3), Erstellungsdatum des Kernels, Hardwarearchitektur (i686), und den Prozessornamen (unknown).
Arbeitsspeicher: cat /proc/meminfo
Prozessor: cat /proc/cpuinfo
PCI-Bus: lspci
Dateisysteme: mount
Freier Festplattenspeicher: df -h
Konsole (KDE)
Sitzung umbenennen: Strg-Alt-S
ImageMagick
ImageMagick ist eine Sammlung von Programmen zum Bearbeiten von Bildern:
Ein Bild lässt sich z.B. mit »display image.png« anzeigen. Ein Überblicksbild von allen jpg Bildern im aktuellen Verzeichnis erzeugt dieser Befehl:
konsolero@nitidelo ~ $ display "vid:*.jpg"
Bilder nacheinander anzeigen (Space-Taste/Vor, Backspace/Zurück):
konsolero@nitidelo ~ $ display *.jpg
Identify liefert Bild-Infos:
konsolero@nitidelo ~ $ Identify mozilla.png
mozilla.png PNG 100x100 DirectClass 8-bit 18173b 0.0u 0:01
Bildgröße ändern (convert):
konsolero@nitidelo ~ $ convert -geometry 300x200 image.png out.png
Mit mogrify ändert man Bilder direkt ohne neue Dateien zu erzeugen:
konsolero@nitidelo ~ $ mogrify -geometry 300x200 image.png
Screenshot (import):
konsolero@nitidelo ~ $ sleep 10; import -window root bildschirmfoto.png
Fensterfoto (Mit Kreuz ins Fenster klicken oder Bereich auswählen):
konsolero@nitidelo ~ $ import fensterfoto.png
Bilder zusammenfassen (montage):
konsolero@nitidelo ~ $ montage -background white -tile 2x2 -geometry +4+4 joe.jpg jack.jpg william.jpg avarell.jpg daltons.jpg
Text einfügen (convert):
konsolero@nitidelo ~ $ convert -font helvetica -fill white -pointsize 24 -draw 'text 10,50 "Wanted Dead or Alive"' daltons.jpg warrant.jpg
Prozessbaum ausgeben
konsolero@nitidelo ~ $ pstree -puG
update-rc.d (Debian)
Aktivieren/Deaktivieren eines Daemons:
»update-rc.d apache defaults« bzw. »update-rc.d -f apache remove«
lsof (list open files)
Mit der Option -i zeigt lsof alle Internetverbindungen an (Kommando als root ausführen).
source
Mit dem Kommando »source .bashrc« lassen sich Änderungen in der bash-Konfigurationsdatei in die aktuelle Shell einlesen.
Zeichenkette in Dateien suchen
konsolero@nitidelo ~ $ grep -rsniH string *
r: Rekursiv (auch Unterverzeichnisse durchsuchen)
s: Keine Fehlermeldungen wenn die Datei ein Verzeichnis ist
n: Zeilennummern anzeigen
i: Groß- und Kleinschreibung ignorieren
H: Dateiname anzeigen
Beim Öffnen der Datei kann man mit »vi +Zeilennummer« direkt zum gefundenen Begriff springen.
Shell ohne Scrollbalken
Shift+PageUp (Bild auf) bzw. Shift+PageDown (Bild runter)
Patch mit Diff erstellen
konsolero@nitidelo ~ $ diff -u AltesFile NeuesFile >> patch.txt
konsolero@nitidelo ~ $ patch < patch.txt
Partitionen auflisten
konsolero@nitidelo ~ $ fdisk -l /dev/hda
Leerzeichen in Dateinamen ersetzen
Das Perl-Tool rename ersetzt durch diesen regulären Ausdruck beliebig viele Leerzeichen durch einen Unterstrich:
konsolero@nitidelo ~ $ rename 's/\s+/_/g' *
Inhalt einer Datei löschen
konsolero@nitidelo ~ $ cat /dev/null > datei.log
Kurzform:
konsolero@nitidelo ~ $ > datei.log
Addieren von Zahlen in Textspalten
Dieses awk Script addiert Zahlen die ihm als Argumente übergeben werden:
#!/usr/bin/awk -f
{ total = total + $1 } END { print total }
Abgespeichert als summe.awk lassen sich im Zusammenspiel mit dem cut Kommando Zahlenspalten addieren.
Beispieldatei stunden.txt:
Fre 25 Feb 2005 - 4 Stdn
Mon 28 Feb 2005 - 2 Stdn
Die 01 Mär 2005 - 3 Stdn
So liefert dieser Einzeiler ...
konsolero@nitidelo ~ $ cut -d " " -f6 stunden.txt | summe.awk
... das Ergebnis 9.
Stunden im Februar:
konsolero@nitidelo ~ $ grep "Feb" stunden.txt | cut -d " " -f6 | summe.awk
Rechnen
konsolero@nitidelo ~ $ bc -l
Datei/Verzeichnisgröße
Erzeugt eine Gesamtsumme. Ausgabe der Größen in menschenlesbarem Format.
(z.B.: 1K 234M 2G):
konsolero@nitidelo ~ $ du -sch dich
Nach Größe sortiert:
konsolero@nitidelo ~ $ du -sh dich | sort -nr
Suchen
konsolero@nitidelo ~ $ find dokumente -iname "joglog*"
Lässt man den Verzeichnisnamen weg wird im aktuellen Verzeichnis gesucht.
Zeilen und Spalten filtern
lsmbox listet die Anzahl der Nachrichten in einer Mail-Inbox auf. Die Tools grep, tr und cut helfen beim Verarbeiten der mehrzeiligen Ausgabe:
konsolero@nitidelo ~ $ lsmbox ~/mail/inbox | grep ^Summary | tr -s [:blank:] " " | cut -d " " -f2,3,4
grep filtert die Zeile an deren Anfang »Summary« steht. tr tauscht mehrere Leerzeichen oder Tabs hintereinander durch ein einfaches Leerzeichen aus um cut ein filtern der Spalten ( 2,3 und 4) zu ermöglichen.
Mehrere tar-Archive durchsuchen
#!/bin/bash
for i in $(ls *.bz2)
do
echo `tput rev`$i`tput sgr0`
echo `tar -tjf $i | grep -e "$1"`
done
