Variablen bei sed-Ausdrücken

Problem: Beim Suchen und Ersetzen eines Strings in einer Textdatei mit dem Linux-Programm sed (Stream Editor) trat das Problem auf, dass bei der Verwendung von Shellvariablen als Suchmuster der gewünschte Text, also der Wert der Variablen, nicht durch den Zieltext ersetzt wurde. Ein Test ohne Variablen funktionierte aber ohne Probleme.

sed ‘s/suchmuster/zieltext/g’ Eingabedatei > Ausgabedatei
mv Ausgabedatei Eingabedatei

ersetzte den Text “suchmuster” in der “Eingabedatei” mit dem Text “zieltext” und schrieb das Ergebnis in die “Ausgabedatei”.

Folgendes funktionierte aber nicht:

suchmuster=”das ist der quelltext”
zieltext=”das ist der zieltext”
sed ‘s/$suchmuster/$zieltext/g’ Eingabedatei > Ausgabedatei
mv Ausgabedatei Eingabedatei

Der Text “das ist der quelltext” wurde nicht durch den Text “das ist der zieltext” ersetzt.

Lösung: Durch eine Suchmaschinenrecherche fand ich die Lösung. Sed wertet den Inhalt von Variablen nicht aus, wenn man einfache Anführungszeichen (‘) beim Erstellen des Ausdrucks verwendet. Ersetzt man die einfachen Anführungszeichen durch doppelte Anzührungszeichen (“), werden zuerst die Variablen expandiert und dann erst der Sed-Ausdruck ausgeführt.

Der funktionierende Code sah dann so aus:

suchmuster=”das ist der quelltext”
zieltext=”das ist der zieltext”
sed s/$suchmuster/$zieltext/g Eingabedatei > Ausgabedatei
mv Ausgabedatei Eingabedatei

Quelle: http://www.unixboard.de

SSH Login scheitert mit der Fehlermeldung “sshd[xxxx]: fatal: daemon() failed: No such device”

Plötzlich war bei unserem OpenSuse 10.3 Rootserver kein SSH Login mehr möglich. Der Verbindungsaufbau wurde mit der Meldung “Connection Refused” verweigert. Glücklicherweise hatte ich noch Zugriff auf die Konsole des Servers, wo ich mich auch lokal anmelden konnte. Eine Überprüfung mit

rcsshd status

zeigte, dass der SSH Daemon nicht lief. Auch ließ er sich mit

rcsshd start

nicht mehr starten. Ein Blick in /var/log/messages zeigte folgende Fehlermeldung: sshd[27256]: fatal: daemon() failed: No such device.
Eine Internetrecherche brachte dann die Lösung des Problems. Anscheinend war die Datei /dev/null daran Schuld, dass sich der SSH Daemon nicht starten ließ. Mit folgenden Befehlen wurde die Datei /dev/null gelöscht und neu erstellt:

rm -rf /dev/null
mknod /dev/null c 1 3

Danach funktionierte das Starten des SSH Daemons mit

rcsshd start

wieder.

Gefunden habe ich die Lösung unter:

http://forums.misdivision.com/showthread.php?t=633

Bash: Löschen von Zeilen aus einer Datei, die ein bestimmtes Suchmuster enthalten

Das Löschen von bestimmten Zeilen aus einer Datei kann mithilfe einer temporären Datei und dem Kommandozeilentool grep geschehen. Grep gibt alle Zeilen einer Textdatei aus, die einem bestimmten Suchmuster entsprechen. Die Option -v von grep negiert die Ausgabe von grep. Es werden dann nur Zeilen einer Datei ausgegeben, die ein bestimmtes Suchmuster nicht enthalten. Die Ausgabe auf dem Bildschirm kann man nun in eine temporäre Datei umleiten. Im Anschluss daran kann man die Originaldatei mit der temporären Datei überschreiben. Nun hat man eine Datei, aus der diejenigen Zeilen entfernt wurden, die ein bestimmtes Suchmuster enthielten.

grep -v  suchmuster originaldatei > tempdatei
mv tempdatei originaldatei

Typo3 Extension Manager (Erw Manager, Ext Manager) wird nicht angezeigt, stattdessen sieht man nur eine leere Seite

Problem: Nach der Neuinstallation von Typo3 auf einer “frischen” OpenSuse 10.3 Installation wurde der Typo3 Extension Manager (Erw Manager, Ext Manager) nicht angezeigt. Es war nur eine leere Seite zu sehen.

Ursache: Ein Blick in die Error-Logdatei von Apache zeigte folgende Meldung:

PHP Fatal error: Call to undefined function gzfile()

Dies war ein Hinweis darauf, dass es ein Problem mit dem zlib-Modul von PHP gab.

Lösung: In der Suse Paketverwaltung von Yast zeigte sich, dass das php5-zlib Modul nicht installiert war. Eine Installation des PHP Moduls und ein Neustart von Apache beseitigte den Fehler mit der leeren Seite statt dem TYPO3 Extension Manager.

Problem mit Pagebrowser bei tt_news in Verbindung mit dem Typo3 Plugin CoolURI

Nachdem wir uns bei einigen Projekten mit der Konfigurationsdatei der Typo3 – Extension realurl mehr schlecht als recht herumgeschlagen hatten, waren wir froh, mit CoolUri eine alternative Typo3 – Extension für “schönere” Urls gefunden zu haben. Bei Tests bemerkten wir, dass der Pagebrowser der tt_news Extension nicht mit CoolUri funktionierte.

Eine Web-Recherche brachte folgende Lösung:

1. Anpassen des TypoScript Templates:

Folgende Zeile muss dem Typoscript Template der Seite hinzugefügt werden:

plugin.tt_news = USER_INT

Quelle:

2. Anpassen der CoolURI XML Konfigurationsdatei:

Folgender Abschnitt muss der XML – Konfigurationsdatei von CoolURI hinzugefügt werden:

<part key=”page([0-9]+)”>
<parameter>tx_ttnews[pointer]</parameter>
</part>

Quelle:

Diese Anpassungen von CoolURI bewirken, dass die tt_news Seiten beim “Pagebrowsing” in der URL einfach durchnummeriert werden. 1.html, 2.html etc.

Typo3 Gästebuch Extension Modern Guestbook/ve_guestbook mit CoolUri

Damit die Typo3 Gästebuch Extension Modern Guestbook/ve_guestbook mit CoolUri funktioniert, muss die Datei CoolUriConf.xml angepasst werden.
Ohne diese Anpassung funktionieren die Links für das Umschalten zwischen den einzelnen Seiten der Gästebucheinträge nicht.

Änderung an der CoolUri Konfigurationsdatei CoolUriConf.xml:

Der Abschnitt:

<part>
<parameter>cHash</parameter>
</part>

muss aus dem übergeordneten Abschnitt “predefinedparts”

<predefinedparts>
<part>
<parameter>cHash</parameter>
</part>
</predefinedparts>

in den Abschnitt “uriparts” verschoben werden.

<uriparts>
<part>
<parameter>cHash</parameter>
</part>
</uriparts>

Gefunden auf: www.typo3forum.net

Reguläre Ausdrücke – regex, singleline, non-greedy

Ich habe mich bisher nur so viel wie nötig mit regulären Ausdrücken beschäftigt. Der komplexe Syntax und das kryptische Aussehen der regulären Ausdrücke haben mich bisher davon abgeschreckt, reguläre Ausdrücke zu benutzen. Kürzlich hatte ich aber das Problem, in vb.net Text zwischen einer Startmarkierung und einer Endmarkierung zu suchen. Natürlich kann man das auch mit den .net Stringfunktionen erreichen, aber ich wollte es dieses Mal mit regulären Ausdrücken versuchen.

Nach einigen Anfangsproblemen bin ich nun richtig begeistert von der Mächtigkeit der regulären Ausdrücke.

Mein erstes Problem war, dass sich mein zu analysierender Text über mehrere Zeilen zog, also waren Zeilenumbrüche vorhanden. Ebenso zogen sich die zu extrahierenden Textstellen über mehrere Zeilen. Meine regulären Ausdrücke lieferten nicht das erwartete Ergebnis. Besser gesagt: Sie lieferten gar kein Ergebnis.

Nach etwas Internetrecherche erfuhr ich, dass bei der Erstellung eines regex Objektes Optionen angegeben werden können. In vb.net findet sich das Ganze unter: System.Text.RegularExpressions.RegexOptions

Ohne weiter nachzulesen, wählte ich die Option Multiline, da ich ja Text zeilenübergreifend analysieren wollte. Diese Option lieferte aber zu meiner Überraschung ebenfalls kein Ergebnis.

Also machte ich mich daran, die Optionen näher anzuschauen. Dabei fand ich eine weitere Option: Singleline. Und genau diese muss man angeben, um das gewünschte Ergebnis zu erreichen. Ich finde das Ganze zwar etwas verwirrend: Singleline für zeilenübergreifendes Analysieren – aber Hauptsache, es funktioniert.

Wenn man also Text in vb.net mit regulären Ausdrücken über mehrere Zeilen hinweg analysieren möchte, muss man folgende Option einstellen:

System.Text.RegularExpressions.RegexOptions.Singleline

Beispiel:

Text, der analysiert werden soll:

start text1
text2
text3 ende

Regulärer Ausdruck: start(.*)ende

Dieser Ausdruck soll einen String zwischen start und ende extrahieren.

Ergebnis ohne die Option Singleline:

– Es wird nichts gefunden

Ergebnis mit der Option Singleline:

text1
text2
text3

Danach tauchte aber ein weiteres Problem auf. Bei sich mehrfach wiederholenden Mustern im Text, wurde immer die größtmögliche Ergebnismenge zurückgeliefert. Ich brauchte aber jede einzelne Ergebnismenge. Das Ganze wird an einem Beispiel deutlicher:

Text, der analysiert werden soll:

start text1
text2
text3 ende
start text4
text5
text6 ende

Der Regulärer Ausdruck: start(.*)ende liefert folgendes Ergebnis:

text1
text2
text3 ende
start text4
text5
text6

Gewünscht waren aber 2 Ergebnismengen:

Ergebnis 1:

text1
text2
text3

Ergebnis 2:

text4
text5
text6

Bei der Lösung dieses Problems stieß ich auf die Begriffe greedy (gierig) und non-greedy (nicht gierig) im Zusammenhang mit der Definition von regulären Ausdrücken. Greedy bedeutet, es wird immer die größtmögliche Ergebnismenge zurückgeliefert und non-greedy bedeutet, es wird die kleinstmögliche Ergebnismenge zurückgeliefert. Standartmäßig zeigen reguläre Ausdrücke ein “gieriges (greedy)” Verhalten. Um ein “nicht gieriges (non-greedy)” Verhalten zu erreichen, muss man bei der Definition von regulären Ausdrücken nach dem Quanifizierer noch ein ? anfügen.

Beispiel:

Text, der analysiert werden soll:

start text1
text2
text3 ende
start text4
text5
text6 ende

Der reguläre Ausdruck: start(.*?)ende liefert das gewünschte Ergebnis:

Ergebnis 1:

text1
text2
text3

Ergebnis 2:

text4
text5
text6

Packen und Entpacken mit tar

Weil ich als Windowsadmin immer wieder den Syntax von tar nachschlagen muss:

Packen

tar cfvz archiv.tar.gz verzeichnis/

  • Sichert das Verzeichnis “verzeichnis” in die Datei archiv.tar.gz – dabei wird die GZip Komprimierung verwendet.
  • Das Verzeichnis ‘verzeichnis’ wird mit relativem Pfad im Archiv gespeichert.
  • Symbolischen Links wird nicht gefolgt, sondern der Link wird gesichert.
  • Owner und Group Informationen sowie Rechte werden unverändert mitgesichert.

tar cfvz archiv.tar.gz /srv/www/vhosts/verzeichnis/

  • Sichert das Verzeichnis mit absolutem Pfad. Dieser Pfad wird beim Entpacken ausgehend vom aktuellen Verzeichnis wiederhergestellt.

Entpacken

tar xfvz archiv.tar.gz

  • Entpackt den Inhalt des Archivs “archiv.tar.gz” in den aktuellen Ordner.

CPU Last unter Linux monitoren – sar

Die CPU-Last lässt sich unter Linux ganz einfach mit dem Befehl top ermitteln. Hier erfährt man die gesamte CPU-Last, aber auch den CPU Verbrauch einzelner Prozesse.

Wenn man die gesamte CPU-Auslastung in bestimmten Zeitintervallen ermitteln möchte, eignet sich der Befehl sar besser.

Um den Befehl sar benutzen zu können, muss das Programmpaket sysstat installiert sein.

Der Syntax, um mit dem sar-Befehl die CPU-Last zu monitoren, lautet:

sar -u 5 100

5 gibt das Intervall in Sekunden an, in dem die CPU-Last ermittelt werden soll.

100 gibt die Gesamtanzahl an, wie oft die CPU-Last ermittelt werden soll.

Die Ausgabe sieht dann folgendermaßen aus:

14:30:08 CPU %user %nice %system %iowait %idle
14:31:08 all 16.87 0.00 3.41 5.02 74.70
14:31:13 all 31.12 0.00 9.44 9.64 49.80
14:31:18 all 23.85 0.00 6.81 2.61 66.73
—— snip —-
Average: all 5.72 0.00 1.14 0.58 92.56

Unter Debian befindet sich das Programm sar im Paket sysstat.

 apt-get install sysstat

 

Die Windows Eingabeaufforderung per Eintrag im Explorer-Kontextmenü in einem bestimmten Ordner öffnen

Obwohl dies an diversen Stellen im Netz zu finden ist, hier noch einmal, weil ich jedes Mal Google bemühen muss.

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\OpenNew]
@ = "Eingabeaufforderung"
[HKEY_CLASSES_ROOT\Directory\shell\OpenNew\Command]
@="cmd.exe /k cd %1"

Alles in eine Textdatei mit der Endung .reg einfügen, abspeichern und ausführen. Und schon hat man dem Kontextmenü des Explorers einen CMDHere Eintrag hinzugefügt. Ab sofort kann man mit diesem Eintrag die Windows Eingabeaufforderung (Kontextmenüeintrag: Eingabeaufforderung) in einem bestimmten Verzeichnis öffnen.

Wer es genauer wissen will, kann sich folgenden Artikel in der KnowledgeBase von Microsoft anschauen:
How to start a command prompt in a folder in Windows Server 2003, Windows XP, and Windows 2000