Reguläre Ausdrücke GREP

Einführung

Reguläre Ausdrücke sind für die meisten Linux/Unix Tools und
Skript-Sprachen essentiell,  deshalb sollte sich jeder, der ernsthaft mit Linux
arbeiten will, die Mühe machen, sie zu verstehen. Auch wenn einem am Anfang ein
Ausdruck wie

^[0-9]+\.[0-9][0-9] *EUR

recht kryptisch
vorkommen mag, so kann man es bald mit ein wenig Ãœbung  wie eine Ãœberschrift in
der Tageszeit lesen.

Damit die folgenden Beispiele nicht allzu trocken
sind, werden wir Heinrich Heines Lorelei als zu filternde Beispieldatei
wenn möglich verwenden. Speichern Sie das Gedicht bitte als heine.txt, wenn Sie
die folgenden Beispiele nachvollziehen wollen.

Ein regulärer Ausdruck in
Linux (ebenso wie in Unix) beschreibt ein Textmuster (text pattern), welches
eine Folge von Zeichen definiert.

grep

Ein recht einfaches aber dennoch mächtiges Tool, welches reguläre
Ausdrücke benutzt, ist das Kommando grep, bzw. fgrep und egrep.

grep "Schiff" heine.txt

liefert als Ausgabe alle Zeilen, die das Wort „Schiff“ enthalten:

Den Schiffer im kleinen Schiffe
Am Ende Schiffer und Kahn;

Stellen wir uns nun vor, dass wir eine Zeile suchen, von der wir wissen,
dass das Wort oder „kämmt“ drin vorkommt und ausserdem das Wort „Kamme“. Diese
Aufgabe kann man elegant mit einem einfachen regulären Ausdruck lösen. Zunächst
muss man wissen, dass eine Punkt „.“ innerhalb eines regulären Ausdrucks für ein
beliebiges Zeichen steht. Ein Stern „*“ heisst, dass das vor ihm stehende Zeichen
beliebig oft vorkommen kann (also auch überhaupt nicht!). Der Ausdruck „.*“
passt also auf eine beliegige Zeichenkette.

grep "kämmt.*Kamme" heine.txt

liefert die gewünschte Zeile:

Sie kämmt es mit goldenem Kamme

Möchten wir nun alle Zeilen herausfiltern, in denen entweder das Wort
„Jungfrau“ oder das Wort „Lorelei“ vorkommt, so lässt sich dies mit grep nicht
mehr elegant bewerkstellen. Um diese Aufgabe zu lösen benötigen wir egrep, was
jedoch im Prinzip das gleiche ist, als würde man grep mit der Option „-E“
aufrufen. Egrep kann erweiterte reguläre Ausdrücke verarbeiten.

egrep "Jungfrau|Lorelei" heine.txt

liefert die beiden Zeilen, die jeweils eines der beiden Suchwörter
enthalten:

Die schönste Jungfrau sitzet
Die Lorelei getan.

Sonderzeichen in regulären Ausdrücken und ihre Bedeutung:

  • Der Backslash \ dient als Escape-Zeichen:
    • Steht er vor einem Sonderzeichen, so verleirt es seine Sonderfunktion und
      wird wie das entsprechende Alphazeichen betrachtet.

    • Für bestimmte alphabetische Zeichen für es zu einer Sonderfunktion, wie z.B.
      \r für ein Return also ASCII 13 und \n Linefeed ASCII 10

  • ^ markiert einen Stringanfang: Das Suchmuster ^Gewaltige.*
    passt auf alle Zeichenketten, die mit dem Wort Gewaltig beginnen.

  • $ ist analog fürs Stringende.

  • Der Punkt . passt auf genau ein beliebiges Zeichen ausser dem
    Zeilenendezeichen \n. Beispiele siehe oben.

  • Die öffnende eckige Klammer [ leitet eine Zeichenmenge ein.

  • | trennt zwei Alternativen, wie wir oben mit „Jungfrau|Lorelei“
    gesehen haben.

  • ? steht für null oder eine Wiederholung des vorhergehenden
    Ausdrucks.

  • Der Stern * steht für für Null oder mehr Wiederholungen des
    vorhergehenden Zeichens oder Ausdrucks.

  • Das Pluszeichen steht für für mindestens eine Wiederholung des vorhergehenden
    Ausdrucks.

Eckige Klammern leiten eine Menge von Zeichen ein. Genau ein Zeichen aus
dieser Menge, kann im String an dieser Stelle vorkommen. Innerhalb einer soclen
Menge, haben einige Sonderzeichen wieder Sonderbedeutungen: ^ als
erstes Zeichen einer Zeichenmenge negiert die Zeichenmenge. Dies gilt jedoch
wirklich nur, wenn ^ wirklich als ersten Zeichen steht. Mit -
kann man einen Bereich definieren, zB. [0-9] definiert alle Ziffern von 0 bis 9.

powered by performancing firefox

Labeln von mp3-Files in der Bash

Im folgenden Beispiel werden Bash und Awk benutzt, um mp3-Files mittels id3ed zu
labeln.

#!/bin/bash
offset=0

for i in *.mp3 do #an der siebten und
achten Position des Filenamens steht die Tracknummer:
track=`echo $i | awk '{
print substr($0,7,2)}'`
echo $track
let track=$track+$offset
id3ed -g
32\
-s "" \
-n "DJ Smirk" \
-a "Cello Rap 42" \
-y 2003 \
-c
"Live in Paris" \
-k $track \
-q $i
done

powered by performancing firefox

Arbeitsweise des SED

Wir wollen nun jedes Vorkommen von „java4“ durch „java5“ ersetzen.
Der folgende Aufruf ersetzt in
allen Zeilen jedes Vorkommen:

sed "s/java4/java5/" test.txt

Obiger Aufruf birgt eine Gefahr.
Es wird in jeder Zeile nur das erste Vorkommen des Wortes „java4“ ersetzt. Will
man erreichen, dass alle Vorkommen eines Wortes innerhalb einer Zeile ersetzt
werden, so muss man hinter dem letzten Schrägstrich noch ein g ergänzen, also

sed "s/java4/java5/g" test.txt

powered by performancing firefox

Sortieren mit sort

sort teilt jede Zeile der Eingabedatei in Felder
ein, wobei als Voreinstellung das Leerzeichen (Blank) und das Tab als Trenner
fungieren.  Jede Zeile wird über diese Felder von links nach rechts sortiert.
Falls die Einträge beim am weitesten links stehenden Feld (Feld 0)  zweier
Zeilen gleich sind macht sort mit dem nächsten Feld weiter. Analog gilt dies bei
Gleichheit für alle weiteren Felder. Am besten veranschaulicht man sich dies an
einem Beispiel.

Betrachten wir folgende in adressen.txt gespeicherte
Datei:

Frank Meyer Radolfzell
Peter
Rabe Konstanz
Ottmar Huber Rosenheim
Anna Rabe Radolfzell
Oskar Lindner
Konstanz
Anna List Freiburg
Franziska Huber Rosenheim
Helge Rabe
Konstanz

Der Shell-Aufruf sort adressen.txt liefert dann folgende
sortierte Ausgabe:
Anna List
Freiburg
Anna Rabe Radolfzell
Frank Meyer Radolfzell
Franziska Huber
Rosenheim
Helge Rabe Konstanz
Oskar Lindner Konstanz
Ottmar Huber
Rosenheim
Peter Rabe Konstanz

Bei diesem Beispiel stellt sich
in nahezu natürlicher Weise die Frage, wie man diese Adressenliste nach dem
Nachnamen sortieren kann. Der Aufruf sort +1
-2 adressen.txt
bringt das gewünscht Resultat:
Franziska Huber Rosenheim
Ottmar Huber
Rosenheim
Oskar Lindner Konstanz
Anna List Freiburg
Frank Meyer
Radolfzell
Anna Rabe Radolfzell
Helge Rabe Konstanz
Peter Rabe
Konstanz

„+1“ bedeutet, dass sort ab der 1. Spalte mit der
Sortierung beginnen soll. (Die Nummerierung der Spalten beginnt mit 0!) „-2“
bedeutet, dass die Sortierung nur bis zur 2. Spalte erfolgen soll. Dies hat zur
Folge, dass Anna Rabe aus Radolfzell for den beiden anderen Rabe der Liste
erscheint. Dies entspricht in den meisten Fällen nicht dem, was wir eigentlich
wollen. Wir können dies folgendermassen korrigieren:
sort +1 -3 adressen.txt
Franziska Huber Rosenheim
Ottmar Huber
Rosenheim
Oskar Lindner Konstanz
Anna List Freiburg
Frank Meyer
Radolfzell
Helge Rabe Konstanz
Peter Rabe Konstanz
Anna Rabe
Radolfzell

Zum Schluss behandeln wir noch die Frage, wie man
sort benutzt, wenn keine Leerzeichen sondern z.B. Kommas als Feld-Trennzeichen
(field separator) verwendet wurde, also z.B. obiges Beispiel in der Form

Frank, Meyer, Radolfzell
Peter,
Rabe, Konstanz
Ottmar, Huber, Rosenheim
Anna, Rabe, Radolfzell
Oskar,
Lindner, Konstanz
Anna, List, Freiburg
Franziska, Huber,
Rosenheim
Helge, Rabe, Konstanz

gespeichert wäre.
Die
Lösung ist denkbar einfach. Man muss lediglich den Parameter „-t,“ bei den
Aufrufen benutzen, also:

  • sort -t, adressen.txt
  • sort -t, +1 -2 adressen.txt
  • sort -t, +1 -3 adressen.txt

powered by performancing firefox

PHP-Programmierung unter der Bash

PHP-Code eignet sich auch für das Programmieren mit Kommandozeilen auf Linux-Systemen. Der Artikel zeigt, wie mit PHP-Scripts unter Linux Eingaben gelesen und Dateien bearbeitet werden können.

Von Vincent Danen, 23. November 2006

Die Tage, als Perl die Skriptsprache der Wahl für das Programmieren mit Kommandozeilen auf Linux-Systemen war, sind vorbei. Heutzutage steht eine ganze Anzahl von Programmiersprachen zur Verfügung, darunter Python, Ruby und PHP. Wer bereits PHP-Code für Websites schreibt und sich in der Sprache auskennt, wird PHP auf der Kommandozeile schnell und leicht einsetzen können.

Die wichtigsten Funktionen, die eine Programmiersprache in einem Skript auszuführen hat, sind die Dateienverarbeitung und die Aufnahme von Nutzereingaben. PHP geht hier ebenso konventionell zu Werke wie alle anderen Skriptsprachen.

Sollen zum Beispiel PHP-Nutzereingaben während der Ausführung eines Skripts gelesen werden, findet folgender Code Anwendung:

#!/usr/bin/php
<?php
function read_input()
{
    $fp    = fopen(„/dev/stdin“, „r“);
    $input = trim(fgets($fp, 255));
    fclose($fp);
    return $input;
}
printf(„Please supply your name: „);
$name = read_input();
printf(„\nHello, $name.\n“);
?>

Die oben definierte Funktion read_input() übernimmt Eingaben aus STDIN, speichert sie in der Variable $input, entfernt sämtlichen davor und dahinter liegenden Durchschuss und gibt sie wieder aus. Das gleiche Prinzip kann angewandt werden, um normale Dateien zu lesen und zu bearbeiten. Man bedenke, dass STDIN für Linux einfach nur eine Datei ist (daher wird im Beispiel oben /dev/stdin geöffnet).

#!/usr/bin/php
<?php
if (file_exists($argv[1]))
{
    $file = $argv[1];
} else {
    printf(„ERROR: File ‚$file‘ does not exist!\n“);
    exit 1;
}
$data = file($file);
$c    = 1;
foreach ($data as $line)
{
    printf(sprintf(„[%s]: %s“, $c, $line));
    $c++;
}

Im oben angeführten Beispiel liest das PHP-Skript jede Zeile der in der Kommandozeile angegebenen Datei und gibt sie mit vorangestellter, fortlaufender Zeilennummer wieder aus. Wenn die Datei nicht existiert, druckt das Skript eine Fehlermeldung und wird mit Code 1 beendet. (Dies weist auf einen Fehler hin. Bei normalem Verlauf würde das Skript mit Code 0 beendet.) Die Funktion file() wird hier eingesetzt, da sie jede Zeile der Datei in ein Array einliest (in diesem Fall $data), das dann im Statement foreach() verwendet wird, um das Array einmal pro Zeile in der Datei durchzuarbeiten.

PHP muss nicht mehr nur für Web-Programmierung eingesetzt, sondern kann ohne grossen Aufwand auch für das Programmieren mit Kommandozeilen verwendet werden. Dabei ist PHP auch flexibel und schnell. Ebenso kann nahezu alles, was man mit einem Webskript macht, etwa die Bearbeitung von Datenbanken, sehr leicht auch mittels eines Kommandozeilenskripts in PHP erledigt werden.

powered by performancing firefox

Admin Blog

www.knebler.de
Assign a menu in the Left Menu options.
Assign a menu in the Right Menu options.

Privacy Preference Center

Necessary

Advertising

Analytics

Other