BASH Quickies ... Skripte als Einzeiler
BC - Rechnen auf der KommandzeileBootfähigen USB Stick aus IMG-Datei erstellen
Datum - Wandeln der Datumsdarstellung
Finden und Listen großer Dateien
Hexadezimal Code von Zeichen
Killen von Prozessen
Kopieren eines Verzeichnis-Baums
Konvertieren von Textfiles mit Abiword
Tausender Trennzeichen in ls
Test Variable ist Numeric
Top Ten der Shell Kommandos
Vergleich zweier Verzeichnis Pfade
Watch - Beobachten von offenen Files mit Lock
Farbiger Prompt für Root
Kleinere Aufgaben lassen sich mittels BASH oft direkt ausführen, in dem man Kommandos in einer Zeile angibt. Viele Dinge lassen sich so ohne Programmierung sofort ausführen. Fall Sie einen Quicky öfter benötigen tragen Sie ihn als Alias für die BASH in die .bash_aliases ein und geben Sie diese wiederum in der .bashrc (beide im Home-Verzeichnis) frei.
BC - Rechnen auf der Kommandzeile
BC ist ein sehr mächtiger Kommandozeilen Rechner mit sehr hoher Genauigkeit. Das folgende Beispiel gibt PI mit 100 Nachkommastellen aus:
$ echo "scale=100; 4*a(1)" | bc -l 3.141592653589793238462643383279502884197169399375105820974944592307\ 8164062862089986280348253421170676
Auch die Umrechnung von Dezimal oder Binär in Hex Werte ist möglich:
$ echo "obase=16;ibase=2;10111100;" | bc -l BC
Wird BC einfach "nur so" aufgerufen, geht er in einen interaktiven Modus. Dort kann man alle möglichen Rechenoperationen durchführen. BC wird durch die Eingabe von "quit" beendet. Das deutsche Tastaturlayout hat im Zehnerblock ein Komma. Der BC benötigt jedoch den Dezimalpunkt. Das folgende Quickie ist ein Workaround dazu:
xmodmap -e "keycode 91 = period" && bc -lq; xmodmap -e "keycode 91 = KP_Delete KP_Separator"
Wird der BC damit aufgerufen, kann man sehr gut mit dem Zehnerblock rechnen. BC wird durch die Eingabe von "quit" verlassen.
BC kann auch die Frage nach dem Leben, dem Universum und dem ganzen Rest beantworten ...
echo "variable=1764;\"Die ultimative Antwort ist \";scale=0;sqrt(variable)" | bc -qlzum Seitenanfang
Bootfähigen USB Stick aus IMG-Datei erstellen
Manche Linux Distributionen lassen sich als IMG-Datei (nicht zu verwechslen mit ISO) herunterladen. Um daraus einen bootfähigen USB-Stick zu erstellen, muss man nur das Device kennen, lässt sich mit
sudo fdisk -lleicht finden und sicherstellen, dass es nicht gemounted ist. Im Beispiel ist der USB-Stick /dev/sdc
sudo dd bs=4096 if=~/Desktop/ubuntu-9.04-netbook-remix-i386.img of=/dev/sdc
Achtung: die Angabe des falschen Zieldevices mit of=/dev/... kann zum Löschen wichtiger Daten führen. Also unbedingt sicherstellen, dass mit of=/dev/... auf das richtige Device verwiesen wird.
zum SeitenanfangWandeln der Datumsdarstellung
Manchmal ist es notwendig ein Datum nach deutscher Schreibweise, z.B. 01.04.2007 in ein Datum des Formates 2007-04-01 zu wandeln, weil das für Dateinamen und deren Sortierung besser passt. Das funktioniert unter Verwendnug von SED mit folgendem Einzeiler:
echo 01.04.2007 | sed 's/\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)/\3-\2-\1/g'zum Seitenanfang
Hexadezimalcode von Zeichen
Hex-Code von Zeichen kann man natürlich in Tabellen nachschlagen. Schneller geht es allerdings mit:
echo -n '€' | hd 00000000 e2 82 acDas hat den zusätzlichen Vorteil, dass Echo den momentan eingestellten Zeichensatz automatisch berücksichtigt. Im Beispiel wird UTF-8 verwendet.
Benötigt man die Oktale Darstellung, dann einfach ein '-b' anhängen:
echo -n 'ß' | hd -b 00000000 c3 9f 0000000 303 237zum Seitenanfang
Killen von Prozessen
Killall ist ein nettes Utility zum Beenden (Killen) von gleichartigen Prozessen. Oft findet Killall aber nicht alle Prozesse eines bestimmten Suchmusters. Der folgende Einzeiler verwendet das Grep Utility von Linux/UNIX und killt alle so gefundenen Prozesse.
for i in `ps -ef | grep [-i] "muster" | awk '{print $2}'`; do echo $i; done
Mit grep "muster" wird die komplette Prozessliste nach "muster" gefiltert. AWK überträgt das 2te Element jeder Zeile, die Prozessnummer, an die Schleife und somit an das kill Kommando. Weiterer Vorteil des Skripts: Es läuft auch auf anderen UNIX Systemen, wie z.B. Solaris.
zum SeitenanfangKopieren eines Verzeichnis-Baums
Dazu gibt es unter Linux viele Möglichkeiten:
cp -r source destCopy rekursiv dürfte die einfachste sein ... allerdings mit dem Nachteil, dass die Datei-Metadaten geändert werden, was oft unerwünscht ist.
rsync -au source dest
Rsync ist eine wesentlich elegantere und ggf. schnellere Möglichkeit einen Verzeichnisbaum an eine andere Stelle zu kopieren. Die Option -au führt dies durch, die Metadaten der Dateien bleiben erhalten.
tar cSpf - opt | ( cd /dest/; tar xvSpf - )
Falls man rsync nicht anwenden will oder kann, geht es auch mit tar. Das Kommando kopiert das WD (working directory) nach dest.
zum SeitenanfangFinden und Listen großer Dateien
Wenn die Festplatte vollläuft möchte man gerne wissen, wo die "dicken Brocken" sind.
find . -size +100M -exec ls -lh '{}' \; | grep -v vmware | awk '{ print $5, $6, $8 }'
Find sucht ab dem aktuellen Verzeichnis alle Dateien größer 100MB und führt je Datei ein ls -lh aus. Grep unterdrückt das Listen der Dateien aus dem vmware Verzeichnis und awk filtert auf bestimmte Spalten
Wenn man diese Kommandozeile öfter benutzen möchte, kann man sie mit
alias big="find . -size +100M -exec ls -lh '{}' \; | grep -v vmware | awk '{ print \$5, \$6, \$8 }'"
als Alias Kommando "big" festlegen.
zum SeitenanfangTausender Trennzeichen in ls
Ein normales ls -l
listet die Dateigrößen in Bytes. Das kann sehr schnell unübersichtlich werden. Tausender Trennzeichen werden ausgegeben mit:
BLOCK_SIZE=\'1 ls -lzum Seitenanfang
Test Variable ist Numeric
Die Bash hat keine direkte Abfragemöglichkeit, ob eine Variable nummerisch ist. Ein kleiner Workaround dazu:
if [ $var -ne 0 ] 2>/dev/null; then echo "\$var ist nummerisch" ... fi
Wenn $var ein String ist, wird eine Fehlermeldung ausgegeben, die auf /dev/null umgeleitet wird. Die if Kondition wird nur ausgeführt, wenn $var einen nummerischen Wert enthält und ungleich Null ist.
Steffen Hoffmann hat mir das Mini-Skript zugesandt, dass auch bei $var=0 richtig auswertet.
if [ $(echo "x=$var;scale=0;1^x" | bc -l 2>/dev/null) -eq 1 ] 2>/dev/null; then echo "$var ist nummerisch" ... fizum Seitenanfang
Top Ten der Shell Kommandos
Die zehn häufigst verwendeten BASH Kommandos:history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -n | tail | sort -nrzum Seitenanfang
Konvertieren von Textfiles mit AbiWord
Mit AbiWord lassen sich Textdateien ganz einfach auf der Kommandozeile wandeln:
abiword --to=pdf document.doc
Wandelt beispielsweise eine Microsoft Word-DOC Datei in das PDF-Format um. AbiWord kennt eine ganze Reihe von Dateiformaten, z.B. abw, txt, rtf und html.
abiWord --to=txt --exp-props="encoding:utf-8" test.wri
Abiword kann auch Zeichensätze konvertieren. Im Beispiel wird eine Textdatei von Windows nach Linux UTF8 gewandelt.
Wenn man Skript gesteuert mittels AbiWord eine neue leere RTF-Datei erstellen möchte, öffnet sich AbiWord mit "unbekannt0". Als Workarround dazu in einem Skript:
echo "x" > $name.txt abiword --to=rtf $name.txt abiword $name.rtf
So lässt sich eine neue RTF-Datei skriptgesteuert mit AbiWord anlegen. Das x am Dateibeginn muss man in Abiword noch löschen.
zum SeitenanfangVergleich zweier Verzeichnis Pfade
Wenn man schauen möchte, ob alle Dateien ab dem WD auch in einem Ziel-Pfad vorhanden sind ...DEST=/backup_pfad IFS_BAK=$IFS; IFS=$'\n'; for i in $(find .); do if [ ! -e "$DEST/$i" ]; then ls $i; fi; done; IFS=$IFS_BAK
Alle Dateien die in $DEST nicht vorhanden sind werden gelistet. Das Umsetzen des $IFS ist notwendig, wenn in den Dateinamen Leerzeichen vorhanden sein können. Das Verzeichnis DEST kann natürlich auch direkt in die Zeile eingegeben werden
Da Directories unter Linux im Prinzip auch "nur" (Spezial)Dateien sind, kann man zum schnellen Vergleich von zwei Directories auch das standard UNIX/Linux Kommando diff
verwenden:
diff ~/tmp /tmp
vergleicht die beiden Directories home/tmp und /tmp und listet ggf. die Differenzen.
zum SeitenanfangWatch - Beobachten von offenen Files mit Lock
Offene Files lassen sich mit lsof anzeigen. In der vierten Spalte wird der FD (File Descriptor) angezeigt, dieser enthält bei gelockten Files 2 Ziffern und 2 Buchstaben und lässt sich somit per grep finden. Mittels Watch wird das kurze Skript einmal je Sekunde aufgerufen.
watch --interval=1 "lsof 2>/dev/null | awk '{ print \$4 \" \" \$0 }' | grep -i '^[0-9][0-9]*[a-z][a-z]'"
Das watch Interval ist auf 1 Sekunde gesetzt. "2>/dev/null" entfernt ggf. Warnmeldungen von lsof. Der Einfachheit halber wird mit AWK die Spalte 4 "nach vorn" geholt und dort mit grep gefiltert. Könnte man sicher auch mit awk direkt machen ... für mich war es so einfacher.
zum SeitenanfangFarbiger Prompt für Root
Wenn man sich des öfteren als User Root auf dem System bewegt, ist es vorteilhaft, wenn man in einem Terminalfenster dies gleich an der Farbe des Prompt erkennen kann. Dazu einfach im Home-Verzeichnis von Root die .bashrc Datei editieren und an deren Ende die Zeile:
PS1='${debian_chroot:+($debian_chroot)}\[\033[0;01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
anfügen.
root@systemname wird beim nächsten Einloggen in Rot angezeigt und der Pfad in dem man sich befindet in Blau angehängt. Beispiel:
root@mars:/etc/X11#
zum Seitenanfang