Archiv der Kategorie: Skripte

Programm mit Alt+F2 starten

Wenn man ein Programm oder Skript in seinem Homeverzeichnis liegen hat und dieses mittels „Alt+F2“ oder ähnlichem starten will muss man folgenden Befehl ausführen:

sudo update-alternatives --install "/usr/bin/programmname" "programmname" "/home/user/bin/programmname.sh" 1

„programmname“ steht hierbei für den Namen den man nachher eingibt
den Programmpfad, hier „/home/user/bin/programmname.sh“ muss man ebenfalls anpassen

Ghostscript

Auflösung von PDF-Dateien verändern (z. B. um ein PDF-Dokument mit sehr hochauflösenden Bildern für den E-Mail-Versand zu komprimieren):

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

Für PDFSETTINGS sind folgende Optionen möglich:

  • /screen (nur für Bildschirmanzeige – 72 dpi)
  • /ebook (geringe Qualität – 150 dpi)
  • /printer (hohe Qualität – 300 dpi)
  • /prepress: (hohe Qualität mit hoher Farbtreue – 300 dpi)

Ein fertiges Skript für Nautilus gibt es unter http://launchpad.net/compress-pdf. Hier noch eine Kurzanleitung zur Installation des Skripts:

$ sudo apt-get install zenity ghostscript libnotify-bin
$ cd ~/.gnome2/nautilus-scripts
$ wget http://launchpad.net/compress-pdf/1.x/1.4/+download/Compress-PDF-1.4.tar.gz
$ tar -xzf Compress-PDF*.tar.gz && rm Compress-PDF*.tar.gz

Beispiele, wie PDF-Dateien in Bilder umgewandelt werden können zeigen die Artikel pdf2bmp und pdf2jpg

awk

. Bawk Ausdruck { Anweisungen } Datei

Ausdruck

Der erste Parameter ist ein regulärer Ausdruck.

Anweisungen

Den zweiten Parameter stellen die awk-Anweisungen (anzugeben in geschweiften Klammern) dar. Diese Anweisungen legen fest, welche Manipulationen am Input-Stream durchgeführt werden sollen.

Datei

Der Parameter Datei legt die Datei fest, aus der der Input-Stream gelesen werden soll. Ohne Angabe liest awk von der Standardeingabe oder aus einer Pipe.

Beispiele

Beispiel 1: 2. Spalte ausgeben (z. B. Prozess-ID bei grep)

ps aux | grep suchstring | awk '{print $2}'

Beispiel 2: alle Zeilen einer Datei mit dem Buchstaben „n“ ausgeben:

awk '/n/' /etc/group

Wörter zählen

Folgendes Skript zählt die (verschiedenen) Wörter in einer Datei.

  1. Ermittle, welche Zeichen Wörter trennen.
  2. Ersetze diese Zeichen durch \n-Zeichen, so dass auf jeder Zeile nur ein Wort steht.
  3. Entferne leere Zeilen.
  4. Wandle alle Großbuchstaben in Kleinbuchstaben um.
  5. Sortiere alles.
  6. Zähle die mehrfach vorkommenden Zeilen und gebe die Statistik aus.

Als pipe formuliert sieht die Lösung wie folgt aus:

tr ' :.,;()"' '\n\n\n\n\n\n\n\n' < Eingabe.txt | # 1, 2
grep -v '^$' |                                   # 3
tr 'A-ZÖÜÄ' 'a-zöüä' |                           # 4
sort |                                           # 5 
uniq -c                                          # 6

übergebenen Pfad ermitteln bzw. abfragen

Überprüft, ob ein übergebener Pfad gültig ist. Wird kein Pfad übergeben, so wird einer über kdailog abgefragt.

if [ "$1" == "" ] ; then
 dir=`kdialog --getexistingdirectory "$dir" --caption "ScaleImage"`
 [ $? -eq 1 ] && exit
else
 dir="$1"
 [ -d "$dir" ] || dir="${1%/*}" # Dateinamen vom Pfad abtrennen
 [ -d "$dir" ] || exit # kein gültiger Pfad
fi

bc

Führt mathematische Berechnungen in der Konsole aus. Der zu berechnende Ausdruck wird über die Standardeingabe eingelesen und das Ergebnis über die Standardausgabe ausgegeben.

Über die Option -l wird die Mathematik-Library geladen. Diese ermöglicht Berechnungen mit Winkelfunktionen.

 +, -, *, /, ^ entsprechend der Mathematischen Bedeutung
 – wert liefert den negativen Wert von „wert“
 ++ var, — var die Variable wird um 1 erhöht/erniedrigt und dann das Ergebnis ausgegeben
 var ++, var — die Variable wird als Ergebnis ausgegeben und dann um 1 erhöht/erniedrigt
 <, <=, >, >=, ==, != Vergleiche (liefert 1 oder 0)
 !wert  liefert 1, wenn „wert=0“ ist
 &&  liefert 1, wenn zwei Ausdrücke nicht 0 sind
 ||  liefert 1, wenn keiner der Ausdrücke 0 ist

Für folgende Berechnungen muss die Mathematik-Library mit der Option -l geladen werden:

 s (x)  sin (x) in rad
 c (x)  cos (x) in rad
 a (x)  arctan(x) in rad
 l (x)  ln (x)
 e (x)  e-Funktion
 j (x)  Bessel-Funktion

Beispiele:
echo "(5+3)/2 | bc
echo "s (64.4)" | bc -l

mit scale abgetrennt durch ein Semikolon kann die Anzahl der Nachkommastellen, auf die gerundet wird, angegeben werden:
echo "scale=1; s (64.4)" | bc -l

read

Liest eine Zeichenkette von der Standardeingabe ein.
-n Anzahl der einzulesenden Zeichen
-s x Wartet maximal x Sekunden auf die Eingabe
-p Text gibt „Text“ vor dem Einlesen auf der Standardausgabe aus

read -n 1 -s 5 eingabe
 if [ $? -eq 1 ] ; then
 echo "Zeitüberschreitung für die Eingabe ..."
 fi
echo $eingabe

let

Ganzzahliges Rechnen mit Variablen und vergleichen von Variablen:

let a++ Variabel a um 1 erhöhen (Increment)
let a– Variable a um 1 erniedrigen (Decrement)
+, -, *, / let a=1+2
let a=$b/$c
** potenzieren z. B. let a=2**5
<=, >=, <, > Vergleich /liefert 1 oder 0) z. B. let a=’1<2′
==, != gleich, ungleich z. B. let a=’$b==$c‘
&, ^, | Bitweise AND, XOR, OR
&&, || logisches AND, OR

Berechnungen mit mehreren Rechenoperatoren:
let a=($b-1)/2

case

case Wert in
  Muster1) Befehle;;
  Muster2) Befehle;;
  ...
  *) Befehle;;
esac

Die Befehle hinter *) werden ausgeführt, wenn keines der aufgeführten Muster passt. Muster
können über ein ODER (|) verknüpft werden: Muster1|Muster2.

test […]

Der Befehl test dient zum Überprüfen von Dateitypen bzw. Vorhandensein von Dateien und zum Vergleichen von Werten. Der Aufruf erfolgt mit test Vergleich wobei Vergleich die Prüfung bzw. den Vergleich enthält. Als Ergebnis gibt test 0 für Wahr (true) und 1 für Falsch (false) zurück. Der Rückgabewert wird mit Hilfe der Shelleigenen Variablen $? ermittelt. Es gibt Vergleiche für Dateien, Zeichenketten und Integer-Zahlen.

Anstatt des Befehls test kann die Bedingung auch in eckige Klammern gesetzt werden. Hierbei ist darauf zu achten, dass zwischen den Klammern und dem Vergleich jeweils ein ein Leerzeichen steht:  [ Vergleich ]
Weiterlesen

Befehle in Abhängigkeit ausführen

Ein zweiter Befehl wird in Abhängigkeit eines ersten Befehls ausgeführt:

  1. Zweiter Befehl nach Beendigung des ersten Befehls ausführten:
    date; ls 
  2. Zweiter Befehl ausführen, wenn der erste erfolgreich war:
     make && make install
  3. Zweiter Befehle ausführen, wenn der erste nicht erfolgreich war:
    ls datei || touch datei
  4. Kombination aus 2 und 3:
     ls datei && echo "Datei vorhanden" || touch datei

Datei zeilenweise einlesen

Mit while:

while read LINE; do 
  echo ${LINE[1]} 
done < infile.txt

Aufruf über File-Descriptor (ermöglicht direkten Zugriff auf die Datei „datendatei“):

exec 3<Datendatei
while read -u 3; do
  echo ${REPLY} 
done
exec 3<&-

IP-Adressen aus einer Datei auslesen (Durch setzen des Punktes in der Trennzeichenvariablen IFS werden die durch „read“ eingelesenen IP-Adressen aufgeteilt und in die Array-Variable „IP“ geschrieben):

exec 3<iplist 
IFS=".${IFS}" 
while read -u 3 -a IP; do 
 echo ${IP[0]}.${IP[1]}.${IP[2]}.${IP[3]} 
done 
exec 3<&-

while-Schleife

while Bedingung ; do
  # Befehle
done

Beispiele:

Endlosschleife:

while : ; do
# auszuführender Quelltext
# Schleife wird mit break beendet
done

While-Schleife mit find (Variante mit for (siehe for-Schleife) ist ca. 30% schneller):

find /home -type f | while read; do
  echo ${REPLY}
done

alle *.jpg rekursiv in allen Unterordnern finden (hierzu gibt es auch eine elegante Variante mit for, die jedoch nur in der Bash funktioniert):

 while read -rd "" i; do 
  echo "$i" 
done < <(find /home/user/unterordner/ -iname "*.jpg" -print0)

Datei zeilenweise einlesen (Eine Variante mit File-Descriptor gibt es hier):

while read LINE; do
  echo ${LINE[1]}
done < infile.txt

Fehlermeldung „Error:“ in einer Datei suchen:

while [ $error \> 0 ] ; do 
 echo Es sind Fehler aufgetreten! 
 error=`grep -c Error: Datei.txt` 
done

for-Schleife

for x [ in Liste ] ; do
  # Befehle
done

continue [n]: springt zum Schleifenanfang und übergeht dabei n Duchläufe
break [n]: verlässt n Schleifenebenen

Beispiele:

Script um alle Bilder in einem Verzeichnis zu verkleinern:

for file in * ; do
  convert -scale 100x $file klein_$file
done

Dieses Script wandelt alle PDF-Dateien im Verzeichnis in Postscript-Dateien um:

for i in *.pdf; do 
  pdf2ps $i
done

Zählerschleife:

for ((i=1; i<=100; i++)) {
  echo $i
}

For-Schleife mit find (schnell):

 for f in $(find /home -type f); do 
  echo ${f} 
done

Alle *.jpg finden und bearbeiten (funktioniert nur in der Bash):

shopt -s globstar nocaseglob 
for i in /home/user/unterordner/**/*.jpg; do 
  echo $i 
done

übergebene Parameter

$# Anzahl der Parameter
$1 1. Parameter
$2 2. Parameter
.
.
$n n. Parameter

$* oder $@ alle Parameter
$? Rückgabewert des letzten Kommandos
$$ Prozessnummer der aktiven Shell
$! Prozessnummer des letzten Hintergrundprozesses
ERRNO Fehlernummer des letzten fehlgeschlagenen Systemaufrufs
PWD Aktuelles Verzeichnis (wird durch cd gesetzt)
OLDPWD Vorheriges Verzeichnis (wird durch cd gesetzt)

Dateinamen, Dateiendung und Pfad trennen

  • Pfad ohne letzten Slash:  DIR="${i%/*}"
    alternativ:  DIR=`dirname "$i"`
  • Pfad mit Dateinamen ohne Endung:  xBASE="${i%.*}"
    alternativ:  xBASE=`echo "$i" | sed 's/\(.*\)\..*/\1/'`
  • Aktuellen Pfad durch . ersetzen:  [ "$DIR" == "$i" ] && DIR=.
  • Dateiname mit Endung: FILE="${i##*/}"
    alternativ: FILE=`basename "$i"`
  • Dateiendung: FILEEXT=${i##*.}
    alternativ:  FILEEXT=`echo "$i" | sed 's/.*\.\(.*\)/\1/'`
    Dateiendung in Großbuchstaben:  FILEEXT=`echo ${i##*.} | tr '[:lower:]' '[:upper:]'
  • Dateiname ohne Endung: FILEBASE=${FILE%.*}

Stringbearbeitung (Variablen)

Aufruf Beschreibung
${name:n:m} liefert Teil eines Strings
n = Offset, negativ = vom Ende her (in diesem Fall muss ein Leerzeichen vor dem Minus stehen!)
m = Anzahl (kann entfallen)
${name#a} entfernt den Anfang, wenn dieser mit a übereinstimmt
a = Suchstring (Windcards (?,*) sind erlaubt)
${name##*a} entfernt alle Übereinstimmungen mit a vom Anfang her
a = Suchstring (Windcard „*“ notwendig!)
${name%a} entfernt das Ende, wenn dieses mit a übereinstimmt
a = Suchstring (Windcards (?,*) sind erlaubt)
${name%%a*} entfernt alle Übereinstimmungen mit a vom Ende her
a = Suchstring (Windcard „*“ notwendig!)
${name/s/e} Suchen / Ersetzen (erste Fundstelle)
s = Suchstring (Windcards (?,*) sind erlaubt)
e = Ersatzstring (kann entfallen -> Suchstring wird entfernt)
${name//s/e} Suchen / Ersetzen (alle Fundstellen)
s = Suchstring (Windcards (?,*) sind erlaubt)
e = Ersatzstring (kann entfallen -> Suchstring wird entfernt)
${name:-a} Standardwert zurückgeben
gibt den Wert „a“ zurück, wenn die Variable „name“ leer ist
${name:=a} Standardwert setzen und zurückgeben
gibt den Wert „a“ zurück und weist diesen der Variablen „name“ zu, wenn die Variable „name“ leer ist
${name:?a} Fehlermeldung und Programmabbruch
Wenn die Variable „name“ leer ist, wird die Fehlermeldung „a“ ausgegeben und das Skript beendet.
${name:+a} liefert „a“, wenn „name“ nicht leer ist
mit dieser Funktion kann z.B. ein „/“ eingefügt werden, wenn eine Datei übergeben wird (z.B. $HOME${datei:+/}$datei )

tr

Zeichen in Dateien ersetzen

Option Bedeutung
-d Entfernt die Zeichen in Satz1 aus der Zeichenfolge
-s Entfernt mehrfache Vorkommen der Zeichen in Satz1
-c Ersetzt die Zeichen, die nicht in Satz1 vorkommen

Beispiele:
cat file1 | tr altes_Wort neues_Wort > NeueDatei

tr -d ':' < /etc/passwd 
liest /etc/passwd und entfernt aus diesem Zeichenstrom alle Doppelpunkte.

tr -s '\n' 
ersetzt doppelte oder mehrfache Leerzeilen durch eine einzige.

tr "\n" " " < dateiname > neue_datei 
löscht alle Zeilenumbrüche

tr [:lower:] [:upper:]
ersetzt alle Kleinbuchstaben aus der Standardeingabe durch Großbuchstaben und gibt das Ergebnis auf der Standardausgabe aus.

sed

sed verwendet reguläre Ausdrücke

Suchen und ersetzen von Text in Dateien: sed 's/Suchtext/Ersetztext/g' quelldatei.txt > zieldatei.txt Ist im zu bearbeitenden Text ein Slash / , so muss dieser mit  \/  angegeben werden.
Leerzeichen in Dateinamen in Unterstriche umwandeln: for a in *; do mv "$a" "$(echo $a | sed 's/ /_/g')"; done