BASH Quickies

BASH Quickies ... Skripte als Einzeiler

BC - Rechnen auf der Kommandzeile
Bootfä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 ... happy_smile

echo "variable=1764;\"Die ultimative Antwort ist \";scale=0;sqrt(variable)" | bc -ql
zum 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 -l
leicht 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 Seitenanfang

Wandeln 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 ac
Das 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 237
zum 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 Seitenanfang

Kopieren eines Verzeichnis-Baums

Dazu gibt es unter Linux viele Möglichkeiten:

cp -r source dest
Copy 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 Seitenanfang

Finden 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 Seitenanfang

Tausender 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 -l 
zum 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"
  ...
fi

zum 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 -nr
zum 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 Seitenanfang

Vergleich 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 Seitenanfang

Watch - 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 Seitenanfang

Farbiger 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