<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://linupedia.org/wiki/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Itu</id>
	<title>Linupedia.org - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://linupedia.org/wiki/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Itu"/>
	<link rel="alternate" type="text/html" href="https://linupedia.org/opensuse/Spezial:Beitr%C3%A4ge/Itu"/>
	<updated>2026-04-24T00:46:12Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Sed&amp;diff=33065</id>
		<title>Diskussion:Sed</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Sed&amp;diff=33065"/>
		<updated>2019-12-14T12:08:13Z</updated>

		<summary type="html">&lt;p&gt;Itu: Die Seite wurde neu angelegt: „== Layout ==  Wie kann man es machen dass der Text in den Tabellenfeldern nicht so hart an Anfang klebt? nbsp's reinhauen wäre eher unschön für den Quelltex…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Layout ==&lt;br /&gt;
&lt;br /&gt;
Wie kann man es machen dass der Text in den Tabellenfeldern nicht so hart an Anfang klebt? nbsp's reinhauen wäre eher unschön für den Quelltext, geht das  besser? --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 13:08, 14. Dez. 2019 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33064</id>
		<title>Sed</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33064"/>
		<updated>2019-12-14T12:06:02Z</updated>

		<summary type="html">&lt;p&gt;Itu: tf-&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SED  - eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist sed und was kann sed ? ==&lt;br /&gt;
&lt;br /&gt;
[http://linux.die.net/man/1/sed sed] ('''S'''tream-'''ED'''itor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist '''sed''' nicht. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem &amp;quot;programmiertem Rezept&amp;quot; welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren '''Text-Bearbeitungs-Filter''', mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sed wurde 1973/74 von [http://senseis.xmp.net/?McMahon Lee E. McMahon] entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf [[Reguläre Ausdrücke|Regulären Ausdrücken]] auf und umfasst nur wenige [[#Befehlsübersicht|Befehle]]. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von '''sed''' sind der Zeileneditor [http://linux.die.net/man/1/ed ed] (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor '''[[VIM|vi]]'''.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''sed''' erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. &lt;br /&gt;
  sed 's/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g'&lt;br /&gt;
Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache.&lt;br /&gt;
Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von [[awk]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit '''sed''' schon durchsichtiger, und wer sich öfter und intensiver mit '''sed''' beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit '''sed''' die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit '''sed''' programmiert. In diesem [http://sed.sourceforge.net/grabbag/scripts/ SED Script Archiv] sind einige solcher Programme zu finden. Weitere [http://sed.sourceforge.net/#scripts sed-scripte] und weitere [http://sed.sourceforge.net/#gamez Spiele ] gibt es auf  [http://sed.sourceforge.net/ einer der wichtigsten SED-Seiten] (Web-Seiten geschrieben übrigens mit ? : [http://sed.sourceforge.net/local/scripts/sedindex2html.sed.html natürlich mit sed] ;-))) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Heute gibt es eine Vielzahl von [http://sed.sourceforge.net/sedfaq2.html#s2.2 '''sed''' Implementierungen für die unterschiedlichsten Betriebssysteme] die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der [http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke Regulären Ausdrücke], da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges [http://www.gnu.org/software/sed/manual/ GNUsed] das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Für was benötigen wir sed heute ? ===&lt;br /&gt;
&lt;br /&gt;
Mit '''sed''' lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.&lt;br /&gt;
&lt;br /&gt;
Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist '''sed''' oftmals ein sehr hilfreiches Tool.&lt;br /&gt;
Darüber hinaus kann man '''sed''' überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:&lt;br /&gt;
&lt;br /&gt;
* Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);&lt;br /&gt;
* Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen&lt;br /&gt;
* das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien&lt;br /&gt;
&lt;br /&gt;
Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird '''sed''' interessant. Mit dem Stream Editor lassen sich eine Vielzahl von [http://sed.sourceforge.net/local/docs/emulating_unix.txt Standardkommandos von UNIX simulieren]. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal '''sed''' als die Lösung für solche Problemfälle finden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um '''sed''' finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf '''sed''' zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell '''sed''' als die kleine elegante Lösung die beste Option. &lt;br /&gt;
&lt;br /&gt;
Für viele kleine Dinge ist '''sed''' durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist '''awk''' (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte '''sed''' auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.&lt;br /&gt;
&lt;br /&gt;
== das Funktionsprinzip ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip von '''sed''' ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnisprobleme beim Schreiben oder Interpretieren von sed-Programmen.&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von '''sed''' werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt '''sed''' den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der '''Zeilenzähler''' wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''sed''' hat einen Textbuffer den sogenannten '''Musterspeicher''', dieser ist beim Starten des Programms leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diesen Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Grundverhalten, dass '''sed''' jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von '''sed''' verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was '''sed''' denn ausgeben soll, wir müssen also  &amp;quot;Print-Befehle&amp;quot; benutzen. Die Option bei Aufruf von '''sed''' dazu ist &amp;quot;'''-n'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option '''-n''' die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option '''-n''' so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programms benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programms von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, nicht selten  &amp;lt;!-- mit?bei --&amp;gt; Option '''-n''' ;-))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== was beinhaltet sed und was kann man damit machen ===&lt;br /&gt;
&lt;br /&gt;
Neben dem '''Musterspeicher''' gibt es noch einen 2. Textbuffer, den sogenannten '''Haltespeicher'''. Auch dieser ist beim Start des Programms leer. In ihm könnte man jetzt z.B. den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige [[#Befehlsübersicht| '''sed''' Kommandos]] mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher durch Haltespeicher ersetzen &lt;br /&gt;
*  Haltespeicher durch Musterspeicher ersetzen&lt;br /&gt;
*  Inhalt von Halte- und Musterspeicher tauschen&lt;br /&gt;
*  Inhalt von Musterspeicher an den Haltespeicher anhängen &lt;br /&gt;
*  Inhalt von Haltespeicher an den Musterspeicher anhängen&lt;br /&gt;
'''Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden.''' Er dient nur zum Zwischenspeichern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und was geht jetzt mit dem Musterspeicher?&amp;lt;br&amp;gt;&lt;br /&gt;
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht z.B.:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher löschen&lt;br /&gt;
*  die nächste Zeile einlesen&lt;br /&gt;
*  die nächste Zeile hinten hinzufügen&lt;br /&gt;
*  Musterspeicher nach stdout ausgeben&lt;br /&gt;
*  Inhalte mit dem Haltespeicher austauschen&lt;br /&gt;
*  den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben&lt;br /&gt;
*  oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben&lt;br /&gt;
*  den Musterspeicher in eine Datei schreiben&lt;br /&gt;
*  Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht  &lt;br /&gt;
*  einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl [http://linux.die.net/man/1/tr tr])&lt;br /&gt;
*  und das Wichtigste, '''innerhalb des Musterspeichers suchen und ersetzen'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Variablen ?&lt;br /&gt;
: außer dem Haltespeicher und der Variable in der '''sed''' automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts&amp;lt;br&amp;gt;&lt;br /&gt;
; Schleifen ?&lt;br /&gt;
: gibt es auch keine, aber es gibt 2 '''Sprungbefehle''', ähnlich wie '''GOTO-Befehle''' und natürlich einen vorzeitigen Programmabbruch&amp;lt;br&amp;gt; &lt;br /&gt;
Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man '''sed''' schon sogut wie komplett erklärt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wie kann man damit Probleme lösen ===&lt;br /&gt;
&lt;br /&gt;
Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?&lt;br /&gt;
&lt;br /&gt;
Der Befehl, der den Hauptteil der Arbeit innerhalb von '''sed''' leistet, ist oben nur als '''&amp;quot;suchen und ersetzen&amp;quot;''' angegeben. Dieser '''s-Befehl''' ist in der Kombination mit [[Reguläre Ausdrücke|Regulären Ausdrücken]] sehr mächtig, ''([[#der s-Befehl|weiter unten, spezielles Kapitel]])''. Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. '''Suchen und ersetzen''' umfasst hier z.B. auch ''&amp;quot;eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen&amp;quot;''. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren, z.B.: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kleines Problem ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit '''sed''' muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von '''sed''' ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden.  Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei '''sed''' nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logik selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Problem mit '''sed''' anzugehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ganze erinnert etwas an [http://de.wikipedia.org/wiki/Assemblersprache Assembler-Programmierung], und das nicht ganz unbegründet. Die Mehrzahl der Befehle von '''sed''', sind in ihrer Funktion sehr elementar und nicht unähnlich den Operationen die in einer CPU auf Registerebene ausgeführt werden.  Der Unterschied ist: die CPU arbeitet mit Registern  einer definierten Bit Breite  und '''sed''' arbeitet mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir z.B.. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logik, in '''sed''' gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
1973 da hatten die [http://de.wikipedia.org/wiki/PDP-11 Rechner] Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet ([http://de.wikipedia.org/wiki/Geschichte_von_Unix Geschichte von Unix]).&lt;br /&gt;
&amp;lt;br&amp;gt; Terminals gab es zwar, aber der verbreitetste Weg durch einen Rechner war immer noch, von der [http://technikum29.de/de/rechnertechnik/lochkarten-edv Lochkarte] oder [http://www.pdp8.net/tu56/tu56.shtml einem Magnetband] über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie [http://web.mit.edu/multics-history/source/Multics_Internet_Server/Multics_sources.html  Multics] und [http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm nackte Logik], das gesamte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein.&lt;br /&gt;
&lt;br /&gt;
== der Aufruf und die Optionen von sed ==&lt;br /&gt;
&lt;br /&gt;
=== die Optionen ===&lt;br /&gt;
 &lt;br /&gt;
Eine Option '''-n''' steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind '''-e''' und  '''-f'''&lt;br /&gt;
&lt;br /&gt;
; sed -e REGEL:&lt;br /&gt;
hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option '''-e REGEL''' kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option '''-e''' ist nicht zwingend erforderlich, '''sed''' interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) &lt;br /&gt;
; sed -f REGELDATEI:&lt;br /&gt;
Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option ''' -f ''' an '''sed''' übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet.&lt;br /&gt;
; weitere Optionen sind abhängig von der speziellen sed-Implementierung :&lt;br /&gt;
diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der Aufruf ===&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 BEFEHL | sed -e 'REGEL' &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 sed  -n -e 'REGEL' EINGABEDATEI &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 BEFEHL | sed -f REGELDATEI | BEFEHL&lt;br /&gt;
 &lt;br /&gt;
 sed -e 'REGEL1' -f REGELDATEI -e 'REGEL2' &amp;lt;EINGABEDATEI &amp;gt;AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 VARIABLE=`BEFEHL | sed -e 'REGEL1' | sed -ne 'REGEL2' | BEFEHL ` &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -ne '&lt;br /&gt;
        BEFEHL1\&lt;br /&gt;
            Optionen zum BEFEHL1\&lt;br /&gt;
            weitere Optionen&lt;br /&gt;
        ; BEFEHL2 ; BEFEHL3\&lt;br /&gt;
             Optionen zum BEFEHL3&lt;br /&gt;
        ; BEFEHL4 ; BEFEHL5&lt;br /&gt;
 '&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sed-Programm als Script ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die '''[http://de.wikipedia.org/wiki/Shebang Magic Line''' (shebang)]&lt;br /&gt;
 #!/usr/bin/sed -f &lt;br /&gt;
(eventuell noch zusätzlich die Option '''-n''') gesetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Übergabe von Shell-Variablen an Sed-Programme ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von '''sed''' entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.&lt;br /&gt;
&lt;br /&gt;
Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann '''$Shellvariable'''. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 sed -n '&lt;br /&gt;
 '/$1/' !{&lt;br /&gt;
  	#no match - put the current line in the hold buffer&lt;br /&gt;
 	x&lt;br /&gt;
 	# delete the old one, which is &lt;br /&gt;
 	# now in the pattern buffer&lt;br /&gt;
 	d&lt;br /&gt;
 }'&lt;br /&gt;
Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;/$1/&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;!{ '''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
die roten Hochkommas lassen die Shell '''/$1/''' sehen und damit wird die Shell beim Aufruf von '''sed''' an dieser Stelle anstatt '''$1''' den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von '''sed'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Nutzung von sed in Here-Dokuments's ====&lt;br /&gt;
&lt;br /&gt;
Eine weitere häufig benutzte Aufrufmöglichkeit von '''sed''' innerhalb von Shell-Scripten ist das [http://en.wikipedia.org/wiki/Heredoc Here Document]&lt;br /&gt;
Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die '''sed''' verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
KASSE=129.32&lt;br /&gt;
WAEHRUNG=&amp;quot;EURO&amp;quot;&lt;br /&gt;
MITARBEITER=&amp;quot;Hr. Maier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sed -e 's/XXXX/'$KASSE'/g;s/YYYY/'&amp;quot;$WAEHRUNG&amp;quot;'/g;s/ZZZZ/'&amp;quot;$MITARBEITER&amp;quot;'/g' &amp;lt;&amp;lt;EOF&lt;br /&gt;
Der Bargeldbestand von XXXX YYYY wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer ZZZZ&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter '''XXXX ; YYYY ; ZZZZ ''' werden durch '''sed''' dann durch diese Werte ersetzt, die '''sed''' beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt.&lt;br /&gt;
&amp;lt;pre&amp;gt;Der Bargeldbestand von 129.32 EURO wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer Hr. Maier&amp;lt;/pre&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== die Befehle ==&lt;br /&gt;
&lt;br /&gt;
Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)&lt;br /&gt;
* p  = '''p'''rint&lt;br /&gt;
* l  = '''l'''ist&lt;br /&gt;
* i  = '''i'''insert&lt;br /&gt;
* a  = '''a'''pend&lt;br /&gt;
*usw&lt;br /&gt;
&lt;br /&gt;
zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Adressierung der Befehle ===&lt;br /&gt;
&lt;br /&gt;
Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können z.B. mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen.  Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, ( also &amp;quot;alle Anderen außer den adressierten Zeilen&amp;quot; treffen zu  )&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt&lt;br /&gt;
* gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen&lt;br /&gt;
* viele haben 2 Adressen in der Schreibweise '''Adresse1,Adresse2''' Hier handelt es sich um ein '''von Adresse1  bis zur Adresse2'''&lt;br /&gt;
* (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (z.B. '''3~4''' würde bedeuten ab Zeile 3 jede 4.Zeile) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Adressierungsmöglichkeiten unterliegen folgenden Regeln&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei&lt;br /&gt;
* Eine Adresse kann ein Regulären Ausdruck sein  '''/regex/''' entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch '''\%regex\%''' zu schreiben, wobei '''%''' ein beliebiges Zeichen ist)&lt;br /&gt;
* zwei Adressen '''Zahl1,Zahl2''' enspricht von Zeilennummer '''Zahl1''' bis Zeilennummer '''Zahl2''' bezogen auf die Eingangsdatei&lt;br /&gt;
* '''/regex1/,/regex2/''' bedeutet vom der Zeile die '''regex1''' erfüllt bis zur Zeile die '''regex2''' erfüllt &lt;br /&gt;
* Kominationen von '''Zahl,/regex/''' und '''/regex/,Zahl''' sind möglich&lt;br /&gt;
* anstatt einer Zahl das Zeichen '''$''' bedeutet die letzte Zeile&lt;br /&gt;
* Zeilenberechnungen mit Zeilennummern wie z.B. '''$-10''' (als Adresse für die letzten 10 Zeilen gemeint) geht nicht &lt;br /&gt;
* Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in '''{ }''' eingeschlossen sind und durch ''';''' voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. ''' Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen''' &lt;br /&gt;
* Das Zeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispiele für Adressierung ====&lt;br /&gt;
&lt;br /&gt;
einfache Beispiel in Kombination mit den Befehlen '''p'''rint und '''d'''elete und der Einfluss der Option '''-n'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '1,10p'          # Zeilen 1 bis 10 ausgeben&lt;br /&gt;
sed -e  '1,10p'          # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben&lt;br /&gt;
sed -e  '2d'             # 2. Zeile löschen&lt;br /&gt;
sed -e  '2,10!d'         # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -ne '2,10p'          # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -e  '10,$p'          # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben&lt;br /&gt;
sed -ne  '$p'            # letzte Zeile ausgeben&lt;br /&gt;
&lt;br /&gt;
sed -e  '/Text/d'        # Alle Zeilen die nicht &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -e  '/Text/!d'       # Alle Zeilen die &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -ne '/Text/,$!p'     # Alle Zeilen bevor eine Zeile mit &amp;quot;Text&amp;quot; kommt, ausgeben&lt;br /&gt;
sed -ne '/Begin/,/END/p' # Alle Zeilen von &amp;quot;Begin&amp;quot; bis &amp;quot;END&amp;quot; ausgeben (wird &amp;quot;END&amp;quot; nicht gefunden bis Schluss)&lt;br /&gt;
                         # Kommt nach einem &amp;quot;END&amp;quot; wieder ein &amp;quot;Begin&amp;quot; dann von dort aus wieder ausgeben &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hier jetzt mal ein paar Beispiele zur Verwendung von [http://sed.sourceforge.net/sedfaq3.html#s3.7 Charakter Klassen] und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[[:alnum:]]/!p' # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen&lt;br /&gt;
sed -ne '3~2p'             # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 )&lt;br /&gt;
sed -ne '5,/Text/p'        # Ab der 5.Zeile bis zu einer Zeile mit &amp;quot;Text&amp;quot; ausgeben&lt;br /&gt;
sed -ne '3,+7p'            # Die 3.Zeile und die 7 folgenden Zeilen ausgeben&lt;br /&gt;
sed -ne '/Begin/,+2p'      # Die Zeilen die &amp;quot;Begin&amp;quot; enthalten und jeweils die nächsten 2 Zeilen ausgeben&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[EBH]/p'               # alle Zeilen die mit &amp;quot;E&amp;quot;,&amp;quot;B&amp;quot; oder &amp;quot;H&amp;quot; beginnen ausgeben&lt;br /&gt;
sed -e  '/^$/d'                   # alle leeren Zeilen löschen&lt;br /&gt;
sed -ne '/^[^#].*/p'              # jede Zeile ausgeben, die mit einem anderem Zeichen als &amp;quot;#&amp;quot; beginnt&lt;br /&gt;
sed -ne '/^[[:space:]]*#/d'       # Zeilen deren erstes Zeichen (außer Space und Tabulator) &amp;quot;#&amp;quot; ist, löschen&lt;br /&gt;
sed -ne '/^.\{64\}/p'             # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben&lt;br /&gt;
sed -ne '/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p'&lt;br /&gt;
                                  # druckt jede Zeile in der eine IP-Adresse enthalten sein könnte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei '''sed''' noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also  bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um z.B. alle fehlerfreien Zeilen zu suchen, die einen Zeitstring  '''YYYY-MM-DD''' entsprechen wie ihn z.B. auch '''date +%F''' liefert, müsste man mit '''sed''' wie folgt adressieren. Hier mal gleich der Konsolausdruck. ;-)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # cat test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2007-13-01&lt;br /&gt;
2006-06-31&lt;br /&gt;
2008-30-02&lt;br /&gt;
2005-02-29&lt;br /&gt;
2006-11-31&lt;br /&gt;
2008-00-02&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: # sed -ne '/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p' test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: #   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei '''sed''' bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch [http://regexp-evaluator.de/evaluator/ Tools] und jede Menge gute Seiten im WWW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ein paar Regeln zu Regulären Ausdrücken in sed ====&lt;br /&gt;
&lt;br /&gt;
Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit '''sed''' und Regulären Ausdrücken mal hier einige  Regeln&amp;lt;br&amp;gt;&lt;br /&gt;
'''sed''' verwendet '''&amp;quot;Basic Regular Expressions&amp;quot;''' einige Unterschiede zu den '''&amp;quot;Erweiterten Regulären Ausdrücken&amp;quot;''' sind z.B.:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*   Die Quantifikatoren &amp;quot;'''|'''&amp;quot;, &amp;quot;'''+'''&amp;quot; und &amp;quot;'''?'''&amp;quot; sind normale Zeichen ''(GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash &amp;quot;escaped&amp;quot; werden)''&lt;br /&gt;
&lt;br /&gt;
*   die Klammern '''&amp;quot;{&amp;quot; &amp;quot;}&amp;quot; &amp;quot;(&amp;quot; ''' und ''' &amp;quot;)&amp;quot;''' sind normale Zeichen und müssen mit Backslashes &amp;quot;escaped&amp;quot; (aktiviert) werden, also als &amp;quot;'''\{'''&amp;quot; ; &amp;quot;'''\}'''&amp;quot; ; &amp;quot;'''\('''&amp;quot; und  &amp;quot;'''\)'''&amp;quot;geschrieben werden. &lt;br /&gt;
&lt;br /&gt;
*   die Zeichen, die durch &amp;quot;'''\('''&amp;quot; und &amp;quot;'''\)'''&amp;quot; eingeschlossen werden, können später mit &amp;quot;'''\1'''&amp;quot; usw. (max &amp;quot;'''\9'''&amp;quot; ) dereferenziert werden&lt;br /&gt;
&lt;br /&gt;
*   &amp;quot;'''^'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht&lt;br /&gt;
 &lt;br /&gt;
*   &amp;quot;'''$'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht&lt;br /&gt;
    &lt;br /&gt;
*   &amp;quot;'''*'''&amp;quot; ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der s-Befehl ===&lt;br /&gt;
&lt;br /&gt;
Der mit Abstand wichtigste Befehl in '''sed''', der Befehl '''&amp;quot;s///&amp;quot;'''. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit [[VIM|vi oder VIM]] beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit &amp;quot;suchen und ersetzen&amp;quot; erklärt. Die Schreibweise: &amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[ADRESSE]&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''s/'''&amp;lt;/font&amp;gt;SUCHMUSTER&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;ERSETZUNG&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;[FLAG] &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''ADRESSE''' ist der optionale Ausdruck wie er [[#Adressierung der Befehle|oben]] schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet&lt;br /&gt;
* '''FLAG''' steuert die Eigenschaften des Befehls und ist ebenfalls optional, [[#Adressierung der Befehle|Übersicht der möglichen Flags]]; ist kein Flag angegeben, gilt '''1''' ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.&lt;br /&gt;
* '''s''' ist der Befehlsname selbst&lt;br /&gt;
* '''SUCHMUSTER''' ist ein [[Reguläre Ausdrücke|Regulärer Ausdruck]] nach dem gesucht wird&lt;br /&gt;
* '''ERSETZUNG''' enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.&lt;br /&gt;
* Als Abrenzung der einzelnen Optionen sind  3 '''&amp;quot;/&amp;quot;''' Begrenzer zu setzen. ''(Bei Bedarf darf hier auch statt '''&amp;quot;/&amp;quot;''' jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf '''s''' folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen.&lt;br /&gt;
 sed -e 's/Strauch/Baum/g'&lt;br /&gt;
; Erläuterung&lt;br /&gt;
: * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet&lt;br /&gt;
: * Reguläre Suchausdruck lautet in diesem Beispiel einfach '''&amp;quot;Strauch&amp;quot;'''&lt;br /&gt;
: * Der Ersetzungtext ist '''&amp;quot;Baum&amp;quot;'''&lt;br /&gt;
: * als Flag wird '''&amp;quot;global&amp;quot;''' verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt.&lt;br /&gt;
: * da sed ohne die Option '''-n''' gestartet wurde erfolgt eine automatische Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination &amp;quot;Strauch&amp;quot; durch &amp;quot;Baum&amp;quot; ersetzt, also nicht nur das Wort Strauch selbst, sonder z.B. würde aus dem Wort &amp;quot;Strauchdieb&amp;quot; das Wort  &amp;quot;Baumdieb&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann.  &lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== die Bedeutung der Flags ====&lt;br /&gt;
&lt;br /&gt;
Mit den Flags kann die Funktion des '''s-Befehls''' gesteuert werden. Ist kein Flag angegeben gilt '''1''' ; also nur Ersetzung des ersten Vorkommens des gefunden Strings&lt;br /&gt;
&lt;br /&gt;
{| border=1&lt;br /&gt;
|+ '''Bedeutung der Flags beim s-Befehl '''&lt;br /&gt;
!  Flag   !! Bedeutung !! Beispiel   !! Bemerkung&lt;br /&gt;
|- &lt;br /&gt;
!| N     &lt;br /&gt;
|| N=Zahl (1 &amp;lt; 512) ; das N'te Vorkommen &lt;br /&gt;
!| s/AB/CD/2 &lt;br /&gt;
|| wird N nicht angegeben dann erste Vorkommen &lt;br /&gt;
|- &lt;br /&gt;
!| g     &lt;br /&gt;
|| global ;  alle Vorkommen &lt;br /&gt;
!| s/AB/CD/g &lt;br /&gt;
|| es werden alle Vorkommen ersetzt &lt;br /&gt;
|- &lt;br /&gt;
!| p     &lt;br /&gt;
|| print ; Ausgabe bei Ersetzung &lt;br /&gt;
!| s/AB/CD/p &lt;br /&gt;
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben &lt;br /&gt;
|- &lt;br /&gt;
!| w DATEI     &lt;br /&gt;
|| write DATEI bei Ersetzung &lt;br /&gt;
!| s/AB/CD/w FILE&lt;br /&gt;
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei&lt;br /&gt;
|- &lt;br /&gt;
!| i     &lt;br /&gt;
|| case-insensitive ; Groß-Kleinschreibung ignorieren &lt;br /&gt;
!| s/AB/CD/i &lt;br /&gt;
||  ist &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; zu allen SED-Implementierungen&lt;br /&gt;
|- &lt;br /&gt;
!| m    &lt;br /&gt;
|| || &lt;br /&gt;
|| betrifft Interpretation von '''^ '''und''' $''' ; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; &lt;br /&gt;
|- &lt;br /&gt;
!| x     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|-&lt;br /&gt;
!| s     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|}&lt;br /&gt;
es ist auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. z.B.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # echo &amp;quot;abcabcabc&amp;quot; | sed -ne 's/AB/CD/2ip'&lt;br /&gt;
abcCDcabc&lt;br /&gt;
LINUX: # &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== kleine Befehlsbeispiele zum Suchen und Ersetzten ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -e 's/blau\|lila/rot/2'     # Das 2.Vorkommen je Zeile von &amp;quot;blau&amp;quot; oder &amp;quot;lila&amp;quot; wird durch &amp;quot;rot&amp;quot; ersetzt&lt;br /&gt;
&lt;br /&gt;
sed -e '/^$/!s/^/#/ '           # bei alle nichtleeren Zeilen am Zeilenanfang &amp;quot;#&amp;quot; einfügen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/#.*$//'               # von einem Zeichen &amp;quot;#&amp;quot; bis zum Zeilenende alles löschen&lt;br /&gt;
&lt;br /&gt;
sed 's/^[ \t]*//;s/[ \t]*$//'   # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/Michael[^a]/Herr &amp;amp;/'  # ersetze &amp;quot;Michael&amp;quot; durch &amp;quot;Herr Michael&amp;quot; jedoch nicht wenn hinter &amp;quot;Michael&amp;quot; ein &amp;quot;a&amp;quot; folgt.&lt;br /&gt;
&lt;br /&gt;
sed -e 's/[Cc]olor/[b]&amp;amp;[\/b]/g' # jedes &amp;quot;Color&amp;quot; und &amp;quot;color&amp;quot; in &amp;quot;[b]Color[/b]&amp;quot; oder &amp;quot;[b]color[/b]&amp;quot; änderen&lt;br /&gt;
&lt;br /&gt;
date +%F | sed -e 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/'&lt;br /&gt;
                                #das Datumsformat YYYY-MM-DD umwandeln zu &amp;quot;heute ist der DD.MM. YYYY&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Besonderheiten der Beispiele'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Beispiel: es wird eine Oderverknüpfung benutzt  '''|''' muss dabei entwertet werden also '''\|'''&lt;br /&gt;
# Beispiel: Verwendung der Sonderzeichen '''^''' für Zeilenanfang und '''$''' für Zeilenende&lt;br /&gt;
# Beispiel: '''#.*$''' bedeutet Zeichen '''#''' anschließend müssen 0 oder beliebig viele beliebige Zeichen '''(.*)''' stehen, bis Zeilenende '''($)''' ; alles wird durch NICHTS ersetzt '''(//)'''&lt;br /&gt;
# Beispiel: '''[ \t]''' an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das '''&amp;quot;*&amp;quot;''' darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch '''&amp;quot;;&amp;quot;''' getrennt, beide werden hintereinander auf alle Zeilen ausgeführt. &lt;br /&gt;
# Beispiel: '''[^a]''' das '''&amp;quot;a&amp;quot;''' ist durch '''&amp;quot;^&amp;quot;''' negiert, das Bedeutet ('''nicht &amp;quot;a&amp;quot;''') an dieser Stelle, das '''&amp;quot;&amp;amp;&amp;quot;''' im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.&lt;br /&gt;
# Beispiel: Im Ersetzungsfeld steht wieder '''&amp;quot;&amp;amp;&amp;quot;''' der '''&amp;quot;/&amp;quot;''' im Ersetzungstext musste entwertet werden '''&amp;quot;\/&amp;quot;'''    &lt;br /&gt;
# Beispiel: Hier haben wir zum einem '''&amp;quot;\{ \}&amp;quot;''' mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier z.B. '''[0-9]\{4\}''' bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir '''&amp;quot;\( \)&amp;quot;''' das ist eine Gruppierung (ähnlich einer Variable)  mit '''&amp;quot;\1&amp;quot; bis &amp;quot;\9&amp;quot;''' kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus '''&amp;quot;\3 \2 \1&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Befehlsübersicht ===&lt;br /&gt;
&lt;br /&gt;
{| border=2&lt;br /&gt;
|+ '''Übersicht der Befehle und Schlüsselworte'''&lt;br /&gt;
!  Kommando   !!    Addr      !!   stdin   !!  stdout  !!  Muster Speicher !! Halte Speicher !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;;&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Trennzeichen zwischen einzelner Befehle&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;!&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{ }&amp;lt;/font&amp;gt; || 2 || - || - || - || - &lt;br /&gt;
|| umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ''';''' getrennt werden&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;#&amp;lt;/font&amp;gt;  || - || - || - || - || - &lt;br /&gt;
||Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt; MARKE || - || - || - || - || - &lt;br /&gt;
|| definiert das Sprungziel '''MARKE''' Siehe Kommandos '''b''' oder '''t'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;=&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| gibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;a&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text nach der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;b&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| Sprungbefehl zur '''MARKE''' bzw. zum Ende des Scripts&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;c&amp;lt;/font&amp;gt;  || 2 || - || X || X || - &lt;br /&gt;
|| Musterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;d&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;D&amp;lt;/font&amp;gt; || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher bis zum Zeichen „newline“ löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;g&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher wird durch den Inhalt des Haltespeicher ersetzt.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;G&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Haltespeicher wird an den Inhalt des Musterspeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;h&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Haltespeicher wird durch den Inhalt des Musterspeicher ersetzt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;H&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Musterspeicher wird an den Inhalt des Haltespeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;i&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text vor der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;l&amp;lt;/font&amp;gt;  || 1 || - || X || - || -&lt;br /&gt;
|| Musterspeicher ausgegeben. (&amp;quot;C-Notation&amp;quot; unbekannte Zeichen in Oktalformat)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;n&amp;lt;/font&amp;gt;  || 2 || X || ? || X || - &lt;br /&gt;
|| je nach Option '''-n''' wird der Buffer ausgegeben oder nicht, neue Zeile laden &lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;N&amp;lt;/font&amp;gt;  || 2 || X || - || X || - &lt;br /&gt;
|| Nächste Zeile an Inhalt des Musterspeichers angefügen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;p&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;P&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher bis zum nächsten „newline“-Zeichen ausgeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;q&amp;lt;/font&amp;gt;  || 1 || - || - || - || - &lt;br /&gt;
|| sed Beenden, bei nicht gesetzter Option '''-n''' wird Musterspeicher ausgegeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;r&amp;lt;/font&amp;gt;  FILE|| 1 || - || X || - || - &lt;br /&gt;
|| Inhalt einer angegebenen '''FILE''' wird eingelesen und ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;s&amp;lt;/font&amp;gt;/regex/rpl/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt '''regex''' durch '''rpl'''. Null oder mehrere '''flg''' wirken steuernd ein&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;t&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| bedingter Sprungbefehl zur '''MARKE''' abhängig von vorheriger '''s''' oder '''y''' Kommandos&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;w&amp;lt;/font&amp;gt;  FILE|| 2 || - || X || - || - &lt;br /&gt;
|| Schreibt Musterspeicher in '''FILE'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;x&amp;lt;/font&amp;gt;  || 2 || - || - || X || X &lt;br /&gt;
|| Inhalt von Muster- und Haltespeicher vertauschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;y&amp;lt;/font&amp;gt;/src/rpc/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt jedes Zeichen im pattern buffer welches in '''src''' vorkommt durch das entsprechenden Zeichen in '''rpc'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== kleine sed Programme am praktischen Beispiel erklärt ==&lt;br /&gt;
&lt;br /&gt;
Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten.  Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen.&lt;br /&gt;
Machen wir doch die Probe aufs Exempel: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/rpmconfigcheck'''&lt;br /&gt;
 sed -e 's/^/    /' &amp;lt; $configcheckfile&lt;br /&gt;
* einfacher s-Befehl, Eingabedatei ist der Variable '''configcheckfile''' gespeichert&lt;br /&gt;
* '''&amp;quot;^&amp;quot;''' Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/smbfs'''&lt;br /&gt;
 mountpoint=$( echo &amp;quot;$mountpoint&amp;quot;|sed &amp;quot;s/\/*$//&amp;quot;)&lt;br /&gt;
* es wird die Variable '''mountpoint''' (in der scheinbar Text steht) mit '''echo''' ausgegeben, durch '''sed''' gefiltert und die Ausgabe wieder in der Variable '''mountpoint''' gespeichert&lt;br /&gt;
* '''&amp;quot;s/\/*$//&amp;quot;''' Trennzeichen ist '''&amp;quot;/&amp;quot;''' das haben wir aber 4 Mal ;-) , Beim näheren Hinsehen ist das 2 '''&amp;quot;/&amp;quot;''' mit '''&amp;quot;\&amp;quot;''' entwertet &lt;br /&gt;
* damit lautet unsere Suchmaske ohne Quotierung &amp;quot;'''/*$'''&amp;quot; und das ist schlichtweg als letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) '''&amp;quot;/&amp;quot;''' ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren_.28Angabe_der_Anzahl_Wiederholungen.29 Quantoren]) &lt;br /&gt;
gemeint&lt;br /&gt;
* ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle '''&amp;quot;/&amp;quot;''' am Ende des Variableinhaltes abzuschneiden &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/fbset'''&lt;br /&gt;
 mode=`echo $FBSET_PARAMS | sed -e 's/^-[^ ]*//' -e 's/ -[^ ]*//g'`&lt;br /&gt;
* auch hier wird der Inhalt einer Variable durch '''sed''' gefiltert und das Ergebnis in einer anderen Variable gespeichert&lt;br /&gt;
* '''sed''' hat hier 2 Regeln wie wir an 2 mal '''-e''' und der Quotierung schnell herauslesen. &lt;br /&gt;
* die erste Regel ist ein s-Befehl, Suchmuster ist '''&amp;quot;^-[^ ]*&amp;quot;''' bedeutet Am Zeilenanfang '''&amp;quot;^&amp;quot;''' ein '''&amp;quot;-&amp;quot;''' und dann''' &amp;quot;[^ ]*&amp;quot;''' also [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Ein_Zeichen_aus_einer_Auswahl alles andere nur kein Leerzeichen] und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.&lt;br /&gt;
* die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein,  dann wird auch bis zum nächsten  Leerzeichen nach dem Strich alles gelöscht. &lt;br /&gt;
* der 2. Befehl arbeitet global, das heist es werden alle &amp;quot; -irgendwas&amp;quot; gelöscht.&lt;br /&gt;
* In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem &amp;quot;-&amp;quot; aus dem Variabelinhalt zu beseitigen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/network''' &lt;br /&gt;
 RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`&lt;br /&gt;
* der Inhalt von /etc/inittab wird durch '''sed''' gefiltert und in der Variable''' RL''' abgelegt.&lt;br /&gt;
* es ist ein s-Befehl '''-n''', also keine automatische Ausgabe,&lt;br /&gt;
*Dieses Mal ist das Begrenzungszeichen '''&amp;quot;=&amp;quot;''' da es unmittelbar nach dem '''&amp;quot;s&amp;quot;''' kommt, der Befehl hat also hier die Struktur '''s===''' und nicht wie bisher gewohnt '''s///'''&lt;br /&gt;
* als Flag haben wir ein '''&amp;quot;p&amp;quot;''', also sollte '''sed''' hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben&lt;br /&gt;
* Suchmuster: am Anfang '''&amp;quot;id:&amp;quot;''' dann kommt [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Beliebiges_Zeichen irgend ein Zeichen] das mit '''&amp;quot;\( \)&amp;quot;''' [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern gruppiert] ist, und dann geht es weiter mit '''&amp;quot;:initdefault&amp;quot;''' und anschließen alle Zeichen bis Zeilenende.&lt;br /&gt;
* Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von '''&amp;quot;\1&amp;quot;''' also dem was vom Muster in der '''\( \)''' Klammer gefunden wird ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern Rückwärtsreferenz]).&lt;br /&gt;
* Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/xdm'''&lt;br /&gt;
 /etc/X11/xdm/SuSEconfig.xdm | \&lt;br /&gt;
 sed 's+\(.*\)+/etc/init.d/xdm: \1+g' | \&lt;br /&gt;
          /bin/logger&lt;br /&gt;
&lt;br /&gt;
* nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit &amp;quot;\&amp;quot; das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.&lt;br /&gt;
* es wird ein Script '''/etc/X11/xdm/SuSEconfig.xdm''' ausgeführt und die Ausgabe durch '''sed''' mit einem s-Befehl gefiltert, diese Ausgabe wird  dem Programm '''/bin/logger''' übergeben.&lt;br /&gt;
* der s-Befehl hat hier die Struktur '''s+++''' da ein '''&amp;quot;+&amp;quot;''' unmittelbar dem '''&amp;quot;s&amp;quot;''' folgt. &lt;br /&gt;
* eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.&lt;br /&gt;
* die Suchmaske ist '''\(.*\)''' und bedeutet soviel wie gruppiert '''\( \)''' wird &amp;quot;Alles&amp;quot; (beliebiges Zeichen, 0 mal oder beliebig oft)&lt;br /&gt;
* ersetzt wird es durch &amp;quot;'''/etc/init.d/xdm: \1'''&amp;quot; , wobei '''\1''' durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.&lt;br /&gt;
* das Flag '''&amp;quot;g&amp;quot;''' ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.&lt;br /&gt;
* Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile '''&amp;quot;/etc/init.d/xdm: &amp;quot;''' einzufügen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/texi2dvi4a2ps'''&lt;br /&gt;
 BEFEHL | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;/p'&lt;br /&gt;
&lt;br /&gt;
* der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.&lt;br /&gt;
* sed wird mit '''&amp;quot;-n&amp;quot;''' gestartet, also keine automatische Ausgabe jeder Zeile&lt;br /&gt;
* der s-Befehl hat keine Adresse und normale Struktur '''s///''' , Flag ist '''&amp;quot;p&amp;quot;''' bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben. &lt;br /&gt;
* Suchmuster ist '''^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$''' ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer '''&amp;quot;\[&amp;quot;''' ; dann kommt irgendetwas oder nichts '''&amp;quot;.*&amp;quot;''' , das wird wiedermal gruppiert '''\( \)''', die Gruppe endet vor der Zeichenfolge '''&amp;quot;version &amp;quot;'''; Anschließend wird nach Zeichen im Format &amp;quot;XXXX-XX-XX&amp;quot; gesucht und irgendwas oder nichts kann bis  Zeilenende kommen.&lt;br /&gt;
* von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.&lt;br /&gt;
* ersetzt wird die gesamte Zeile durch '''&amp;quot;txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;''' die \1 \2 \3 \4  wird durch die Gruppen ersetzt.&lt;br /&gt;
* der sed-Befehl formatiert also eine &amp;quot;Versionszeile&amp;quot; neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 7  (für Fortgeschrittene) ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/autoconf'''&lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot; |&lt;br /&gt;
    sed '/^.*\/\([^/][^/]*\)\/*$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\/\)$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\).*/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          s/.*/./; q'&lt;br /&gt;
&lt;br /&gt;
* hier wird '''&amp;quot;X/&amp;quot;''' vor '''&amp;quot;$0&amp;quot;''' (also der aufgerufene Name des Scriptes) mit '''echo''' ausgegeben und an '''sed''' übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Struktur ====&lt;br /&gt;
&lt;br /&gt;
* der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.&lt;br /&gt;
 /ADRESSE1/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE2/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE3/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
           }&lt;br /&gt;
           s ; q&lt;br /&gt;
* Den sed-Befehl '''&amp;quot;q&amp;quot;''' hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option '''-n''' noch die Ausgabe des Musterspeichers veranlaßt.&lt;br /&gt;
* die Bedeutung, die  '''&amp;quot;{ }&amp;quot;'''  hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ''';''' oder '''\n''' getrennt werden)&lt;br /&gt;
* Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann '''sed''' beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schauen wir uns zuerst die s-Befehle an ====&lt;br /&gt;
&lt;br /&gt;
* die ersten 3 s-Befehle sind gleich '''&amp;quot;s//\1/&amp;quot;''' das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die '''//''' unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe '''&amp;quot;\1&amp;quot;''' beim Ersetzen zu ?&lt;br /&gt;
:: würden wir diesen Befehl auf der Konsole versuchen, '''sed 's//\1/'''' käme eine Fehlermedung, &amp;quot;fehlender Suchstring&amp;quot;&lt;br /&gt;
:: sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.&lt;br /&gt;
* der letzte s-Befehl ist einfach '''&amp;quot;s/.*/./&amp;quot;''' ersetzt alles oder nichts durch einen einzigen Punk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Adressen ====&lt;br /&gt;
 &lt;br /&gt;
* ADRESSE1: '''^.*\/\([^/][^/]*\)\/*$''' wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.&lt;br /&gt;
::gesucht und gruppiert wird &amp;quot;ein mindestens 2 Zeichen langes Wort&amp;quot; Wortbegrenzer ist &amp;quot;/&amp;quot; gefunden wird die ganze Zeile.&lt;br /&gt;
:: Achtung: hier &amp;quot;'''^.*\/'''&amp;quot; treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist.[http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gieriges_Verhalten gieriges Verhalten] '''(Greediness of RegEx)'''&lt;br /&gt;
:: gesucht wird am Zeilenanfang &amp;quot;irgendwas oder nichts bis ein '''&amp;quot;/&amp;quot;''' kommt&amp;quot; &lt;br /&gt;
::: ist in der Shellvariable eine oder mehrere '''&amp;quot;/&amp;quot;''' (also das Programm mit dem Path aufgerufen,) dann wird hier als &amp;quot;irgendwas&amp;quot; der längst mögliche String gefunden &lt;br /&gt;
:: durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der &amp;quot;Scriptname ohne den Path&amp;quot;  &lt;br /&gt;
:: dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet. &lt;br /&gt;
&lt;br /&gt;
* ADRESSE2 '''&amp;quot;^X\/\(\/\/\)$&amp;quot;''' kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.&lt;br /&gt;
:: sie sucht nach '''&amp;quot;X///&amp;quot;''' und gruppiert die letzten beiden '''&amp;quot;/&amp;quot;'''&lt;br /&gt;
:: der s-Befehl würde also '''&amp;quot;//&amp;quot;''' ausgeben und sich beenden.&lt;br /&gt;
&lt;br /&gt;
* ADRESSE3 '''&amp;quot;^X\/\(\/\).*&amp;quot;''' (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem '''&amp;quot;/&amp;quot;''' weniger würde auch fündig werden bei vielen aneinandergereihten '''&amp;quot;/&amp;quot;''' und gibt nur ein '''&amp;quot;/&amp;quot;''' aus&lt;br /&gt;
&lt;br /&gt;
* Treffen keine der 3 Adressen zu, z.B. weil '''&amp;quot;$0&amp;quot;''' leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Da ist noch ein kleiner Trick im Script versteckt ====&lt;br /&gt;
&lt;br /&gt;
Damit bei einer Leeren &amp;quot;$0&amp;quot; das sed-Programm überhaupt arbeiten kann, wird als Trick &lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot;&lt;br /&gt;
benutzt. Das vorangestellte '''&amp;quot;X/&amp;quot;''' wird beim Ersetzten innerhalb von '''sed''' jedesmal wieder entfernt, aber es sichert bei leeren '''$0''' eine ordnungsgemäße Funktion des Programms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Das Ergebnis des gesamten sed-Programms ====&lt;br /&gt;
&lt;br /&gt;
Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable '''$0''' und ist entweder der '''&amp;quot;Scriptname ohne Path&amp;quot; ; &amp;quot;//&amp;quot; ; &amp;quot;/&amp;quot;  oder &amp;quot;.&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.grymoire.com/Unix/Sed.html An Introduction and Tutorial]&lt;br /&gt;
* [http://www.tty1.net/sed-tutorium_de.html sed-Tutorium-de]&lt;br /&gt;
* [http://sed.sourceforge.net/sedfaq.html THE SED FAQ]&lt;br /&gt;
* [http://sed.sourceforge.net/#tools Hilfreiche Tools für Sed-Programmierung]&lt;br /&gt;
* [http://www.gnu.org/software/sed/manual/ GNU sed user's manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;!-- ~~~~ --&amp;gt;&lt;br /&gt;
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]&lt;br /&gt;
[[Kategorie:Konsole]][[Kategorie:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Shellscripte&amp;diff=33053</id>
		<title>Shellscripte</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Shellscripte&amp;diff=33053"/>
		<updated>2019-06-10T11:16:33Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* kleinere Hilfsscripte */ warum auch immer das skript versenkt wurde&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Scripte]]&lt;br /&gt;
[[Category:Shellscripte]]&lt;br /&gt;
= Shellscripte =&lt;br /&gt;
== Startscripte ==&lt;br /&gt;
#[[NDISwrapper Startscript]] - NDISwrapper Startscript für openSUSE&lt;br /&gt;
#[[LCDd Startscript fuer lcdproc unter openSUSE]]&lt;br /&gt;
#[[Lcdproc Startscript zur Nutzung des LCDd unter openSUSE]]&lt;br /&gt;
#[[Bootscript zum Einbinden von dm-crypt/LUKS-Partitionen unter openSUSE]]&lt;br /&gt;
#[[Startscript für ddclient unter SUSE/openSUSE]]&lt;br /&gt;
#[[Init-Script fuer hostapd unter openSUSE]]&lt;br /&gt;
&lt;br /&gt;
== kleinere Hilfsscripte ==&lt;br /&gt;
#[[ TeamSpeak und Gamesound]]&lt;br /&gt;
#[[ Videoconverterscript]]&lt;br /&gt;
#[[ Kleines Script zu Hylafax]]&lt;br /&gt;
#[[Kleines script zur Erstellung einer preferences Datei]] - Kleines Script zur Erstellung einer preferences Datei für Apt&lt;br /&gt;
#[[Apt cache aufraeumen|Aufräumscript für den Apt-Cache]]&lt;br /&gt;
#[[Policy-Skript zum durchsuchen aller gwdg-Repositorys]] - Apt-Policy-Skript zum durchsuchen aller gwdg-Repositorys&lt;br /&gt;
#[[Wie erstelle ich ein virtuelles RPM Paket]]&lt;br /&gt;
#[[Benutzerverwaltung per Script]] - Script zum anlegen/löschen eines Benutzers&lt;br /&gt;
#[[Backup Script]] - Script zur Archivierung&lt;br /&gt;
#[[Home Laufwerk sichern]] - Script zum sichern des Home Laufwerks auf einen Server (mit rsync über ssh)&lt;br /&gt;
#[[Backupdate.sh]] - Ein weiteres Backup-Script&lt;br /&gt;
#[[Screenshots von WM/DM/Konsole]] - Ein Script um Screenshots vom Windowmanager, Displaymanager oder der Konsole zu erstellen&lt;br /&gt;
#[[Dateien mithilfe einer Playlist sortieren]]&lt;br /&gt;
#[[Online.sh|Internet Verbindung nach Zwangstrennung vom Provider automatisch wiederaufbauen]]&lt;br /&gt;
#[[SuSE entrümpeln - mindestens 100 MB zurückgewinnen]]&lt;br /&gt;
#[[OCR]] Anleitung und [https://linux-club.de/wiki/mediawiki/index.php?title=OCR&amp;amp;oldid=28051 Script für Texterkennung mit Xsane]&lt;br /&gt;
#[[ batched-trim.sh | Batched TRIM für SSD´s ]]&lt;br /&gt;
&lt;br /&gt;
== komplexere Hilfsscripte ==&lt;br /&gt;
#[[Firewall Beispielscript]]&lt;br /&gt;
#[[animiertes DVD-Menu]]&lt;br /&gt;
&lt;br /&gt;
== Programmierbeispielsscripte ==&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Online.sh&amp;diff=33052</id>
		<title>Online.sh</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Online.sh&amp;diff=33052"/>
		<updated>2019-06-10T10:23:16Z</updated>

		<summary type="html">&lt;p&gt;Itu: siehe disk , sowieso nur einmal benutzt - bräuchte keine variable sein.      .... und obsolete reste sollte man immer rasch rausschmeissen, die vermiesen die erfassbarkeit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dies Script ist mal im Forum entstanden, damit es nicht verlorengeht stelle ich es hier mal ein. Das ganze muss über einen [[Cron]]Job laufen. Dieser wird so eingestellt, dass das Script alle 5 Minuten ausgeführt wird, und so eine permanenten Verbindung zum Internet herstellt.  Da man alle 24 Stunden der Provider eine Zwangstrennung vornimmt, ist man so maximal einmal am Tag für max. 5 Minuten nicht Online. &lt;br /&gt;
&lt;br /&gt;
Der CronJob lässt sich am einfachsten über [[KCron]] einstellen.&lt;br /&gt;
&lt;br /&gt;
{{Box Test||&lt;br /&gt;
* [[openSUSE]] 10.3&lt;br /&gt;
* [[openSUSE]] 10.2&lt;br /&gt;
* SUSE Linux 10.0&lt;br /&gt;
* SUSE Linux 9.3&lt;br /&gt;
* SUSE Linux 9.2&lt;br /&gt;
* SUSE Linux 9.1&lt;br /&gt;
* SUSE Linux 9.0&lt;br /&gt;
* [[Ubuntu]] 6.10&lt;br /&gt;
* [[Debian]] 4.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# Quelle : https://linux-club.de/wiki/opensuse/Online.sh&lt;br /&gt;
# &lt;br /&gt;
#######################################################&lt;br /&gt;
# VARIABLEN&lt;br /&gt;
#######################################################&lt;br /&gt;
&lt;br /&gt;
datei=~/log/internetstatus.log&lt;br /&gt;
pingtarget=8.8.8.8    # google nameserver vermutlich lange existent und pingbar &lt;br /&gt;
count=3&lt;br /&gt;
&lt;br /&gt;
#######################################################&lt;br /&gt;
# Wiedereinwählen bei ping-fail&lt;br /&gt;
####################################################### &lt;br /&gt;
&lt;br /&gt;
/bin/ping -c $count -w 20 $pingtarget &amp;gt; /dev/null 2&amp;gt;&amp;amp;1  # eventuell -w auch als Variable&lt;br /&gt;
retc=$?&lt;br /&gt;
if [ $retc -eq 0 ]   # ping hat Kontakt&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;Wir sind online&amp;quot; &amp;gt;&amp;gt; $datei    # Umleitung, da sonst mail&lt;br /&gt;
elif [ $retc -eq 1 ]             # ping hat keinen Kontakt&lt;br /&gt;
then&lt;br /&gt;
  echo `date -R` Neueinwahl &amp;gt;&amp;gt; $datei&lt;br /&gt;
  cinternet -i dsl0 -H&lt;br /&gt;
  cinternet -i dsl0 -O&lt;br /&gt;
  sleep 30&lt;br /&gt;
  cinternet -i dsl0 -A&lt;br /&gt;
  cinternet -i dsl0 -D&lt;br /&gt;
  cinternet -i dsl0 -s&lt;br /&gt;
  cinternet -i dsl0 -l&lt;br /&gt;
  echo `date -R` Eingewählt &amp;gt;&amp;gt; $datei&lt;br /&gt;
else   # ping hat harten Fehler&lt;br /&gt;
  echo &amp;quot;Konnte ping nicht ausführen. Fehler $retc!&amp;quot; &amp;gt;&amp;gt; $datei&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen und weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* http://www.linux-club.de/viewtopic.php?t=24372&amp;amp;start=0&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;highlight=&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
[[Category:Scripte]]&lt;br /&gt;
[[Kategorie:Hilfsprogramme und Tools]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Online.sh&amp;diff=33051</id>
		<title>Online.sh</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Online.sh&amp;diff=33051"/>
		<updated>2019-06-10T09:59:47Z</updated>

		<summary type="html">&lt;p&gt;Itu: da nicht jeder yehudi heisst ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dies Script ist mal im Forum entstanden, damit es nicht verlorengeht stelle ich es hier mal ein. Das ganze muss über einen [[Cron]]Job laufen. Dieser wird so eingestellt, dass das Script alle 5 Minuten ausgeführt wird, und so eine permanenten Verbindung zum Internet herstellt.  Da man alle 24 Stunden der Provider eine Zwangstrennung vornimmt, ist man so maximal einmal am Tag für max. 5 Minuten nicht Online. &lt;br /&gt;
&lt;br /&gt;
Der CronJob lässt sich am einfachsten über [[KCron]] einstellen.&lt;br /&gt;
&lt;br /&gt;
{{Box Test||&lt;br /&gt;
* [[openSUSE]] 10.3&lt;br /&gt;
* [[openSUSE]] 10.2&lt;br /&gt;
* SUSE Linux 10.0&lt;br /&gt;
* SUSE Linux 9.3&lt;br /&gt;
* SUSE Linux 9.2&lt;br /&gt;
* SUSE Linux 9.1&lt;br /&gt;
* SUSE Linux 9.0&lt;br /&gt;
* [[Ubuntu]] 6.10&lt;br /&gt;
* [[Debian]] 4.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/sh&lt;br /&gt;
#######################################################&lt;br /&gt;
# VARIABLEN&lt;br /&gt;
#######################################################&lt;br /&gt;
&lt;br /&gt;
datei=~/log/internetstatus.log&lt;br /&gt;
#logdat=~/log/on.log&lt;br /&gt;
host=8.8.8.8    # google nameserver vermutlich lange existent und pingbar &lt;br /&gt;
count=3&lt;br /&gt;
&lt;br /&gt;
#######################################################&lt;br /&gt;
# Wieder online pingen&lt;br /&gt;
####################################################### &lt;br /&gt;
&lt;br /&gt;
/bin/ping -c $count -w 20 $host &amp;gt; /dev/null 2&amp;gt;&amp;amp;1  # eventuell -w auch als Variable&lt;br /&gt;
retc=$?&lt;br /&gt;
if [ $retc -eq 0 ]   # ping hat Kontakt&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;Wir sind online&amp;quot; &amp;gt;&amp;gt; $datei    # Umleitung, da sonst mail&lt;br /&gt;
elif [ $retc -eq 1 ]             # ping hat keinen Kontakt&lt;br /&gt;
then&lt;br /&gt;
  echo `date -R` Neueinwahl &amp;gt;&amp;gt; $datei&lt;br /&gt;
  cinternet -i dsl0 -H&lt;br /&gt;
  cinternet -i dsl0 -O&lt;br /&gt;
  sleep 30&lt;br /&gt;
  cinternet -i dsl0 -A&lt;br /&gt;
  cinternet -i dsl0 -D&lt;br /&gt;
  cinternet -i dsl0 -s&lt;br /&gt;
  cinternet -i dsl0 -l&lt;br /&gt;
  echo `date -R` Eingewählt &amp;gt;&amp;gt; $datei&lt;br /&gt;
else   # ping hat harten Fehler&lt;br /&gt;
  echo &amp;quot;Konnte ping nicht ausführen. Fehler $retc!&amp;quot; &amp;gt;&amp;gt; $datei&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen und weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* http://www.linux-club.de/viewtopic.php?t=24372&amp;amp;start=0&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;highlight=&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
[[Category:Scripte]]&lt;br /&gt;
[[Kategorie:Hilfsprogramme und Tools]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33050</id>
		<title>Benutzerverwaltung per Script</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33050"/>
		<updated>2019-06-09T19:56:11Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bash-script zum anlegen/löschen eines Benutzers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Benutzerverwaltung&lt;br /&gt;
#&lt;br /&gt;
# Quelle: https://linux-club.de/wiki/opensuse/Benutzerverwaltung_per_Script &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
if [ ! ${UID} = &amp;quot;0&amp;quot; ]; then  echo &amp;quot;Keine Berechtigung!&amp;quot; ;  exit 0 ; fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Benutzerverwaltung&amp;quot;&lt;br /&gt;
echo &amp;quot;  Was möchten Sie tun?&amp;quot;&lt;br /&gt;
echo &amp;quot;  Benutzer - &amp;quot;&lt;br /&gt;
echo &amp;quot;   (A)nlegen &amp;quot;&lt;br /&gt;
echo &amp;quot;   (L)öschen &amp;quot; &lt;br /&gt;
read action&lt;br /&gt;
&lt;br /&gt;
case $action in&lt;br /&gt;
 a|A)&lt;br /&gt;
  read                  -ep &amp;quot;Name des Benutzers : &amp;quot;  name&lt;br /&gt;
  read -i &amp;quot;/home/$name&amp;quot; -ep &amp;quot;Homeverzeichnis    : &amp;quot;  homeVz&lt;br /&gt;
  read -i &amp;quot;cdrom&amp;quot;       -ep &amp;quot;Gruppen?           : &amp;quot;  groups &lt;br /&gt;
&lt;br /&gt;
  useradd -m -d $homeVz -G $groups $name   &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich angelegt!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  passwd $name&lt;br /&gt;
     ;; &lt;br /&gt;
 l|L)&lt;br /&gt;
  echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
  read name&lt;br /&gt;
  userdel $name                            &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
  rm -rf /home/$name                       &amp;amp;&amp;amp; echo &amp;quot;Das Verzeichnis /home/$name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
     ;;&lt;br /&gt;
  *) &lt;br /&gt;
   echo &amp;quot;Keine verfügbare Option ausgewählt: &amp;quot; $action &lt;br /&gt;
     ;;  &lt;br /&gt;
     &lt;br /&gt;
esac&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
by buli&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Konsole]][[Category:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33049</id>
		<title>Benutzerverwaltung per Script</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33049"/>
		<updated>2019-06-09T19:54:19Z</updated>

		<summary type="html">&lt;p&gt;Itu: so ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sh-script zum anlegen/löschen eines Benutzers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Benutzerverwaltung&lt;br /&gt;
#&lt;br /&gt;
# Quelle: https://linux-club.de/wiki/opensuse/Benutzerverwaltung_per_Script &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
if [ ! ${UID} = &amp;quot;0&amp;quot; ]; then  echo &amp;quot;Keine Berechtigung!&amp;quot; ;  exit 0 ; fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Benutzerverwaltung&amp;quot;&lt;br /&gt;
echo &amp;quot;  Was möchten Sie tun?&amp;quot;&lt;br /&gt;
echo &amp;quot;  Benutzer - &amp;quot;&lt;br /&gt;
echo &amp;quot;   (A)nlegen &amp;quot;&lt;br /&gt;
echo &amp;quot;   (L)öschen &amp;quot; &lt;br /&gt;
read action&lt;br /&gt;
&lt;br /&gt;
case $action in&lt;br /&gt;
 a|A)&lt;br /&gt;
  read                  -ep &amp;quot;Name des Benutzers : &amp;quot;  name&lt;br /&gt;
  read -i &amp;quot;/home/$name&amp;quot; -ep &amp;quot;Homeverzeichnis    : &amp;quot;  homeVz&lt;br /&gt;
  read -i &amp;quot;cdrom&amp;quot;       -ep &amp;quot;Gruppen?           : &amp;quot;  groups &lt;br /&gt;
&lt;br /&gt;
  useradd -m -d $homeVz -G $groups $name   &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich angelegt!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  passwd $name&lt;br /&gt;
     ;; &lt;br /&gt;
 l|L)&lt;br /&gt;
  echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
  read name&lt;br /&gt;
  userdel $name                            &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
  rm -rf /home/$name                       &amp;amp;&amp;amp; echo &amp;quot;Das Verzeichnis /home/$name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
     ;;&lt;br /&gt;
  *) &lt;br /&gt;
   echo &amp;quot;Keine verfügbare Option ausgewählt: &amp;quot; $action &lt;br /&gt;
     ;;  &lt;br /&gt;
     &lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
by buli&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Konsole]][[Category:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33048</id>
		<title>Benutzerverwaltung per Script</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33048"/>
		<updated>2019-06-09T19:31:19Z</updated>

		<summary type="html">&lt;p&gt;Itu: statt  rm -vrf  was viele zeilen ausspucken kann  ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sh-script zum anlegen/löschen eines Benutzers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Benutzerverwaltung&lt;br /&gt;
#&lt;br /&gt;
# Quelle: https://linux-club.de/wiki/opensuse/Benutzerverwaltung_per_Script &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
if [ ! ${UID} = &amp;quot;0&amp;quot; ]; then  echo &amp;quot;Keine Berechtigung!&amp;quot; ;  exit 0 ; fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Benutzerverwaltung&amp;quot;&lt;br /&gt;
echo &amp;quot;  Was möchten Sie tun?&amp;quot;&lt;br /&gt;
echo &amp;quot;  Benutzer - &amp;quot;&lt;br /&gt;
echo &amp;quot;   [a]nlegen &amp;quot;&lt;br /&gt;
echo &amp;quot;   [l]öschen &amp;quot; &lt;br /&gt;
read action&lt;br /&gt;
&lt;br /&gt;
if [ $action = &amp;quot;a&amp;quot; ]; then&lt;br /&gt;
  read                  -ep &amp;quot;Name des Benutzers : &amp;quot;  name&lt;br /&gt;
  read -i &amp;quot;/home/$name&amp;quot; -ep &amp;quot;Homeverzeichnis    : &amp;quot;  homeVz&lt;br /&gt;
  read -i &amp;quot;cdrom&amp;quot;       -ep &amp;quot;Gruppen?           : &amp;quot;  groups &lt;br /&gt;
&lt;br /&gt;
  useradd -m -d $homeVz -G $groups $name   &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich angelegt!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  passwd $name&lt;br /&gt;
&lt;br /&gt;
 else&lt;br /&gt;
  if [ $action = &amp;quot;l&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
    read name&lt;br /&gt;
    userdel $name                          &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
    rm -rf /home/$name                     &amp;amp;&amp;amp; echo &amp;quot;Das Verzeichnis /home/$name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
by buli&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Konsole]][[Category:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33047</id>
		<title>Benutzerverwaltung per Script</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33047"/>
		<updated>2019-06-09T19:22:55Z</updated>

		<summary type="html">&lt;p&gt;Itu: sinnvolle Verbesserung , dazu auf bash umgestellt ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sh-script zum anlegen/löschen eines Benutzers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Benutzerverwaltung&lt;br /&gt;
#&lt;br /&gt;
# Quelle: https://linux-club.de/wiki/opensuse/Benutzerverwaltung_per_Script &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
if [ ! ${UID} = &amp;quot;0&amp;quot; ]; then  echo &amp;quot;Keine Berechtigung!&amp;quot; ;  exit 0 ; fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Benutzerverwaltung&amp;quot;&lt;br /&gt;
echo &amp;quot;  Was möchten Sie tun?&amp;quot;&lt;br /&gt;
echo &amp;quot;  Benutzer - &amp;quot;&lt;br /&gt;
echo &amp;quot;   [a]nlegen &amp;quot;&lt;br /&gt;
echo &amp;quot;   [l]öschen &amp;quot; &lt;br /&gt;
read action&lt;br /&gt;
&lt;br /&gt;
if [ $action = &amp;quot;a&amp;quot; ]; then&lt;br /&gt;
  read                  -ep &amp;quot;Name des Benutzers : &amp;quot;  name&lt;br /&gt;
  read -i &amp;quot;/home/$name&amp;quot; -ep &amp;quot;Homeverzeichnis    : &amp;quot;  homeVz&lt;br /&gt;
  read -i &amp;quot;cdrom&amp;quot;       -ep &amp;quot;Gruppen?           : &amp;quot;  groups &lt;br /&gt;
&lt;br /&gt;
  useradd -m -d $homeVz -G $groups $name   &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich angelegt!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  passwd $name&lt;br /&gt;
&lt;br /&gt;
 else&lt;br /&gt;
  if [ $action = &amp;quot;l&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
    read name&lt;br /&gt;
    userdel $name                          &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
    rm -rf /home/$name &lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
by buli&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Konsole]][[Category:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33046</id>
		<title>Benutzerverwaltung per Script</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33046"/>
		<updated>2019-06-09T18:26:17Z</updated>

		<summary type="html">&lt;p&gt;Itu: verbessert ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sh-script zum anlegen/löschen eines Benutzers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# Benutzerverwaltung&lt;br /&gt;
#&lt;br /&gt;
if [ ${UID} != &amp;quot;0&amp;quot; ]; then  echo &amp;quot;Keine Berechtigung!&amp;quot; ;  exit 0 ; fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Benutzerverwaltung&amp;quot;&lt;br /&gt;
echo &amp;quot;  Was möchten Sie tun?&amp;quot;&lt;br /&gt;
echo &amp;quot;  Benutzer - &amp;quot;&lt;br /&gt;
echo &amp;quot;   [a]nlegen &amp;quot;&lt;br /&gt;
echo &amp;quot;   [l]öschen &amp;quot; &lt;br /&gt;
read action&lt;br /&gt;
&lt;br /&gt;
if [ $action = &amp;quot;a&amp;quot; ]; then&lt;br /&gt;
  echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
  read name&lt;br /&gt;
  echo &amp;quot;Homeverzeichnis:&amp;quot;&lt;br /&gt;
  read -e -i &amp;quot;/home/$name&amp;quot; home&lt;br /&gt;
  echo &amp;quot;Gruppen:&amp;quot;&lt;br /&gt;
  read groups &lt;br /&gt;
  useradd -m -d $home -G $groups $name   &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich angelegt!&amp;quot;&lt;br /&gt;
  passwd $name&lt;br /&gt;
 else&lt;br /&gt;
  if [ $action = &amp;quot;l&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
    read name&lt;br /&gt;
    userdel $name                        &amp;amp;&amp;amp; echo &amp;quot;Der Benutzer $name wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
    rm -rf /home/$name &lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
by buli&lt;br /&gt;
&lt;br /&gt;
[[Konsole]]&lt;br /&gt;
[[Category:Konsole]][[Category:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33045</id>
		<title>Benutzerverwaltung per Script</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzerverwaltung_per_Script&amp;diff=33045"/>
		<updated>2019-06-09T18:07:13Z</updated>

		<summary type="html">&lt;p&gt;Itu: bissl einrücken is nicht ganz verkehrt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sh-script zum anlegen/löschen eines Benutzers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# Benutzerverwaltung&lt;br /&gt;
#&lt;br /&gt;
if [ ${UID} != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
  echo &amp;quot;Keine Berechtigung!&amp;quot;&lt;br /&gt;
  exit 0;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Benutzerverwaltung&amp;quot;&lt;br /&gt;
echo &amp;quot;Was möchten Sie tun?&amp;quot;&lt;br /&gt;
echo -n &amp;quot;Benuter [a]nlegen? Benutzer [l]öschen?&amp;quot; &lt;br /&gt;
read user&lt;br /&gt;
&lt;br /&gt;
if [ $user = &amp;quot;a&amp;quot; ]; then&lt;br /&gt;
  echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
  read name&lt;br /&gt;
  echo &amp;quot;Homeverzeichnis:&amp;quot;&lt;br /&gt;
  read home&lt;br /&gt;
  echo &amp;quot;Gruppen:&amp;quot;&lt;br /&gt;
  read groups &lt;br /&gt;
  useradd -m -d $home -G $groups $name&lt;br /&gt;
  passwd $name&lt;br /&gt;
  echo &amp;quot;Der Benutzer wurde erfolgreich angelegt!&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
  if [ $user = &amp;quot;l&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Name des Benutzers:&amp;quot;&lt;br /&gt;
    read name2&lt;br /&gt;
    userdel $name2&lt;br /&gt;
    rm -rf /home/$name2&lt;br /&gt;
    echo &amp;quot;Der Benutzer wurde erfolgreich gelöscht!&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
by buli&lt;br /&gt;
&lt;br /&gt;
[[Konsole]]&lt;br /&gt;
[[Category:Konsole]][[Category:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Screenshots_von_WM/DM/Konsole&amp;diff=33044</id>
		<title>Screenshots von WM/DM/Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Screenshots_von_WM/DM/Konsole&amp;diff=33044"/>
		<updated>2019-06-09T16:32:27Z</updated>

		<summary type="html">&lt;p&gt;Itu: das sollte schon verraten werden ........&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''[[Shellscripte]]'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ein Script um Screenshots vom Windowmanager, Displaymanager oder der Konsole zu erstellen. Eine Kurzversion des Scriptes mit Verwendung von Tastaturkomandos steht bei den [[Screenshots#Script für Screenshots|Screenshots]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Das Script wird wie folgt aufgerufen:&lt;br /&gt;
&amp;lt;pre&amp;gt;/pfad/zu/x-shot [OPTIONEN]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Optionen==&lt;br /&gt;
&amp;lt;pre&amp;gt;-d | --dir /home/user/screenshots&lt;br /&gt;
&lt;br /&gt;
     Pfad unter dem die Screenshots gespeichert werden.&lt;br /&gt;
     Ein Unterordner (Jahr-Monat-Tag - z.B. 2007-03-12) wird automatisch angelegt.&lt;br /&gt;
&lt;br /&gt;
-e | --ext [jpg | png | ...]&lt;br /&gt;
&lt;br /&gt;
     Format des Bildschirmphotos.&lt;br /&gt;
     Grundsätzlich sollten alle Formate, die von ImageMagick (import / convert) unterstützt werden, erlaubt sein - getestet wurden aber nur jpg und png.&lt;br /&gt;
     Ausnahme: Modus console - da fbgrab nur PNGs ausgibt, wird das Format automatisch auf png gesetzt.&lt;br /&gt;
&lt;br /&gt;
-w | --wait &amp;lt;num&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     Verzögerung bis zur Aufname des Bildschirmphotos&lt;br /&gt;
&lt;br /&gt;
-q | --quality &amp;lt;num&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     Qualität des Bildschirmphotos.&lt;br /&gt;
     Von 0 = schlechteste bis 100 = beste Qualität.&lt;br /&gt;
     Je nach Qualität ändert sich natürlich auch die Größe der Bilddatei (hohe Qualität = große Datei | schlechte Qualität = kleine Datei).&lt;br /&gt;
&lt;br /&gt;
-m | --modus [screen | area | window | dm | console]&lt;br /&gt;
&lt;br /&gt;
     Modus des Screenshots:&lt;br /&gt;
&lt;br /&gt;
      console = Screenshot mit fbgrab aus der Konsole.&lt;br /&gt;
&lt;br /&gt;
      dm = Screenshot des X-Servers mit xwd aus der Konsole.&lt;br /&gt;
           Um z.B. einen Screenshot von Displaymanager zu machen.&lt;br /&gt;
&lt;br /&gt;
      area = Screenshot eines Bildschirm-Bereichs.&lt;br /&gt;
             Auswahlrechteck mit der Maus aufziehen.&lt;br /&gt;
&lt;br /&gt;
      window = Screenshot eines Fensters.&lt;br /&gt;
               Auswahl mit Mausklick.&lt;br /&gt;
&lt;br /&gt;
      screen = Screenshot des gesamten Bildschirms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Defaultwerte (wenn das Script ohne Parameter aufgerufen wird):&lt;br /&gt;
&lt;br /&gt;
Verzeichnis: '''Homeverzeichnis''' (des jeweiligen Users)&lt;br /&gt;
&lt;br /&gt;
Format: '''JPEG'''&lt;br /&gt;
&lt;br /&gt;
Qualität: '''75%'''&lt;br /&gt;
&lt;br /&gt;
Verzögerung: '''Keine (0)'''&lt;br /&gt;
&lt;br /&gt;
Modus: '''Kompletter Bildschirn (screen)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Box Installation||&lt;br /&gt;
*'''import''' und '''convert''' (ImageMagick)&lt;br /&gt;
*'''xwd'''&lt;br /&gt;
*'''fbgrab'''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
################################################################################&lt;br /&gt;
# Filename:      /usr/local/bin/x-shot&lt;br /&gt;
# Purpose:       screenshot script&lt;br /&gt;
# License:       This file is licensed under the Creative Commons&lt;br /&gt;
################################################################################&lt;br /&gt;
ARGV=&amp;quot;$@&amp;quot;&lt;br /&gt;
PRGNAME=$(basename $0)&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;${HOME}&amp;quot;;&lt;br /&gt;
EXT=&amp;quot;jpg&amp;quot;; # jpeg png&lt;br /&gt;
WAIT=&amp;quot;0&amp;quot;;&lt;br /&gt;
QUALITY=&amp;quot;75&amp;quot;; # 0-100&lt;br /&gt;
MODUS=&amp;quot;screen&amp;quot;; # area window dm console&lt;br /&gt;
&lt;br /&gt;
MAGICK=`which import 2&amp;gt; /dev/null`;&lt;br /&gt;
XWD=`which xwd 2&amp;gt; /dev/null`;&lt;br /&gt;
FBGRAB=`which fbgrab 2&amp;gt; /dev/null`;&lt;br /&gt;
SLEEP=`which sleep 2&amp;gt; /dev/null`;&lt;br /&gt;
CHVT=`which chvt 2&amp;gt; /dev/null`;&lt;br /&gt;
DATE=`date &amp;quot;+%Y-%m-%d&amp;quot;`;&lt;br /&gt;
FILE=`date &amp;quot;+%Y%m%d_%H%M&amp;quot;`;&lt;br /&gt;
&lt;br /&gt;
##########################################################################&lt;br /&gt;
&lt;br /&gt;
if [ $# -gt 0 ]; then&lt;br /&gt;
&lt;br /&gt;
  set -- $ARGV;&lt;br /&gt;
  OPT=&amp;quot;ext:,dir:,quality:,wait:,modus:&amp;quot;;&lt;br /&gt;
  TEMP=$(getopt --options=e:d:q:w:m: --long $OPT -n $PRGNAME -- &amp;quot;$@&amp;quot;);&lt;br /&gt;
  if [ $? -ne 0 ]; then&lt;br /&gt;
    echo &amp;quot;Exiting...&amp;quot; &amp;gt;&amp;amp;2;&lt;br /&gt;
    exit 100;&lt;br /&gt;
  fi;&lt;br /&gt;
&lt;br /&gt;
  eval set -- &amp;quot;$TEMP&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  while true; do&lt;br /&gt;
    case $1 in&lt;br /&gt;
      --ext|-e)  if [ $MODUS == &amp;quot;console&amp;quot; ]; then EXT=&amp;quot;png&amp;quot;; else EXT=&amp;quot;$2&amp;quot;; fi; shift; ;;&lt;br /&gt;
      --dir|-d)  DIR=&amp;quot;$2&amp;quot;; shift; ;;&lt;br /&gt;
      --quality|-q)  QUALITY=&amp;quot;$2&amp;quot;; shift; ;;&lt;br /&gt;
      --wait|-w)  WAIT=&amp;quot;$2&amp;quot;; shift; ;;&lt;br /&gt;
      --modus|-m)&lt;br /&gt;
        MODUS=&amp;quot;$2&amp;quot;;&lt;br /&gt;
        case $MODUS in&lt;br /&gt;
          area|window|screen)  PREF=&amp;quot;wm&amp;quot;; ;;&lt;br /&gt;
          dm)    PREF=&amp;quot;dm&amp;quot;; ;;&lt;br /&gt;
          console)  PREF=&amp;quot;console&amp;quot;; ;;&lt;br /&gt;
        esac;&lt;br /&gt;
        shift; ;;&lt;br /&gt;
      --) break;;&lt;br /&gt;
      *) echo &amp;quot;Unknow argument \&amp;quot;$1\&amp;quot;!&amp;quot;; exit 100;;&lt;br /&gt;
    esac;&lt;br /&gt;
    shift;&lt;br /&gt;
  done;&lt;br /&gt;
&lt;br /&gt;
fi;&lt;br /&gt;
&lt;br /&gt;
[ ! -d &amp;quot;${DIR}/${DATE}&amp;quot; ] &amp;amp;&amp;amp; (mkdir -p &amp;quot;${DIR}/${DATE}&amp;quot; || (echo -e &amp;quot;Cannot create directory ${DIR}/${DATE}!\nExiting ...&amp;quot;; exit 1;));&lt;br /&gt;
&lt;br /&gt;
if [ -e &amp;quot;${DIR}/${DATE}/${PREF}_${FILE}.${EXT}&amp;quot; ]; then x=0;&lt;br /&gt;
  while [ -e &amp;quot;${DIR}/${DATE}/${PREF}_${FILE}-$x.${EXT}&amp;quot; ];&lt;br /&gt;
    do x=`expr $x + 1`; done; SCREEN=&amp;quot;${FILE}-$x.${EXT}&amp;quot;;&lt;br /&gt;
 else SCREEN=&amp;quot;${FILE}.${EXT}&amp;quot;;&lt;br /&gt;
fi;&lt;br /&gt;
&lt;br /&gt;
case $MODUS in&lt;br /&gt;
  screen)&lt;br /&gt;
    if [ -z &amp;quot;$MAGICK&amp;quot; ]; then&lt;br /&gt;
      echo -e &amp;quot;import (ImageMagick) not found!\nExiting ...&amp;quot;; exit 1;&lt;br /&gt;
     else&lt;br /&gt;
       [ &amp;quot;$WAIT&amp;quot; -gt 0 ] &amp;amp;&amp;amp; &amp;quot;$SLEEP&amp;quot; &amp;quot;$WAIT&amp;quot;;&lt;br /&gt;
       &amp;quot;$MAGICK&amp;quot; -quiet -silent -quality &amp;quot;$QUALITY&amp;quot; -window root &amp;quot;${DIR}/${DATE}/${PREF}_${SCREEN}&amp;quot;;&lt;br /&gt;
    fi;&lt;br /&gt;
    ;;&lt;br /&gt;
  area|window)&lt;br /&gt;
    if [ -z &amp;quot;$MAGICK&amp;quot; ]; then&lt;br /&gt;
      echo -e &amp;quot;import (ImageMagick) not found!\nExiting ...&amp;quot;; exit 1;&lt;br /&gt;
     else&lt;br /&gt;
       [ &amp;quot;$WAIT&amp;quot; -gt 0 ] &amp;amp;&amp;amp; &amp;quot;$SLEEP&amp;quot; &amp;quot;$WAIT&amp;quot;;&lt;br /&gt;
       &amp;quot;$MAGICK&amp;quot; -quiet -silent -quality &amp;quot;$QUALITY&amp;quot; &amp;quot;${DIR}/${DATE}/${PREF}_${SCREEN}&amp;quot;;&lt;br /&gt;
    fi;&lt;br /&gt;
    ;;&lt;br /&gt;
  dm)&lt;br /&gt;
    if [ -z &amp;quot;$XWD&amp;quot; ]; then&lt;br /&gt;
      echo -e &amp;quot;xwd not found!\nExiting ...&amp;quot;; exit 1;&lt;br /&gt;
     else&lt;br /&gt;
       &amp;quot;$CHVT&amp;quot; 7; &amp;quot;$([ &amp;quot;$WAIT&amp;quot; -gt 0 ] &amp;amp;&amp;amp; echo -n &amp;quot;$SLEEP $WAIT&amp;quot;)&amp;quot;; XAUTHORITY=&amp;quot;$(ps ax | grep '[-]auth' | awk '{print $NF}')&amp;quot;; &amp;quot;$XWD&amp;quot; -display :0 -root | convert - &amp;quot;$EXT&amp;quot;:&amp;quot;${DIR}/${DATE}/${PREF}_${SCREEN}&amp;quot;;&lt;br /&gt;
    fi;&lt;br /&gt;
    ;;&lt;br /&gt;
  console)&lt;br /&gt;
    if [ -z &amp;quot;$XWD&amp;quot; ]; then&lt;br /&gt;
      echo -e &amp;quot;fbgrab not found!\nExiting ...&amp;quot;; exit 1;&lt;br /&gt;
     else&lt;br /&gt;
       &amp;quot;$FBGRAB&amp;quot; -s &amp;quot;$([ &amp;quot;$WAIT&amp;quot; -gt 0 ] &amp;amp;&amp;amp; echo -n &amp;quot;$WAIT&amp;quot;)&amp;quot; &amp;quot;${DIR}/${DATE}/${PREF}_${SCREEN}&amp;quot;;&lt;br /&gt;
    fi;&lt;br /&gt;
    ;;&lt;br /&gt;
  *)&lt;br /&gt;
    echo -e &amp;quot;No or unknown mode specified.\nExiting ...&amp;quot;; exit 1;&lt;br /&gt;
esac;&lt;br /&gt;
&lt;br /&gt;
echo &lt;br /&gt;
echo Screenshot saved as &amp;quot;${DIR}/${DATE}/${PREF}_${SCREEN}&amp;quot; &lt;br /&gt;
echo &lt;br /&gt;
&lt;br /&gt;
# End of file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Shellscripte|Zurück zu den Shellscripten]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Grafik|Zurück zur Grafik]]&lt;br /&gt;
[[Kategorie:Scripte]]&lt;br /&gt;
[[Kategorie:Grafik]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Backup_Script&amp;diff=33043</id>
		<title>Backup Script</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Backup_Script&amp;diff=33043"/>
		<updated>2019-06-09T16:03:51Z</updated>

		<summary type="html">&lt;p&gt;Itu: ....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sh-script zur Archivierung von Verzeichnissen&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 #&lt;br /&gt;
 # Backup&lt;br /&gt;
 #&lt;br /&gt;
 echo -n &amp;quot;Welches Verzeichnis soll archiviert werden?&amp;quot;&lt;br /&gt;
 read Verz&lt;br /&gt;
 tar -czvf $Verz.tar.gz $Verz   &amp;amp;&amp;amp; echo &amp;quot;Das Verzeichnis wurde erfolgreich archiviert!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
by buli&lt;br /&gt;
----&lt;br /&gt;
[[Backup|Back To Backup]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Shellscripte|Zurück zur Shellscripteübersicht]]&lt;br /&gt;
[[Category:Security]][[Category:Backup]][[Kategorie:Scripte]]&lt;br /&gt;
[[Category:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33042</id>
		<title>Sed</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33042"/>
		<updated>2019-06-06T07:37:35Z</updated>

		<summary type="html">&lt;p&gt;Itu: sed s/ogig/ogik/g  | sed 's/zB/z.B./g'  | sed s/rogrammes/rogramms/g&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SED  - eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist sed und was kann sed ? ==&lt;br /&gt;
&lt;br /&gt;
[http://linux.die.net/man/1/sed sed] ('''S'''tream-'''ED'''itor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist '''sed''' nicht. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem &amp;quot;programmiertem Rezept&amp;quot; welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren '''Text-Bearbeitungs-Filter''', mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sed wurde 1973/74 von [http://senseis.xmp.net/?McMahon Lee E. McMahon] entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf [[Reguläre Ausdrücke|Regulären Ausdrücken]] auf und umfasst nur wenige [[#Befehlsübersicht|Befehle]]. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von '''sed''' sind der Zeileneditor [http://linux.die.net/man/1/ed ed] (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor '''[[VIM|vi]]'''.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''sed''' erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. &lt;br /&gt;
  sed 's/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g'&lt;br /&gt;
Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache.&lt;br /&gt;
Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von [[awk]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit '''sed''' schon durchsichtiger, und wer sich öfter und intensiver mit '''sed''' beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit '''sed''' die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit '''sed''' programmiert. In diesem [http://sed.sourceforge.net/grabbag/scripts/ SED Script Archiv] sind einige solcher Programme zu finden. Weitere [http://sed.sourceforge.net/#scripts sed-scripte] und weitere [http://sed.sourceforge.net/#gamez Spiele ] gibt es auf  [http://sed.sourceforge.net/ einer der wichtigsten SED-Seiten] (Web-Seiten geschrieben übrigens mit ? : [http://sed.sourceforge.net/local/scripts/sedindex2html.sed.html natürlich mit sed] ;-))) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Heute gibt es eine Vielzahl von [http://sed.sourceforge.net/sedfaq2.html#s2.2 '''sed''' Implementierungen für die unterschiedlichsten Betriebssysteme] die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der [http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke Regulären Ausdrücke], da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges [http://www.gnu.org/software/sed/manual/ GNUsed] das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Für was benötigen wir sed heute ? ===&lt;br /&gt;
&lt;br /&gt;
Mit '''sed''' lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.&lt;br /&gt;
&lt;br /&gt;
Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist '''sed''' oftmals ein sehr hilfreiches Tool.&lt;br /&gt;
Darüber hinaus kann man '''sed''' überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:&lt;br /&gt;
&lt;br /&gt;
* Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);&lt;br /&gt;
* Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen&lt;br /&gt;
* das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien&lt;br /&gt;
&lt;br /&gt;
Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird '''sed''' interessant. Mit dem Stream Editor lassen sich eine Vielzahl von [http://sed.sourceforge.net/local/docs/emulating_unix.txt Standardkommandos von UNIX simulieren]. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal '''sed''' als die Lösung für solche Problemfälle finden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um '''sed''' finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf '''sed''' zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell '''sed''' als die kleine elegante Lösung die beste Option. &lt;br /&gt;
&lt;br /&gt;
Für viele kleine Dinge ist '''sed''' durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist '''awk''' (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte '''sed''' auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.&lt;br /&gt;
&lt;br /&gt;
== das Funktionsprinzip ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip von '''sed''' ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnisprobleme beim Schreiben oder Interpretieren von sed-Programmen.&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von '''sed''' werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt '''sed''' den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der '''Zeilenzähler''' wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''sed''' hat einen Textbuffer den sogenannten '''Musterspeicher''', dieser ist beim Starten des Programms leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diesen Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Grundverhalten, dass '''sed''' jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von '''sed''' verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was '''sed''' denn ausgeben soll, wir müssen also  &amp;quot;Print-Befehle&amp;quot; benutzen. Die Option bei Aufruf von '''sed''' dazu ist &amp;quot;'''-n'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option '''-n''' die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option '''-n''' so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programms benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programms von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, nicht selten  &amp;lt;!-- mit?bei --&amp;gt; Option '''-n''' ;-))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== was beinhaltet sed und was kann man damit machen ===&lt;br /&gt;
&lt;br /&gt;
Neben dem '''Musterspeicher''' gibt es noch einen 2. Textbuffer, den sogenannten '''Haltespeicher'''. Auch dieser ist beim Start des Programms leer. In ihm könnte man jetzt z.B. den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige [[#Befehlsübersicht| '''sed''' Kommandos]] mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher durch Haltespeicher ersetzen &lt;br /&gt;
*  Haltespeicher durch Musterspeicher ersetzen&lt;br /&gt;
*  Inhalt von Halte- und Musterspeicher tauschen&lt;br /&gt;
*  Inhalt von Musterspeicher an den Haltespeicher anhängen &lt;br /&gt;
*  Inhalt von Haltespeicher an den Musterspeicher anhängen&lt;br /&gt;
'''Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden.''' Er dient nur zum Zwischenspeichern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und was geht jetzt mit dem Musterspeicher?&amp;lt;br&amp;gt;&lt;br /&gt;
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht z.B.:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher löschen&lt;br /&gt;
*  die nächste Zeile einlesen&lt;br /&gt;
*  die nächste Zeile hinten hinzufügen&lt;br /&gt;
*  Musterspeicher nach stdout ausgeben&lt;br /&gt;
*  Inhalte mit dem Haltespeicher austauschen&lt;br /&gt;
*  den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben&lt;br /&gt;
*  oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben&lt;br /&gt;
*  den Musterspeicher in eine Datei schreiben&lt;br /&gt;
*  Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht  &lt;br /&gt;
*  einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl [http://linux.die.net/man/1/tr tr])&lt;br /&gt;
*  und das Wichtigste, '''innerhalb des Musterspeichers suchen und ersetzen'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Variablen ?&lt;br /&gt;
: außer dem Haltespeicher und der Variable in der '''sed''' automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts&amp;lt;br&amp;gt;&lt;br /&gt;
; Schleifen ?&lt;br /&gt;
: gibt es auch keine, aber es gibt 2 '''Sprungbefehle''', ähnlich wie '''GOTO-Befehle''' und natürlich einen vorzeitigen Programmabbruch&amp;lt;br&amp;gt; &lt;br /&gt;
Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man '''sed''' schon sogut wie komplett erklärt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wie kann man damit Probleme lösen ===&lt;br /&gt;
&lt;br /&gt;
Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?&lt;br /&gt;
&lt;br /&gt;
Der Befehl, der den Hauptteil der Arbeit innerhalb von '''sed''' leistet, ist oben nur als '''&amp;quot;suchen und ersetzen&amp;quot;''' angegeben. Dieser '''s-Befehl''' ist in der Kombination mit [[Reguläre Ausdrücke|Regulären Ausdrücken]] sehr mächtig, ''([[#der s-Befehl|weiter unten, spezielles Kapitel]])''. Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. '''Suchen und ersetzen''' umfasst hier z.B. auch ''&amp;quot;eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen&amp;quot;''. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren, z.B.: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kleines Problem ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit '''sed''' muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von '''sed''' ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden.  Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei '''sed''' nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logik selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Problem mit '''sed''' anzugehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ganze erinnert etwas an [http://de.wikipedia.org/wiki/Assemblersprache Assembler-Programmierung], und das nicht ganz unbegründet. Die Mehrzahl der Befehle von '''sed''', sind in ihrer Funktion sehr elementar und nicht unähnlich den Operationen die in einer CPU auf Registerebene ausgeführt werden.  Der Unterschied ist: die CPU arbeitet mit Registern  einer definierten Bit Breite  und '''sed''' arbeitet mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir z.B.. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logik, in '''sed''' gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
1973 da hatten die [http://de.wikipedia.org/wiki/PDP-11 Rechner] Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet ([http://de.wikipedia.org/wiki/Geschichte_von_Unix Geschichte von Unix]).&lt;br /&gt;
&amp;lt;br&amp;gt; Terminals gab es zwar, aber der verbreitetste Weg durch einen Rechner war immer noch, von der [http://technikum29.de/de/rechnertechnik/lochkarten-edv Lochkarte] oder [http://www.pdp8.net/tu56/tu56.shtml einem Magnetband] über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie [http://web.mit.edu/multics-history/source/Multics_Internet_Server/Multics_sources.html  Multics] und [http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm nackte Logik], das gesamte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein.&lt;br /&gt;
&lt;br /&gt;
== der Aufruf und die Optionen von sed ==&lt;br /&gt;
&lt;br /&gt;
=== die Optionen ===&lt;br /&gt;
 &lt;br /&gt;
Eine Option '''-n''' steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind '''-e''' und  '''-f'''&lt;br /&gt;
&lt;br /&gt;
; sed -e REGEL:&lt;br /&gt;
hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option '''-e REGEL''' kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option '''-e''' ist nicht zwingend erforderlich, '''sed''' interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) &lt;br /&gt;
; sed -f REGELDATEI:&lt;br /&gt;
Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option ''' -f ''' an '''sed''' übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet.&lt;br /&gt;
; weitere Optionen sind abhängig von der speziellen sed-Implementierung :&lt;br /&gt;
diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der Aufruf ===&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 BEFEHL | sed -e 'REGEL' &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 sed  -n -e 'REGEL' EINGABEDATEI &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 BEFEHL | sed -f REGELDATEI | BEFEHL&lt;br /&gt;
 &lt;br /&gt;
 sed -e 'REGEL1' -f REGELDATEI -e 'REGEL2' &amp;lt;EINGABEDATEI &amp;gt;AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 VARIABLE=`BEFEHL | sed -e 'REGEL1' | sed -ne 'REGEL2' | BEFEHL ` &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -ne '&lt;br /&gt;
        BEFEHL1\&lt;br /&gt;
            Optionen zum BEFEHL1\&lt;br /&gt;
            weitere Optionen&lt;br /&gt;
        ; BEFEHL2 ; BEFEHL3\&lt;br /&gt;
             Optionen zum BEFEHL3&lt;br /&gt;
        ; BEFEHL4 ; BEFEHL5&lt;br /&gt;
 '&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sed-Programm als Script ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die '''[http://de.wikipedia.org/wiki/Shebang Magic Line''' (shebang)]&lt;br /&gt;
 #!/usr/bin/sed -f &lt;br /&gt;
(eventuell noch zusätzlich die Option '''-n''') gesetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Übergabe von Shell-Variablen an Sed-Programme ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von '''sed''' entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.&lt;br /&gt;
&lt;br /&gt;
Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann '''$Shellvariable'''. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 sed -n '&lt;br /&gt;
 '/$1/' !{&lt;br /&gt;
  	#no match - put the current line in the hold buffer&lt;br /&gt;
 	x&lt;br /&gt;
 	# delete the old one, which is &lt;br /&gt;
 	# now in the pattern buffer&lt;br /&gt;
 	d&lt;br /&gt;
 }'&lt;br /&gt;
Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;/$1/&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;!{ '''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
die roten Hochkommas lassen die Shell '''/$1/''' sehen und damit wird die Shell beim Aufruf von '''sed''' an dieser Stelle anstatt '''$1''' den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von '''sed'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Nutzung von sed in Here-Dokuments's ====&lt;br /&gt;
&lt;br /&gt;
Eine weitere häufig benutzte Aufrufmöglichkeit von '''sed''' innerhalb von Shell-Scripten ist das [http://en.wikipedia.org/wiki/Heredoc Here Document]&lt;br /&gt;
Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die '''sed''' verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
KASSE=129.32&lt;br /&gt;
WAEHRUNG=&amp;quot;EURO&amp;quot;&lt;br /&gt;
MITARBEITER=&amp;quot;Hr. Maier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sed -e 's/XXXX/'$KASSE'/g;s/YYYY/'&amp;quot;$WAEHRUNG&amp;quot;'/g;s/ZZZZ/'&amp;quot;$MITARBEITER&amp;quot;'/g' &amp;lt;&amp;lt;EOF&lt;br /&gt;
Der Bargeldbestand von XXXX YYYY wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer ZZZZ&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter '''XXXX ; YYYY ; ZZZZ ''' werden durch '''sed''' dann durch diese Werte ersetzt, die '''sed''' beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt.&lt;br /&gt;
&amp;lt;pre&amp;gt;Der Bargeldbestand von 129.32 EURO wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer Hr. Maier&amp;lt;/pre&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== die Befehle ==&lt;br /&gt;
&lt;br /&gt;
Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)&lt;br /&gt;
* p  = '''p'''rint&lt;br /&gt;
* l  = '''l'''ist&lt;br /&gt;
* i  = '''i'''insert&lt;br /&gt;
* a  = '''a'''pend&lt;br /&gt;
*usw&lt;br /&gt;
&lt;br /&gt;
zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Adressierung der Befehle ===&lt;br /&gt;
&lt;br /&gt;
Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können z.B. mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen.  Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, ( also &amp;quot;alle Anderen außer den adressierten Zeilen&amp;quot; treffen zu  )&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt&lt;br /&gt;
* gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen&lt;br /&gt;
* viele haben 2 Adressen in der Schreibweise '''Adresse1,Adresse2''' Hier handelt es sich um ein '''von Adresse1  bis zur Adresse2'''&lt;br /&gt;
* (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (z.B. '''3~4''' würde bedeuten ab Zeile 3 jede 4.Zeile) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Adressierungsmöglichkeiten unterliegen folgenden Regeln&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei&lt;br /&gt;
* Eine Adresse kann ein Regulären Ausdruck sein  '''/regex/''' entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch '''\%regex\%''' zu schreiben, wobei '''%''' ein beliebiges Zeichen ist)&lt;br /&gt;
* zwei Adressen '''Zahl1,Zahl2''' enspricht von Zeilennummer '''Zahl1''' bis Zeilennummer '''Zahl2''' bezogen auf die Eingangsdatei&lt;br /&gt;
* '''/regex1/,/regex2/''' bedeutet vom der Zeile die '''regex1''' erfüllt bis zur Zeile die '''regex2''' erfüllt &lt;br /&gt;
* Kominationen von '''Zahl,/regex/''' und '''/regex/,Zahl''' sind möglich&lt;br /&gt;
* anstatt einer Zahl das Zeichen '''$''' bedeutet die letzte Zeile&lt;br /&gt;
* Zeilenberechnungen mit Zeilennummern wie z.B. '''$-10''' (als Adresse für die letzten 10 Zeilen gemeint) geht nicht &lt;br /&gt;
* Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in '''{ }''' eingeschlossen sind und durch ''';''' voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. ''' Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen''' &lt;br /&gt;
* Das Zeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispiele für Adressierung ====&lt;br /&gt;
&lt;br /&gt;
einfache Beispiel in Kombination mit den Befehlen '''p'''rint und '''d'''elete und der Einfluss der Option '''-n'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '1,10p'          # Zeilen 1 bis 10 ausgeben&lt;br /&gt;
sed -e  '1,10p'          # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben&lt;br /&gt;
sed -e  '2d'             # 2. Zeile löschen&lt;br /&gt;
sed -e  '2,10!d'         # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -ne '2,10p'          # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -e  '10,$p'          # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben&lt;br /&gt;
sed -ne  '$p'            # letzte Zeile ausgeben&lt;br /&gt;
&lt;br /&gt;
sed -e  '/Text/d'        # Alle Zeilen die nicht &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -e  '/Text/!d'       # Alle Zeilen die &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -ne '/Text/,$!p'     # Alle Zeilen bevor eine Zeile mit &amp;quot;Text&amp;quot; kommt, ausgeben&lt;br /&gt;
sed -ne '/Begin/,/END/p' # Alle Zeilen von &amp;quot;Begin&amp;quot; bis &amp;quot;END&amp;quot; ausgeben (wird &amp;quot;END&amp;quot; nicht gefunden bis Schluss)&lt;br /&gt;
                         # Kommt nach einem &amp;quot;END&amp;quot; wieder ein &amp;quot;Begin&amp;quot; dann von dort aus wieder ausgeben &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hier jetzt mal ein paar Beispiele zur Verwendung von [http://sed.sourceforge.net/sedfaq3.html#s3.7 Charakter Klassen] und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[[:alnum:]]/!p' # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen&lt;br /&gt;
sed -ne '3~2p'             # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 )&lt;br /&gt;
sed -ne '5,/Text/p'        # Ab der 5.Zeile bis zu einer Zeile mit &amp;quot;Text&amp;quot; ausgeben&lt;br /&gt;
sed -ne '3,+7p'            # Die 3.Zeile und die 7 folgenden Zeilen ausgeben&lt;br /&gt;
sed -ne '/Begin/,+2p'      # Die Zeilen die &amp;quot;Begin&amp;quot; enthalten und jeweils die nächsten 2 Zeilen ausgeben&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[EBH]/p'               # alle Zeilen die mit &amp;quot;E&amp;quot;,&amp;quot;B&amp;quot; oder &amp;quot;H&amp;quot; beginnen ausgeben&lt;br /&gt;
sed -e  '/^$/d'                   # alle leeren Zeilen löschen&lt;br /&gt;
sed -ne '/^[^#].*/p'              # jede Zeile ausgeben, die mit einem anderem Zeichen als &amp;quot;#&amp;quot; beginnt&lt;br /&gt;
sed -ne '/^[[:space:]]*#/d'       # Zeilen deren erstes Zeichen (außer Space und Tabulator) &amp;quot;#&amp;quot; ist, löschen&lt;br /&gt;
sed -ne '/^.\{64\}/p'             # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben&lt;br /&gt;
sed -ne '/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p'&lt;br /&gt;
                                  # druckt jede Zeile in der eine IP-Adresse enthalten sein könnte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei '''sed''' noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also  bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um z.B. alle fehlerfreien Zeilen zu suchen, die einen Zeitstring  '''YYYY-MM-DD''' entsprechen wie ihn z.B. auch '''date +%F''' liefert, müsste man mit '''sed''' wie folgt adressieren. Hier mal gleich der Konsolausdruck. ;-)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # cat test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2007-13-01&lt;br /&gt;
2006-06-31&lt;br /&gt;
2008-30-02&lt;br /&gt;
2005-02-29&lt;br /&gt;
2006-11-31&lt;br /&gt;
2008-00-02&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: # sed -ne '/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p' test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: #   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei '''sed''' bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch [http://regexp-evaluator.de/evaluator/ Tools] und jede Menge gute Seiten im WWW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ein paar Regeln zu Regulären Ausdrücken in sed ====&lt;br /&gt;
&lt;br /&gt;
Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit '''sed''' und Regulären Ausdrücken mal hier einige  Regeln&amp;lt;br&amp;gt;&lt;br /&gt;
'''sed''' verwendet '''&amp;quot;Basic Regular Expressions&amp;quot;''' einige Unterschiede zu den '''&amp;quot;Erweiterten Regulären Ausdrücken&amp;quot;''' sind z.B.:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*   Die Quantifikatoren &amp;quot;'''|'''&amp;quot;, &amp;quot;'''+'''&amp;quot; und &amp;quot;'''?'''&amp;quot; sind normale Zeichen ''(GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash &amp;quot;escaped&amp;quot; werden)''&lt;br /&gt;
&lt;br /&gt;
*   die Klammern '''&amp;quot;{&amp;quot; &amp;quot;}&amp;quot; &amp;quot;(&amp;quot; ''' und ''' &amp;quot;)&amp;quot;''' sind normale Zeichen und müssen mit Backslashes &amp;quot;escaped&amp;quot; (aktiviert) werden, also als &amp;quot;'''\{'''&amp;quot; ; &amp;quot;'''\}'''&amp;quot; ; &amp;quot;'''\('''&amp;quot; und  &amp;quot;'''\)'''&amp;quot;geschrieben werden. &lt;br /&gt;
&lt;br /&gt;
*   die Zeichen, die durch &amp;quot;'''\('''&amp;quot; und &amp;quot;'''\)'''&amp;quot; eingeschlossen werden, können später mit &amp;quot;'''\1'''&amp;quot; usw. (max &amp;quot;'''\9'''&amp;quot; ) dereferenziert werden&lt;br /&gt;
&lt;br /&gt;
*   &amp;quot;'''^'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht&lt;br /&gt;
 &lt;br /&gt;
*   &amp;quot;'''$'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht&lt;br /&gt;
    &lt;br /&gt;
*   &amp;quot;'''*'''&amp;quot; ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der s-Befehl ===&lt;br /&gt;
&lt;br /&gt;
Der mit Abstand wichtigste Befehl in '''sed''', der Befehl '''&amp;quot;s///&amp;quot;'''. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit [[VIM|vi oder VIM]] beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit &amp;quot;suchen und ersetzen&amp;quot; erklärt. Die Schreibweise: &amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[ADRESSE]&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''s/'''&amp;lt;/font&amp;gt;SUCHMUSTER&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;ERSETZUNG&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;[FLAG] &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''ADRESSE''' ist der optionale Ausdruck wie er [[#Adressierung der Befehle|oben]] schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet&lt;br /&gt;
* '''FLAG''' steuert die Eigenschaften des Befehls und ist ebenfalls optional, [[#Adressierung der Befehle|Übersicht der möglichen Flags]]; ist kein Flag angegeben, gilt '''1''' ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.&lt;br /&gt;
* '''s''' ist der Befehlsname selbst&lt;br /&gt;
* '''SUCHMUSTER''' ist ein [[Reguläre Ausdrücke|Regulärer Ausdruck]] nach dem gesucht wird&lt;br /&gt;
* '''ERSETZUNG''' enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.&lt;br /&gt;
* Als Abrenzung der einzelnen Optionen sind  3 '''&amp;quot;/&amp;quot;''' Begrenzer zu setzen. ''(Bei Bedarf darf hier auch statt '''&amp;quot;/&amp;quot;''' jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf '''s''' folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen.&lt;br /&gt;
 sed -e 's/Strauch/Baum/g'&lt;br /&gt;
; Erläuterung&lt;br /&gt;
: * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet&lt;br /&gt;
: * Reguläre Suchausdruck lautet in diesem Beispiel einfach '''&amp;quot;Strauch&amp;quot;'''&lt;br /&gt;
: * Der Ersetzungtext ist '''&amp;quot;Baum&amp;quot;'''&lt;br /&gt;
: * als Flag wird '''&amp;quot;global&amp;quot;''' verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt.&lt;br /&gt;
: * da sed ohne die Option '''-n''' gestartet wurde erfolgt eine automatische Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination &amp;quot;Stauch&amp;quot; durch &amp;quot;Baum&amp;quot; ersetzt, also nicht nur das Wort Strauch selbst, sonder z.B. würde aus dem Wort &amp;quot;Strauchdieb&amp;quot; das Wort  &amp;quot;Baumdieb&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann.  &lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== die Bedeutung der Flags ====&lt;br /&gt;
&lt;br /&gt;
Mit den Flags kann die Funktion des '''s-Befehls''' gesteuert werden. Ist kein Flag angegeben gilt '''1''' ; also nur Ersetzung des ersten Vorkommens des gefunden Strings&lt;br /&gt;
&lt;br /&gt;
{| border=1&lt;br /&gt;
|+ '''Bedeutung der Flags beim s-Befehl '''&lt;br /&gt;
!  Flag   !! Bedeutung !! Beispiel   !! Bemerkung&lt;br /&gt;
|- &lt;br /&gt;
!| N     &lt;br /&gt;
|| N=Zahl (1 &amp;lt; 512) ; das N'te Vorkommen &lt;br /&gt;
!| s/AB/CD/2 &lt;br /&gt;
|| wird N nicht angegeben dann erste Vorkommen &lt;br /&gt;
|- &lt;br /&gt;
!| g     &lt;br /&gt;
|| global ;  alle Vorkommen &lt;br /&gt;
!| s/AB/CD/g &lt;br /&gt;
|| es werden alle Vorkommen ersetzt &lt;br /&gt;
|- &lt;br /&gt;
!| p     &lt;br /&gt;
|| print ; Ausgabe bei Ersetzung &lt;br /&gt;
!| s/AB/CD/p &lt;br /&gt;
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben &lt;br /&gt;
|- &lt;br /&gt;
!| w DATEI     &lt;br /&gt;
|| write DATEI bei Ersetzung &lt;br /&gt;
!| s/AB/CD/w FILE&lt;br /&gt;
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei&lt;br /&gt;
|- &lt;br /&gt;
!| i     &lt;br /&gt;
|| case-insensitive ; Groß-Kleinschreibung ignorieren &lt;br /&gt;
!| s/AB/CD/i &lt;br /&gt;
|| ist &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; zu allen SED-Implementierung&lt;br /&gt;
|- &lt;br /&gt;
!| m    &lt;br /&gt;
|| || &lt;br /&gt;
|| betrifft Interpretation von '''^ '''und''' $''' ; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; &lt;br /&gt;
|- &lt;br /&gt;
!| x     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|-&lt;br /&gt;
!| s     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|}&lt;br /&gt;
es sind auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. z.B.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # echo &amp;quot;abcabcabc&amp;quot; | sed -ne 's/AB/CD/2ip'&lt;br /&gt;
abcCDcabc&lt;br /&gt;
LINUX: # &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== kleine Befehlsbeispiele zum Suchen und Ersetzten ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -e 's/blau\|lila/rot/2'     # Das 2.Vorkommen je Zeile von &amp;quot;blau&amp;quot; oder &amp;quot;lila&amp;quot; wird durch &amp;quot;rot&amp;quot; ersetzt&lt;br /&gt;
&lt;br /&gt;
sed -e '/^$/!s/^/#/ '           # bei alle nichtleeren Zeilen am Zeilenanfang &amp;quot;#&amp;quot; einfügen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/#.*$//'               # von einem Zeichen &amp;quot;#&amp;quot; bis zum Zeilenende alles löschen&lt;br /&gt;
&lt;br /&gt;
sed 's/^[ \t]*//;s/[ \t]*$//'   # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/Michael[^a]/Herr &amp;amp;/'  # ersetze &amp;quot;Michael&amp;quot; durch &amp;quot;Herr Michael&amp;quot; jedoch nicht wenn hinter &amp;quot;Michael&amp;quot; ein &amp;quot;a&amp;quot; folgt.&lt;br /&gt;
&lt;br /&gt;
sed -e 's/[Cc]olor/[b]&amp;amp;[\/b]/g' # jedes &amp;quot;Color&amp;quot; und &amp;quot;color&amp;quot; in &amp;quot;[b]Color[/b]&amp;quot; oder &amp;quot;[b]color[/b]&amp;quot; änderen&lt;br /&gt;
&lt;br /&gt;
date +%F | sed -e 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/'&lt;br /&gt;
                                #das Datumsformat YYYY-MM-DD umwandeln zu &amp;quot;heute ist der DD.MM. YYYY&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Besonderheiten der Beispiele'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Beispiel: es wird eine Oderverknüpfung benutzt  '''|''' muss dabei entwertet werden also '''\|'''&lt;br /&gt;
# Beispiel: Verwendung der Sonderzeichen '''^''' für Zeilenanfang und '''$''' für Zeilenende&lt;br /&gt;
# Beispiel: '''#.*$''' bedeutet Zeichen '''#''' anschließend müssen 0 oder beliebig viele beliebige Zeichen '''(.*)''' stehen, bis Zeilenende '''($)''' ; alles wird durch NICHTS ersetzt '''(//)'''&lt;br /&gt;
# Beispiel: '''[ \t]''' an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das '''&amp;quot;*&amp;quot;''' darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch '''&amp;quot;;&amp;quot;''' getrennt, beide werden hintereinander auf alle Zeilen ausgeführt. &lt;br /&gt;
# Beispiel: '''[^a]''' das '''&amp;quot;a&amp;quot;''' ist durch '''&amp;quot;^&amp;quot;''' negiert, das Bedeutet ('''nicht &amp;quot;a&amp;quot;''') an dieser Stelle, das '''&amp;quot;&amp;amp;&amp;quot;''' im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.&lt;br /&gt;
# Beispiel: Im Ersetzungsfeld steht wieder '''&amp;quot;&amp;amp;&amp;quot;''' der '''&amp;quot;/&amp;quot;''' im Ersetzungstext musste entwertet werden '''&amp;quot;\/&amp;quot;'''    &lt;br /&gt;
# Beispiel: Hier haben wir zum einem '''&amp;quot;\{ \}&amp;quot;''' mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier z.B. '''[0-9]\{4\}''' bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir '''&amp;quot;\( \)&amp;quot;''' das ist eine Gruppierung (ähnlich einer Variable)  mit '''&amp;quot;\1&amp;quot; bis &amp;quot;\9&amp;quot;''' kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus '''&amp;quot;\3 \2 \1&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Befehlsübersicht ===&lt;br /&gt;
&lt;br /&gt;
{| border=2&lt;br /&gt;
|+ '''Übersicht der Befehle und Schlüsselworte'''&lt;br /&gt;
!  Kommando   !!    Addr      !!   stdin   !!  stdout  !!  Muster Speicher !! Halte Speicher !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;;&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Trennzeichen zwischen einzelner Befehle&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;!&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{ }&amp;lt;/font&amp;gt; || 2 || - || - || - || - &lt;br /&gt;
|| umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ''';''' getrennt werden&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;#&amp;lt;/font&amp;gt;  || - || - || - || - || - &lt;br /&gt;
||Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt; MARKE || - || - || - || - || - &lt;br /&gt;
|| definiert das Sprungziel '''MARKE''' Siehe Kommandos '''b''' oder '''t'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;=&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| gibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;a&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text nach der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;b&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| Sprungbefehl zur '''MARKE''' bzw. zum Ende des Scripts&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;c&amp;lt;/font&amp;gt;  || 2 || - || X || X || - &lt;br /&gt;
|| Musterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;d&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;D&amp;lt;/font&amp;gt; || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher bis zum Zeichen „newline“ löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;g&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher wird durch den Inhalt des Haltespeicher ersetzt.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;G&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Haltespeicher wird an den Inhalt des Musterspeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;h&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Haltespeicher wird durch den Inhalt des Musterspeicher ersetzt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;H&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Musterspeicher wird an den Inhalt des Haltespeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;i&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text vor der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;l&amp;lt;/font&amp;gt;  || 1 || - || X || - || -&lt;br /&gt;
|| Musterspeicher ausgegeben. (&amp;quot;C-Notation&amp;quot; unbekannte Zeichen in Oktalformat)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;n&amp;lt;/font&amp;gt;  || 2 || X || ? || X || - &lt;br /&gt;
|| je nach Option '''-n''' wird der Buffer ausgegeben oder nicht, neue Zeile laden &lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;N&amp;lt;/font&amp;gt;  || 2 || X || - || X || - &lt;br /&gt;
|| Nächste Zeile an Inhalt des Musterspeichers angefügen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;p&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;P&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher bis zum nächsten „newline“-Zeichen ausgeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;q&amp;lt;/font&amp;gt;  || 1 || - || - || - || - &lt;br /&gt;
|| sed Beenden, bei nicht gesetzter Option '''-n''' wird Musterspeicher ausgegeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;r&amp;lt;/font&amp;gt;  FILE|| 1 || - || X || - || - &lt;br /&gt;
|| Inhalt einer angegebenen '''FILE''' wird eingelesen und ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;s&amp;lt;/font&amp;gt;/regex/rpl/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt '''regex''' durch '''rpl'''. Null oder mehrere '''flg''' wirken steuernd ein&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;t&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| bedingter Sprungbefehl zur '''MARKE''' abhängig von vorheriger '''s''' oder '''y''' Kommandos&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;w&amp;lt;/font&amp;gt;  FILE|| 2 || - || X || - || - &lt;br /&gt;
|| Schreibt Musterspeicher in '''FILE'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;x&amp;lt;/font&amp;gt;  || 2 || - || - || X || X &lt;br /&gt;
|| Inhalt von Muster- und Haltespeicher vertauschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;y&amp;lt;/font&amp;gt;/src/rpc/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt jedes Zeichen im pattern buffer welches in '''src''' vorkommt durch das entsprechenden Zeichen in '''rpc'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== kleine sed Programme am praktischen Beispiel erklärt ==&lt;br /&gt;
&lt;br /&gt;
Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten.  Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen.&lt;br /&gt;
Machen wir doch die Probe aufs Exempel: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/rpmconfigcheck'''&lt;br /&gt;
 sed -e 's/^/    /' &amp;lt; $configcheckfile&lt;br /&gt;
* einfacher s-Befehl, Eingabedatei ist der Variable '''configcheckfile''' gespeichert&lt;br /&gt;
* '''&amp;quot;^&amp;quot;''' Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/smbfs'''&lt;br /&gt;
 mountpoint=$( echo &amp;quot;$mountpoint&amp;quot;|sed &amp;quot;s/\/*$//&amp;quot;)&lt;br /&gt;
* es wird die Variable '''mountpoint''' (in der scheinbar Text steht) mit '''echo''' ausgegeben, durch '''sed''' gefiltert und die Ausgabe wieder in der Variable '''mountpoint''' gespeichert&lt;br /&gt;
* '''&amp;quot;s/\/*$//&amp;quot;''' Trennzeichen ist '''&amp;quot;/&amp;quot;''' das haben wir aber 4 Mal ;-) , Beim näheren Hinsehen ist das 2 '''&amp;quot;/&amp;quot;''' mit '''&amp;quot;\&amp;quot;''' entwertet &lt;br /&gt;
* damit lautet unsere Suchmaske ohne Quotierung &amp;quot;'''/*$'''&amp;quot; und das ist schlichtweg als letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) '''&amp;quot;/&amp;quot;''' ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren_.28Angabe_der_Anzahl_Wiederholungen.29 Quantoren]) &lt;br /&gt;
gemeint&lt;br /&gt;
* ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle '''&amp;quot;/&amp;quot;''' am Ende des Variableinhaltes abzuschneiden &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/fbset'''&lt;br /&gt;
 mode=`echo $FBSET_PARAMS | sed -e 's/^-[^ ]*//' -e 's/ -[^ ]*//g'`&lt;br /&gt;
* auch hier wird der Inhalt einer Variable durch '''sed''' gefiltert und das Ergebnis in einer anderen Variable gespeichert&lt;br /&gt;
* '''sed''' hat hier 2 Regeln wie wir an 2 mal '''-e''' und der Quotierung schnell herauslesen. &lt;br /&gt;
* die erste Regel ist ein s-Befehl, Suchmuster ist '''&amp;quot;^-[^ ]*&amp;quot;''' bedeutet Am Zeilenanfang '''&amp;quot;^&amp;quot;''' ein '''&amp;quot;-&amp;quot;''' und dann''' &amp;quot;[^ ]*&amp;quot;''' also [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Ein_Zeichen_aus_einer_Auswahl alles andere nur kein Leerzeichen] und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.&lt;br /&gt;
* die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein,  dann wird auch bis zum nächsten  Leerzeichen nach dem Strich alles gelöscht. &lt;br /&gt;
* der 2. Befehl arbeitet global, das heist es werden alle &amp;quot; -irgendwas&amp;quot; gelöscht.&lt;br /&gt;
* In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem &amp;quot;-&amp;quot; aus dem Variabelinhalt zu beseitigen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/network''' &lt;br /&gt;
 RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`&lt;br /&gt;
* der Inhalt von /etc/inittab wird durch '''sed''' gefiltert und in der Variable''' RL''' abgelegt.&lt;br /&gt;
* es ist ein s-Befehl '''-n''', also keine automatische Ausgabe,&lt;br /&gt;
*Dieses Mal ist das Begrenzungszeichen '''&amp;quot;=&amp;quot;''' da es unmittelbar nach dem '''&amp;quot;s&amp;quot;''' kommt, der Befehl hat also hier die Struktur '''s===''' und nicht wie bisher gewohnt '''s///'''&lt;br /&gt;
* als Flag haben wir ein '''&amp;quot;p&amp;quot;''', also sollte '''sed''' hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben&lt;br /&gt;
* Suchmuster: am Anfang '''&amp;quot;id:&amp;quot;''' dann kommt [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Beliebiges_Zeichen irgend ein Zeichen] das mit '''&amp;quot;\( \)&amp;quot;''' [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern gruppiert] ist, und dann geht es weiter mit '''&amp;quot;:initdefault&amp;quot;''' und anschließen alle Zeichen bis Zeilenende.&lt;br /&gt;
* Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von '''&amp;quot;\1&amp;quot;''' also dem was vom Muster in der '''\( \)''' Klammer gefunden wird ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern Rückwärtsreferenz]).&lt;br /&gt;
* Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/xdm'''&lt;br /&gt;
 /etc/X11/xdm/SuSEconfig.xdm | \&lt;br /&gt;
 sed 's+\(.*\)+/etc/init.d/xdm: \1+g' | \&lt;br /&gt;
          /bin/logger&lt;br /&gt;
&lt;br /&gt;
* nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit &amp;quot;\&amp;quot; das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.&lt;br /&gt;
* es wird ein Script '''/etc/X11/xdm/SuSEconfig.xdm''' ausgeführt und die Ausgabe durch '''sed''' mit einem s-Befehl gefiltert, diese Ausgabe wird  dem Programm '''/bin/logger''' übergeben.&lt;br /&gt;
* der s-Befehl hat hier die Struktur '''s+++''' da ein '''&amp;quot;+&amp;quot;''' unmittelbar dem '''&amp;quot;s&amp;quot;''' folgt. &lt;br /&gt;
* eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.&lt;br /&gt;
* die Suchmaske ist '''\(.*\)''' und bedeutet soviel wie gruppiert '''\( \)''' wird &amp;quot;Alles&amp;quot; (beliebiges Zeichen, 0 mal oder beliebig oft)&lt;br /&gt;
* ersetzt wird es durch &amp;quot;'''/etc/init.d/xdm: \1'''&amp;quot; , wobei '''\1''' durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.&lt;br /&gt;
* das Flag '''&amp;quot;g&amp;quot;''' ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.&lt;br /&gt;
* Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile '''&amp;quot;/etc/init.d/xdm: &amp;quot;''' einzufügen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/texi2dvi4a2ps'''&lt;br /&gt;
 BEFEHL | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;/p'&lt;br /&gt;
&lt;br /&gt;
* der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.&lt;br /&gt;
* sed wird mit '''&amp;quot;-n&amp;quot;''' gestartet, also keine automatische Ausgabe jeder Zeile&lt;br /&gt;
* der s-Befehl hat keine Adresse und normale Struktur '''s///''' , Flag ist '''&amp;quot;p&amp;quot;''' bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben. &lt;br /&gt;
* Suchmuster ist '''^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$''' ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer '''&amp;quot;\[&amp;quot;''' ; dann kommt irgendetwas oder nichts '''&amp;quot;.*&amp;quot;''' , das wird wiedermal gruppiert '''\( \)''', die Gruppe endet vor der Zeichenfolge '''&amp;quot;version &amp;quot;'''; Anschließend wird nach Zeichen im Format &amp;quot;XXXX-XX-XX&amp;quot; gesucht und irgendwas oder nichts kann bis  Zeilenende kommen.&lt;br /&gt;
* von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.&lt;br /&gt;
* ersetzt wird die gesamte Zeile durch '''&amp;quot;txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;''' die \1 \2 \3 \4  wird durch die Gruppen ersetzt.&lt;br /&gt;
* der sed-Befehl formatiert also eine &amp;quot;Versionszeile&amp;quot; neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 7  (für Fortgeschrittene) ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/autoconf'''&lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot; |&lt;br /&gt;
    sed '/^.*\/\([^/][^/]*\)\/*$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\/\)$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\).*/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          s/.*/./; q'&lt;br /&gt;
&lt;br /&gt;
* hier wird '''&amp;quot;X/&amp;quot;''' vor '''&amp;quot;$0&amp;quot;''' (also der aufgerufene Name des Scriptes) mit '''echo''' ausgegeben und an '''sed''' übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Struktur ====&lt;br /&gt;
&lt;br /&gt;
* der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.&lt;br /&gt;
 /ADRESSE1/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE2/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE3/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
           }&lt;br /&gt;
           s ; q&lt;br /&gt;
* Den sed-Befehl '''&amp;quot;q&amp;quot;''' hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option '''-n''' noch die Ausgabe des Musterspeichers veranlaßt.&lt;br /&gt;
* die Bedeutung, die  '''&amp;quot;{ }&amp;quot;'''  hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ''';''' oder '''\n''' getrennt werden)&lt;br /&gt;
* Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann '''sed''' beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schauen wir uns zuerst die s-Befehle an ====&lt;br /&gt;
&lt;br /&gt;
* die ersten 3 s-Befehle sind gleich '''&amp;quot;s//\1/&amp;quot;''' das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die '''//''' unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe '''&amp;quot;\1&amp;quot;''' beim Ersetzen zu ?&lt;br /&gt;
:: würden wir diesen Befehl auf der Konsole versuchen, '''sed 's//\1/'''' käme eine Fehlermedung, &amp;quot;fehlender Suchstring&amp;quot;&lt;br /&gt;
:: sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.&lt;br /&gt;
* der letzte s-Befehl ist einfach '''&amp;quot;s/.*/./&amp;quot;''' ersetzt alles oder nichts durch einen einzigen Punk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Adressen ====&lt;br /&gt;
 &lt;br /&gt;
* ADRESSE1: '''^.*\/\([^/][^/]*\)\/*$''' wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.&lt;br /&gt;
::gesucht und gruppiert wird &amp;quot;ein mindestens 2 Zeichen langes Wort&amp;quot; Wortbegrenzer ist &amp;quot;/&amp;quot; gefunden wird die ganze Zeile.&lt;br /&gt;
:: Achtung: hier &amp;quot;'''^.*\/'''&amp;quot; treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist.[http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gieriges_Verhalten gieriges Verhalten] '''(Greediness of RegEx)'''&lt;br /&gt;
:: gesucht wird am Zeilenanfang &amp;quot;irgendwas oder nichts bis ein '''&amp;quot;/&amp;quot;''' kommt&amp;quot; &lt;br /&gt;
::: ist in der Shellvariable eine oder mehrere '''&amp;quot;/&amp;quot;''' (also das Programm mit dem Path aufgerufen,) dann wird hier als &amp;quot;irgendwas&amp;quot; der längst mögliche String gefunden &lt;br /&gt;
:: durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der &amp;quot;Scriptname ohne den Path&amp;quot;  &lt;br /&gt;
:: dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet. &lt;br /&gt;
&lt;br /&gt;
* ADRESSE2 '''&amp;quot;^X\/\(\/\/\)$&amp;quot;''' kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.&lt;br /&gt;
:: sie sucht nach '''&amp;quot;X///&amp;quot;''' und gruppiert die letzten beiden '''&amp;quot;/&amp;quot;'''&lt;br /&gt;
:: der s-Befehl würde also '''&amp;quot;//&amp;quot;''' ausgeben und sich beenden.&lt;br /&gt;
&lt;br /&gt;
* ADRESSE3 '''&amp;quot;^X\/\(\/\).*&amp;quot;''' (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem '''&amp;quot;/&amp;quot;''' weniger würde auch fündig werden bei vielen aneinandergereihten '''&amp;quot;/&amp;quot;''' und gibt nur ein '''&amp;quot;/&amp;quot;''' aus&lt;br /&gt;
&lt;br /&gt;
* Treffen keine der 3 Adressen zu, z.B. weil '''&amp;quot;$0&amp;quot;''' leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Da ist noch ein kleiner Trick im Script versteckt ====&lt;br /&gt;
&lt;br /&gt;
Damit bei einer Leeren &amp;quot;$0&amp;quot; das sed-Programm überhaupt arbeiten kann, wird als Trick &lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot;&lt;br /&gt;
benutzt. Das vorangestellte '''&amp;quot;X/&amp;quot;''' wird beim Ersetzten innerhalb von '''sed''' jedesmal wieder entfernt, aber es sichert bei leeren '''$0''' eine ordnungsgemäße Funktion des Programms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Das Ergebnis des gesamten sed-Programms ====&lt;br /&gt;
&lt;br /&gt;
Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable '''$0''' und ist entweder der '''&amp;quot;Scriptname ohne Path&amp;quot; ; &amp;quot;//&amp;quot; ; &amp;quot;/&amp;quot;  oder &amp;quot;.&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.grymoire.com/Unix/Sed.html An Introduction and Tutorial]&lt;br /&gt;
* [http://www.tty1.net/sed-tutorium_de.html sed-Tutorium-de]&lt;br /&gt;
* [http://sed.sourceforge.net/sedfaq.html THE SED FAQ]&lt;br /&gt;
* [http://sed.sourceforge.net/#tools Hilfreiche Tools für Sed-Programmierung]&lt;br /&gt;
* [http://www.gnu.org/software/sed/manual/ GNU sed user's manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;!-- ~~~~ --&amp;gt;&lt;br /&gt;
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]&lt;br /&gt;
[[Kategorie:Konsole]][[Kategorie:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33041</id>
		<title>Sed</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33041"/>
		<updated>2019-06-05T03:41:26Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* das Funktionsprinzip */ ditto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SED  - eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist sed und was kann sed ? ==&lt;br /&gt;
&lt;br /&gt;
[http://linux.die.net/man/1/sed sed] ('''S'''tream-'''ED'''itor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist '''sed''' nicht. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem &amp;quot;programmiertem Rezept&amp;quot; welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren '''Text-Bearbeitungs-Filter''', mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sed wurde 1973/74 von [http://senseis.xmp.net/?McMahon Lee E. McMahon] entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf [[Reguläre Ausdrücke|Regulären Ausdrücken]] auf und umfasst nur wenige [[#Befehlsübersicht|Befehle]]. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von '''sed''' sind der Zeileneditor [http://linux.die.net/man/1/ed ed] (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor '''[[VIM|vi]]'''.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''sed''' erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. &lt;br /&gt;
  sed 's/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g'&lt;br /&gt;
Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache.&lt;br /&gt;
Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von [[awk]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit '''sed''' schon durchsichtiger, und wer sich öfter und intensiver mit '''sed''' beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit '''sed''' die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit '''sed''' programmiert. In diesem [http://sed.sourceforge.net/grabbag/scripts/ SED Script Archiv] sind einige solcher Programme zu finden. Weitere [http://sed.sourceforge.net/#scripts sed-scripte] und weitere [http://sed.sourceforge.net/#gamez Spiele ] gibt es auf  [http://sed.sourceforge.net/ einer der wichtigsten SED-Seiten] (Web-Seiten geschrieben übrigens mit ? : [http://sed.sourceforge.net/local/scripts/sedindex2html.sed.html natürlich mit sed] ;-))) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Heute gibt es eine Vielzahl von [http://sed.sourceforge.net/sedfaq2.html#s2.2 '''sed''' Implementierungen für die unterschiedlichsten Betriebssysteme] die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der [http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke Regulären Ausdrücke], da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges [http://www.gnu.org/software/sed/manual/ GNUsed] das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Für was benötigen wir sed heute ? ===&lt;br /&gt;
&lt;br /&gt;
Mit '''sed''' lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.&lt;br /&gt;
&lt;br /&gt;
Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist '''sed''' oftmals ein sehr hilfreiches Tool.&lt;br /&gt;
Darüber hinaus kann man '''sed''' überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:&lt;br /&gt;
&lt;br /&gt;
* Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);&lt;br /&gt;
* Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen&lt;br /&gt;
* das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien&lt;br /&gt;
&lt;br /&gt;
Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird '''sed''' interessant. Mit dem Stream Editor lassen sich eine Vielzahl von [http://sed.sourceforge.net/local/docs/emulating_unix.txt Standardkommandos von UNIX simulieren]. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal '''sed''' als die Lösung für solche Problemfälle finden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um '''sed''' finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf '''sed''' zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell '''sed''' als die kleine elegante Lösung die beste Option. &lt;br /&gt;
&lt;br /&gt;
Für viele kleine Dinge ist '''sed''' durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist '''awk''' (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte '''sed''' auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.&lt;br /&gt;
&lt;br /&gt;
== das Funktionsprinzip ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip von '''sed''' ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnisprobleme beim Schreiben oder Interpretieren von sed-Programmen.&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von '''sed''' werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt '''sed''' den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der '''Zeilenzähler''' wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''sed''' hat einen Textbuffer den sogenannten '''Musterspeicher''', dieser ist beim Starten des Programms leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diesen Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Grundverhalten, dass '''sed''' jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von '''sed''' verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was '''sed''' denn ausgeben soll, wir müssen also  &amp;quot;Print-Befehle&amp;quot; benutzen. Die Option bei Aufruf von '''sed''' dazu ist &amp;quot;'''-n'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option '''-n''' die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option '''-n''' so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programms benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programms von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, nicht selten  &amp;lt;!-- mit?bei --&amp;gt; Option '''-n''' ;-))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== was beinhaltet sed und was kann man damit machen ===&lt;br /&gt;
&lt;br /&gt;
Neben dem '''Musterspeicher''' gibt es noch einen 2. Textbuffer, den sogenannten '''Haltespeicher'''. Auch dieser ist beim Start des Programms leer. In ihm könnte man jetzt zB den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige [[#Befehlsübersicht| '''sed''' Kommandos]] mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher durch Haltespeicher ersetzen &lt;br /&gt;
*  Haltespeicher durch Musterspeicher ersetzen&lt;br /&gt;
*  Inhalt von Halte- und Musterspeicher tauschen&lt;br /&gt;
*  Inhalt von Musterspeicher an den Haltespeicher anhängen &lt;br /&gt;
*  Inhalt von Haltespeicher an den Musterspeicher anhängen&lt;br /&gt;
'''Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden.''' Er dient nur zum Zwischenspeichern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und was geht jetzt mit dem Musterspeicher?&amp;lt;br&amp;gt;&lt;br /&gt;
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht zB:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher löschen&lt;br /&gt;
*  die nächste Zeile einlesen&lt;br /&gt;
*  die nächste Zeile hinten hinzufügen&lt;br /&gt;
*  Musterspeicher nach stdout ausgeben&lt;br /&gt;
*  Inhalte mit dem Haltespeicher austauschen&lt;br /&gt;
*  den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben&lt;br /&gt;
*  oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben&lt;br /&gt;
*  den Musterspeicher in eine Datei schreiben&lt;br /&gt;
*  Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht  &lt;br /&gt;
*  einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl [http://linux.die.net/man/1/tr tr])&lt;br /&gt;
*  und das Wichtigste, '''innerhalb des Musterspeichers suchen und ersetzen'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Variablen ?&lt;br /&gt;
: außer dem Haltespeicher und der Variable in der '''sed''' automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts&amp;lt;br&amp;gt;&lt;br /&gt;
; Schleifen ?&lt;br /&gt;
: gibt es auch keine, aber es gibt 2 '''Sprungbefehle''', ähnlich wie '''GOTO-Befehle''' und natürlich einen vorzeitigen Programmabbruch&amp;lt;br&amp;gt; &lt;br /&gt;
Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man '''sed''' schon sogut wie komplett erklärt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wie kann man damit Probleme lösen ===&lt;br /&gt;
&lt;br /&gt;
Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?&lt;br /&gt;
&lt;br /&gt;
Der Befehl, der den Hauptteil der Arbeit innerhalb von '''sed''' leistet, ist oben nur als '''&amp;quot;suchen und ersetzen&amp;quot;''' angegeben. Dieser '''s-Befehl''' ist in der Kombination mit [[Reguläre Ausdrücke|Regulären Ausdrücken]] sehr mächtig, ''([[#der s-Befehl|weiter unten, spezielles Kapitel]])''. Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. '''Suchen und ersetzen''' umfasst hier zB auch ''&amp;quot;eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen&amp;quot;''. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren, zB: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kleines Problem ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit '''sed''' muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von '''sed''' ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden.  Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei '''sed''' nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logig selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Problem mit '''sed''' anzugehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ganze erinnert etwas an [http://de.wikipedia.org/wiki/Assemblersprache Assembler-Programmierung], und das nicht ganz unbegründet. Die Mehrzahl der Befehle von '''sed''', sind in ihrer Funktion sehr elementar und nicht unähnlich den Operationen die in einer CPU auf Registerebene ausgeführt werden.  Der Unterschied ist: die CPU arbeitet mit Registern  einer definierten Bit Breite  und '''sed''' arbeitet mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir zB. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logig, in '''sed''' gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
1973 da hatten die [http://de.wikipedia.org/wiki/PDP-11 Rechner] Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet ([http://de.wikipedia.org/wiki/Geschichte_von_Unix Geschichte von Unix]).&lt;br /&gt;
&amp;lt;br&amp;gt; Terminals gab es zwar, aber der verbreitetste Weg durch einen Rechner war immer noch, von der [http://technikum29.de/de/rechnertechnik/lochkarten-edv Lochkarte] oder [http://www.pdp8.net/tu56/tu56.shtml einem Magnetband] über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie [http://web.mit.edu/multics-history/source/Multics_Internet_Server/Multics_sources.html  Multics] und [http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm nackte Logig], das gesamte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein.&lt;br /&gt;
&lt;br /&gt;
== der Aufruf und die Optionen von sed ==&lt;br /&gt;
&lt;br /&gt;
=== die Optionen ===&lt;br /&gt;
 &lt;br /&gt;
Eine Option '''-n''' steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind '''-e''' und  '''-f'''&lt;br /&gt;
&lt;br /&gt;
; sed -e REGEL:&lt;br /&gt;
hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option '''-e REGEL''' kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option '''-e''' ist nicht zwingend erforderlich, '''sed''' interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) &lt;br /&gt;
; sed -f REGELDATEI:&lt;br /&gt;
Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option ''' -f ''' an '''sed''' übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet.&lt;br /&gt;
; weitere Optionen sind abhängig von der speziellen sed-Implementierung :&lt;br /&gt;
diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der Aufruf ===&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 BEFEHL | sed -e 'REGEL' &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 sed  -n -e 'REGEL' EINGABEDATEI &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 BEFEHL | sed -f REGELDATEI | BEFEHL&lt;br /&gt;
 &lt;br /&gt;
 sed -e 'REGEL1' -f REGELDATEI -e 'REGEL2' &amp;lt;EINGABEDATEI &amp;gt;AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 VARIABLE=`BEFEHL | sed -e 'REGEL1' | sed -ne 'REGEL2' | BEFEHL ` &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -ne '&lt;br /&gt;
        BEFEHL1\&lt;br /&gt;
            Optionen zum BEFEHL1\&lt;br /&gt;
            weitere Optionen&lt;br /&gt;
        ; BEFEHL2 ; BEFEHL3\&lt;br /&gt;
             Optionen zum BEFEHL3&lt;br /&gt;
        ; BEFEHL4 ; BEFEHL5&lt;br /&gt;
 '&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sed-Programm als Script ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die '''[http://de.wikipedia.org/wiki/Shebang Magic Line''' (shebang)]&lt;br /&gt;
 #!/usr/bin/sed -f &lt;br /&gt;
(eventuell noch zusätzlich die Option '''-n''') gesetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Übergabe von Shell-Variablen an Sed-Programme ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von '''sed''' entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.&lt;br /&gt;
&lt;br /&gt;
Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann '''$Shellvariable'''. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 sed -n '&lt;br /&gt;
 '/$1/' !{&lt;br /&gt;
  	#no match - put the current line in the hold buffer&lt;br /&gt;
 	x&lt;br /&gt;
 	# delete the old one, which is &lt;br /&gt;
 	# now in the pattern buffer&lt;br /&gt;
 	d&lt;br /&gt;
 }'&lt;br /&gt;
Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;/$1/&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;!{ '''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
die roten Hochkommas lassen die Shell '''/$1/''' sehen und damit wird die Shell beim Aufruf von '''sed''' an dieser Stelle anstatt '''$1''' den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von '''sed'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Nutzung von sed in Here-Dokuments's ====&lt;br /&gt;
&lt;br /&gt;
Eine weitere häufig benutzte Aufrufmöglichkeit von '''sed''' innerhalb von Shell-Scripten ist das [http://en.wikipedia.org/wiki/Heredoc Here Document]&lt;br /&gt;
Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die '''sed''' verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
KASSE=129.32&lt;br /&gt;
WAEHRUNG=&amp;quot;EURO&amp;quot;&lt;br /&gt;
MITARBEITER=&amp;quot;Hr. Maier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sed -e 's/XXXX/'$KASSE'/g;s/YYYY/'&amp;quot;$WAEHRUNG&amp;quot;'/g;s/ZZZZ/'&amp;quot;$MITARBEITER&amp;quot;'/g' &amp;lt;&amp;lt;EOF&lt;br /&gt;
Der Bargeldbestand von XXXX YYYY wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer ZZZZ&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter '''XXXX ; YYYY ; ZZZZ ''' werden durch '''sed''' dann durch diese Werte ersetzt, die '''sed''' beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt.&lt;br /&gt;
&amp;lt;pre&amp;gt;Der Bargeldbestand von 129.32 EURO wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer Hr. Maier&amp;lt;/pre&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== die Befehle ==&lt;br /&gt;
&lt;br /&gt;
Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)&lt;br /&gt;
* p  = '''p'''rint&lt;br /&gt;
* l  = '''l'''ist&lt;br /&gt;
* i  = '''i'''insert&lt;br /&gt;
* a  = '''a'''pend&lt;br /&gt;
*usw&lt;br /&gt;
&lt;br /&gt;
zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Adressierung der Befehle ===&lt;br /&gt;
&lt;br /&gt;
Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können zB mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen.  Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, ( also &amp;quot;alle Anderen außer den adressierten Zeilen&amp;quot; treffen zu  )&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt&lt;br /&gt;
* gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen&lt;br /&gt;
* viele haben 2 Adressen in der Schreibweise '''Adresse1,Adresse2''' Hier handelt es sich um ein '''von Adresse1  bis zur Adresse2'''&lt;br /&gt;
* (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (zB '''3~4''' würde bedeuten ab Zeile 3 jede 4.Zeile) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Adressierungsmöglichkeiten unterliegen folgenden Regeln&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei&lt;br /&gt;
* Eine Adresse kann ein Regulären Ausdruck sein  '''/regex/''' entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch '''\%regex\%''' zu schreiben, wobei '''%''' ein beliebiges Zeichen ist)&lt;br /&gt;
* zwei Adressen '''Zahl1,Zahl2''' enspricht von Zeilennummer '''Zahl1''' bis Zeilennummer '''Zahl2''' bezogen auf die Eingangsdatei&lt;br /&gt;
* '''/regex1/,/regex2/''' bedeutet vom der Zeile die '''regex1''' erfüllt bis zur Zeile die '''regex2''' erfüllt &lt;br /&gt;
* Kominationen von '''Zahl,/regex/''' und '''/regex/,Zahl''' sind möglich&lt;br /&gt;
* anstatt einer Zahl das Zeichen '''$''' bedeutet die letzte Zeile&lt;br /&gt;
* Zeilenberechnungen mit Zeilennummern wie zB '''$-10''' (als Adresse für die letzten 10 Zeilen gemeint) geht nicht &lt;br /&gt;
* Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in '''{ }''' eingeschlossen sind und durch ''';''' voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. ''' Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen''' &lt;br /&gt;
* Das Zeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispiele für Adressierung ====&lt;br /&gt;
&lt;br /&gt;
einfache Beispiel in Kombination mit den Befehlen '''p'''rint und '''d'''elete und der Einfluss der Option '''-n'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '1,10p'          # Zeilen 1 bis 10 ausgeben&lt;br /&gt;
sed -e  '1,10p'          # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben&lt;br /&gt;
sed -e  '2d'             # 2. Zeile löschen&lt;br /&gt;
sed -e  '2,10!d'         # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -ne '2,10p'          # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -e  '10,$p'          # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben&lt;br /&gt;
sed -ne  '$p'            # letzte Zeile ausgeben&lt;br /&gt;
&lt;br /&gt;
sed -e  '/Text/d'        # Alle Zeilen die nicht &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -e  '/Text/!d'       # Alle Zeilen die &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -ne '/Text/,$!p'     # Alle Zeilen bevor eine Zeile mit &amp;quot;Text&amp;quot; kommt, ausgeben&lt;br /&gt;
sed -ne '/Begin/,/END/p' # Alle Zeilen von &amp;quot;Begin&amp;quot; bis &amp;quot;END&amp;quot; ausgeben (wird &amp;quot;END&amp;quot; nicht gefunden bis Schluss)&lt;br /&gt;
                         # Kommt nach einem &amp;quot;END&amp;quot; wieder ein &amp;quot;Begin&amp;quot; dann von dort aus wieder ausgeben &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hier jetzt mal ein paar Beispiele zur Verwendung von [http://sed.sourceforge.net/sedfaq3.html#s3.7 Charakter Klassen] und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[[:alnum:]]/!p' # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen&lt;br /&gt;
sed -ne '3~2p'             # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 )&lt;br /&gt;
sed -ne '5,/Text/p'        # Ab der 5.Zeile bis zu einer Zeile mit &amp;quot;Text&amp;quot; ausgeben&lt;br /&gt;
sed -ne '3,+7p'            # Die 3.Zeile und die 7 folgenden Zeilen ausgeben&lt;br /&gt;
sed -ne '/Begin/,+2p'      # Die Zeilen die &amp;quot;Begin&amp;quot; enthalten und jeweils die nächsten 2 Zeilen ausgeben&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[EBH]/p'               # alle Zeilen die mit &amp;quot;E&amp;quot;,&amp;quot;B&amp;quot; oder &amp;quot;H&amp;quot; beginnen ausgeben&lt;br /&gt;
sed -e  '/^$/d'                   # alle leeren Zeilen löschen&lt;br /&gt;
sed -ne '/^[^#].*/p'              # jede Zeile ausgeben, die mit einem anderem Zeichen als &amp;quot;#&amp;quot; beginnt&lt;br /&gt;
sed -ne '/^[[:space:]]*#/d'       # Zeilen deren erstes Zeichen (außer Space und Tabulator) &amp;quot;#&amp;quot; ist, löschen&lt;br /&gt;
sed -ne '/^.\{64\}/p'             # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben&lt;br /&gt;
sed -ne '/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p'&lt;br /&gt;
                                  # druckt jede Zeile in der eine IP-Adresse enthalten sein könnte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei '''sed''' noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also  bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um zB alle fehlerfreien Zeilen zu suchen, die einen Zeitstring  '''YYYY-MM-DD''' entsprechen wie ihn zB auch '''date +%F''' liefert, müsste man mit '''sed''' wie folgt adressieren. Hier mal gleich der Konsolausdruck. ;-)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # cat test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2007-13-01&lt;br /&gt;
2006-06-31&lt;br /&gt;
2008-30-02&lt;br /&gt;
2005-02-29&lt;br /&gt;
2006-11-31&lt;br /&gt;
2008-00-02&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: # sed -ne '/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p' test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: #   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei '''sed''' bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch [http://regexp-evaluator.de/evaluator/ Tools] und jede Menge gute Seiten im WWW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ein paar Regeln zu Regulären Ausdrücken in sed ====&lt;br /&gt;
&lt;br /&gt;
Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit '''sed''' und Regulären Ausdrücken mal hier einige  Regeln&amp;lt;br&amp;gt;&lt;br /&gt;
'''sed''' verwendet '''&amp;quot;Basic Regular Expressions&amp;quot;''' einige Unterschiede zu den '''&amp;quot;Erweiterten Regulären Ausdrücken&amp;quot;''' sind zB:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*   Die Quantifikatoren &amp;quot;'''|'''&amp;quot;, &amp;quot;'''+'''&amp;quot; und &amp;quot;'''?'''&amp;quot; sind normale Zeichen ''(GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash &amp;quot;escaped&amp;quot; werden)''&lt;br /&gt;
&lt;br /&gt;
*   die Klammern '''&amp;quot;{&amp;quot; &amp;quot;}&amp;quot; &amp;quot;(&amp;quot; ''' und ''' &amp;quot;)&amp;quot;''' sind normale Zeichen und müssen mit Backslashes &amp;quot;escaped&amp;quot; (aktiviert) werden, also als &amp;quot;'''\{'''&amp;quot; ; &amp;quot;'''\}'''&amp;quot; ; &amp;quot;'''\('''&amp;quot; und  &amp;quot;'''\)'''&amp;quot;geschrieben werden. &lt;br /&gt;
&lt;br /&gt;
*   die Zeichen, die durch &amp;quot;'''\('''&amp;quot; und &amp;quot;'''\)'''&amp;quot; eingeschlossen werden, können später mit &amp;quot;'''\1'''&amp;quot; usw. (max &amp;quot;'''\9'''&amp;quot; ) dereferenziert werden&lt;br /&gt;
&lt;br /&gt;
*   &amp;quot;'''^'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht&lt;br /&gt;
 &lt;br /&gt;
*   &amp;quot;'''$'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht&lt;br /&gt;
    &lt;br /&gt;
*   &amp;quot;'''*'''&amp;quot; ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der s-Befehl ===&lt;br /&gt;
&lt;br /&gt;
Der mit Abstand wichtigste Befehl in '''sed''', der Befehl '''&amp;quot;s///&amp;quot;'''. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit [[VIM|vi oder VIM]] beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit &amp;quot;suchen und ersetzen&amp;quot; erklärt. Die Schreibweise: &amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[ADRESSE]&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''s/'''&amp;lt;/font&amp;gt;SUCHMUSTER&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;ERSETZUNG&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;[FLAG] &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''ADRESSE''' ist der optionale Ausdruck wie er [[#Adressierung der Befehle|oben]] schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet&lt;br /&gt;
* '''FLAG''' steuert die Eigenschaften des Befehls und ist ebenfalls optional, [[#Adressierung der Befehle|Übersicht der möglichen Flags]]; ist kein Flag angegeben, gilt '''1''' ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.&lt;br /&gt;
* '''s''' ist der Befehlsname selbst&lt;br /&gt;
* '''SUCHMUSTER''' ist ein [[Reguläre Ausdrücke|Regulärer Ausdruck]] nach dem gesucht wird&lt;br /&gt;
* '''ERSETZUNG''' enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.&lt;br /&gt;
* Als Abrenzung der einzelnen Optionen sind  3 '''&amp;quot;/&amp;quot;''' Begrenzer zu setzen. ''(Bei Bedarf darf hier auch statt '''&amp;quot;/&amp;quot;''' jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf '''s''' folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen.&lt;br /&gt;
 sed -e 's/Strauch/Baum/g'&lt;br /&gt;
; Erläuterung&lt;br /&gt;
: * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet&lt;br /&gt;
: * Reguläre Suchausdruck lautet in diesem Beispiel einfach '''&amp;quot;Strauch&amp;quot;'''&lt;br /&gt;
: * Der Ersetzungtext ist '''&amp;quot;Baum&amp;quot;'''&lt;br /&gt;
: * als Flag wird '''&amp;quot;global&amp;quot;''' verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt.&lt;br /&gt;
: * da sed ohne die Option '''-n''' gestartet wurde erfolgt eine automatische Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination &amp;quot;Stauch&amp;quot; durch &amp;quot;Baum&amp;quot; ersetzt, also nicht nur das Wort Strauch selbst, sonder zB würde aus dem Wort &amp;quot;Strauchdieb&amp;quot; das Wort  &amp;quot;Baumdieb&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann.  &lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== die Bedeutung der Flags ====&lt;br /&gt;
&lt;br /&gt;
Mit den Flags kann die Funktion des '''s-Befehls''' gesteuert werden. Ist kein Flag angegeben gilt '''1''' ; also nur Ersetzung des ersten Vorkommens des gefunden Strings&lt;br /&gt;
&lt;br /&gt;
{| border=1&lt;br /&gt;
|+ '''Bedeutung der Flags beim s-Befehl '''&lt;br /&gt;
!  Flag   !! Bedeutung !! Beispiel   !! Bemerkung&lt;br /&gt;
|- &lt;br /&gt;
!| N     &lt;br /&gt;
|| N=Zahl (1 &amp;lt; 512) ; das N'te Vorkommen &lt;br /&gt;
!| s/AB/CD/2 &lt;br /&gt;
|| wird N nicht angegeben dann erste Vorkommen &lt;br /&gt;
|- &lt;br /&gt;
!| g     &lt;br /&gt;
|| global ;  alle Vorkommen &lt;br /&gt;
!| s/AB/CD/g &lt;br /&gt;
|| es werden alle Vorkommen ersetzt &lt;br /&gt;
|- &lt;br /&gt;
!| p     &lt;br /&gt;
|| print ; Ausgabe bei Ersetzung &lt;br /&gt;
!| s/AB/CD/p &lt;br /&gt;
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben &lt;br /&gt;
|- &lt;br /&gt;
!| w DATEI     &lt;br /&gt;
|| write DATEI bei Ersetzung &lt;br /&gt;
!| s/AB/CD/w FILE&lt;br /&gt;
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei&lt;br /&gt;
|- &lt;br /&gt;
!| i     &lt;br /&gt;
|| case-insensitive ; Groß-Kleinschreibung ignorieren &lt;br /&gt;
!| s/AB/CD/i &lt;br /&gt;
|| ist &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; zu allen SED-Implementierung&lt;br /&gt;
|- &lt;br /&gt;
!| m    &lt;br /&gt;
|| || &lt;br /&gt;
|| betrifft Interpretation von '''^ '''und''' $''' ; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; &lt;br /&gt;
|- &lt;br /&gt;
!| x     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|-&lt;br /&gt;
!| s     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|}&lt;br /&gt;
es sind auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. zB&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # echo &amp;quot;abcabcabc&amp;quot; | sed -ne 's/AB/CD/2ip'&lt;br /&gt;
abcCDcabc&lt;br /&gt;
LINUX: # &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== kleine Befehlsbeispiele zum Suchen und Ersetzten ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -e 's/blau\|lila/rot/2'     # Das 2.Vorkommen je Zeile von &amp;quot;blau&amp;quot; oder &amp;quot;lila&amp;quot; wird durch &amp;quot;rot&amp;quot; ersetzt&lt;br /&gt;
&lt;br /&gt;
sed -e '/^$/!s/^/#/ '           # bei alle nichtleeren Zeilen am Zeilenanfang &amp;quot;#&amp;quot; einfügen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/#.*$//'               # von einem Zeichen &amp;quot;#&amp;quot; bis zum Zeilenende alles löschen&lt;br /&gt;
&lt;br /&gt;
sed 's/^[ \t]*//;s/[ \t]*$//'   # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/Michael[^a]/Herr &amp;amp;/'  # ersetze &amp;quot;Michael&amp;quot; durch &amp;quot;Herr Michael&amp;quot; jedoch nicht wenn hinter &amp;quot;Michael&amp;quot; ein &amp;quot;a&amp;quot; folgt.&lt;br /&gt;
&lt;br /&gt;
sed -e 's/[Cc]olor/[b]&amp;amp;[\/b]/g' # jedes &amp;quot;Color&amp;quot; und &amp;quot;color&amp;quot; in &amp;quot;[b]Color[/b]&amp;quot; oder &amp;quot;[b]color[/b]&amp;quot; änderen&lt;br /&gt;
&lt;br /&gt;
date +%F | sed -e 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/'&lt;br /&gt;
                                #das Datumsformat YYYY-MM-DD umwandeln zu &amp;quot;heute ist der DD.MM. YYYY&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Besonderheiten der Beispiele'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Beispiel: es wird eine Oderverknüpfung benutzt  '''|''' muss dabei entwertet werden also '''\|'''&lt;br /&gt;
# Beispiel: Verwendung der Sonderzeichen '''^''' für Zeilenanfang und '''$''' für Zeilenende&lt;br /&gt;
# Beispiel: '''#.*$''' bedeutet Zeichen '''#''' anschließend müssen 0 oder beliebig viele beliebige Zeichen '''(.*)''' stehen, bis Zeilenende '''($)''' ; alles wird durch NICHTS ersetzt '''(//)'''&lt;br /&gt;
# Beispiel: '''[ \t]''' an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das '''&amp;quot;*&amp;quot;''' darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch '''&amp;quot;;&amp;quot;''' getrennt, beide werden hintereinander auf alle Zeilen ausgeführt. &lt;br /&gt;
# Beispiel: '''[^a]''' das '''&amp;quot;a&amp;quot;''' ist durch '''&amp;quot;^&amp;quot;''' negiert, das Bedeutet ('''nicht &amp;quot;a&amp;quot;''') an dieser Stelle, das '''&amp;quot;&amp;amp;&amp;quot;''' im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.&lt;br /&gt;
# Beispiel: Im Ersetzungsfeld steht wieder '''&amp;quot;&amp;amp;&amp;quot;''' der '''&amp;quot;/&amp;quot;''' im Ersetzungstext musste entwertet werden '''&amp;quot;\/&amp;quot;'''    &lt;br /&gt;
# Beispiel: Hier haben wir zum einem '''&amp;quot;\{ \}&amp;quot;''' mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier zB '''[0-9]\{4\}''' bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir '''&amp;quot;\( \)&amp;quot;''' das ist eine Gruppierung (ähnlich einer Variable)  mit '''&amp;quot;\1&amp;quot; bis &amp;quot;\9&amp;quot;''' kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus '''&amp;quot;\3 \2 \1&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Befehlsübersicht ===&lt;br /&gt;
&lt;br /&gt;
{| border=2&lt;br /&gt;
|+ '''Übersicht der Befehle und Schlüsselworte'''&lt;br /&gt;
!  Kommando   !!    Addr      !!   stdin   !!  stdout  !!  Muster Speicher !! Halte Speicher !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;;&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Trennzeichen zwischen einzelner Befehle&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;!&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{ }&amp;lt;/font&amp;gt; || 2 || - || - || - || - &lt;br /&gt;
|| umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ''';''' getrennt werden&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;#&amp;lt;/font&amp;gt;  || - || - || - || - || - &lt;br /&gt;
||Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt; MARKE || - || - || - || - || - &lt;br /&gt;
|| definiert das Sprungziel '''MARKE''' Siehe Kommandos '''b''' oder '''t'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;=&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| gibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;a&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text nach der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;b&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| Sprungbefehl zur '''MARKE''' bzw. zum Ende des Scripts&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;c&amp;lt;/font&amp;gt;  || 2 || - || X || X || - &lt;br /&gt;
|| Musterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;d&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;D&amp;lt;/font&amp;gt; || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher bis zum Zeichen „newline“ löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;g&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher wird durch den Inhalt des Haltespeicher ersetzt.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;G&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Haltespeicher wird an den Inhalt des Musterspeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;h&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Haltespeicher wird durch den Inhalt des Musterspeicher ersetzt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;H&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Musterspeicher wird an den Inhalt des Haltespeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;i&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text vor der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;l&amp;lt;/font&amp;gt;  || 1 || - || X || - || -&lt;br /&gt;
|| Musterspeicher ausgegeben. (&amp;quot;C-Notation&amp;quot; unbekannte Zeichen in Oktalformat)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;n&amp;lt;/font&amp;gt;  || 2 || X || ? || X || - &lt;br /&gt;
|| je nach Option '''-n''' wird der Buffer ausgegeben oder nicht, neue Zeile laden &lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;N&amp;lt;/font&amp;gt;  || 2 || X || - || X || - &lt;br /&gt;
|| Nächste Zeile an Inhalt des Musterspeichers angefügen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;p&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;P&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher bis zum nächsten „newline“-Zeichen ausgeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;q&amp;lt;/font&amp;gt;  || 1 || - || - || - || - &lt;br /&gt;
|| sed Beenden, bei nicht gesetzter Option '''-n''' wird Musterspeicher ausgegeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;r&amp;lt;/font&amp;gt;  FILE|| 1 || - || X || - || - &lt;br /&gt;
|| Inhalt einer angegebenen '''FILE''' wird eingelesen und ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;s&amp;lt;/font&amp;gt;/regex/rpl/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt '''regex''' durch '''rpl'''. Null oder mehrere '''flg''' wirken steuernd ein&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;t&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| bedingter Sprungbefehl zur '''MARKE''' abhängig von vorheriger '''s''' oder '''y''' Kommandos&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;w&amp;lt;/font&amp;gt;  FILE|| 2 || - || X || - || - &lt;br /&gt;
|| Schreibt Musterspeicher in '''FILE'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;x&amp;lt;/font&amp;gt;  || 2 || - || - || X || X &lt;br /&gt;
|| Inhalt von Muster- und Haltespeicher vertauschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;y&amp;lt;/font&amp;gt;/src/rpc/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt jedes Zeichen im pattern buffer welches in '''src''' vorkommt durch das entsprechenden Zeichen in '''rpc'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== kleine sed Programme am praktischen Beispiel erklärt ==&lt;br /&gt;
&lt;br /&gt;
Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten.  Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen.&lt;br /&gt;
Machen wir doch die Probe aufs Exempel: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/rpmconfigcheck'''&lt;br /&gt;
 sed -e 's/^/    /' &amp;lt; $configcheckfile&lt;br /&gt;
* einfacher s-Befehl, Eingabedatei ist der Variable '''configcheckfile''' gespeichert&lt;br /&gt;
* '''&amp;quot;^&amp;quot;''' Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/smbfs'''&lt;br /&gt;
 mountpoint=$( echo &amp;quot;$mountpoint&amp;quot;|sed &amp;quot;s/\/*$//&amp;quot;)&lt;br /&gt;
* es wird die Variable '''mountpoint''' (in der scheinbar Text steht) mit '''echo''' ausgegeben, durch '''sed''' gefiltert und die Ausgabe wieder in der Variable '''mountpoint''' gespeichert&lt;br /&gt;
* '''&amp;quot;s/\/*$//&amp;quot;''' Trennzeichen ist '''&amp;quot;/&amp;quot;''' das haben wir aber 4 Mal ;-) , Beim näheren Hinsehen ist das 2 '''&amp;quot;/&amp;quot;''' mit '''&amp;quot;\&amp;quot;''' entwertet &lt;br /&gt;
* damit lautet unsere Suchmaske ohne Quotierung &amp;quot;'''/*$'''&amp;quot; und das ist schlichtweg als letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) '''&amp;quot;/&amp;quot;''' ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren_.28Angabe_der_Anzahl_Wiederholungen.29 Quantoren]) &lt;br /&gt;
gemeint&lt;br /&gt;
* ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle '''&amp;quot;/&amp;quot;''' am Ende des Variableinhaltes abzuschneiden &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/fbset'''&lt;br /&gt;
 mode=`echo $FBSET_PARAMS | sed -e 's/^-[^ ]*//' -e 's/ -[^ ]*//g'`&lt;br /&gt;
* auch hier wird der Inhalt einer Variable durch '''sed''' gefiltert und das Ergebnis in einer anderen Variable gespeichert&lt;br /&gt;
* '''sed''' hat hier 2 Regeln wie wir an 2 mal '''-e''' und der Quotierung schnell herauslesen. &lt;br /&gt;
* die erste Regel ist ein s-Befehl, Suchmuster ist '''&amp;quot;^-[^ ]*&amp;quot;''' bedeutet Am Zeilenanfang '''&amp;quot;^&amp;quot;''' ein '''&amp;quot;-&amp;quot;''' und dann''' &amp;quot;[^ ]*&amp;quot;''' also [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Ein_Zeichen_aus_einer_Auswahl alles andere nur kein Leerzeichen] und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.&lt;br /&gt;
* die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein,  dann wird auch bis zum nächsten  Leerzeichen nach dem Strich alles gelöscht. &lt;br /&gt;
* der 2. Befehl arbeitet global, das heist es werden alle &amp;quot; -irgendwas&amp;quot; gelöscht.&lt;br /&gt;
* In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem &amp;quot;-&amp;quot; aus dem Variabelinhalt zu beseitigen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/network''' &lt;br /&gt;
 RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`&lt;br /&gt;
* der Inhalt von /etc/inittab wird durch '''sed''' gefiltert und in der Variable''' RL''' abgelegt.&lt;br /&gt;
* es ist ein s-Befehl '''-n''', also keine automatische Ausgabe,&lt;br /&gt;
*Dieses Mal ist das Begrenzungszeichen '''&amp;quot;=&amp;quot;''' da es unmittelbar nach dem '''&amp;quot;s&amp;quot;''' kommt, der Befehl hat also hier die Struktur '''s===''' und nicht wie bisher gewohnt '''s///'''&lt;br /&gt;
* als Flag haben wir ein '''&amp;quot;p&amp;quot;''', also sollte '''sed''' hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben&lt;br /&gt;
* Suchmuster: am Anfang '''&amp;quot;id:&amp;quot;''' dann kommt [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Beliebiges_Zeichen irgend ein Zeichen] das mit '''&amp;quot;\( \)&amp;quot;''' [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern gruppiert] ist, und dann geht es weiter mit '''&amp;quot;:initdefault&amp;quot;''' und anschließen alle Zeichen bis Zeilenende.&lt;br /&gt;
* Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von '''&amp;quot;\1&amp;quot;''' also dem was vom Muster in der '''\( \)''' Klammer gefunden wird ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern Rückwärtsreferenz]).&lt;br /&gt;
* Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/xdm'''&lt;br /&gt;
 /etc/X11/xdm/SuSEconfig.xdm | \&lt;br /&gt;
 sed 's+\(.*\)+/etc/init.d/xdm: \1+g' | \&lt;br /&gt;
          /bin/logger&lt;br /&gt;
&lt;br /&gt;
* nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit &amp;quot;\&amp;quot; das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.&lt;br /&gt;
* es wird ein Script '''/etc/X11/xdm/SuSEconfig.xdm''' ausgeführt und die Ausgabe durch '''sed''' mit einem s-Befehl gefiltert, diese Ausgabe wird  dem Programm '''/bin/logger''' übergeben.&lt;br /&gt;
* der s-Befehl hat hier die Struktur '''s+++''' da ein '''&amp;quot;+&amp;quot;''' unmittelbar dem '''&amp;quot;s&amp;quot;''' folgt. &lt;br /&gt;
* eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.&lt;br /&gt;
* die Suchmaske ist '''\(.*\)''' und bedeutet soviel wie gruppiert '''\( \)''' wird &amp;quot;Alles&amp;quot; (beliebiges Zeichen, 0 mal oder beliebig oft)&lt;br /&gt;
* ersetzt wird es durch &amp;quot;'''/etc/init.d/xdm: \1'''&amp;quot; , wobei '''\1''' durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.&lt;br /&gt;
* das Flag '''&amp;quot;g&amp;quot;''' ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.&lt;br /&gt;
* Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile '''&amp;quot;/etc/init.d/xdm: &amp;quot;''' einzufügen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/texi2dvi4a2ps'''&lt;br /&gt;
 BEFEHL | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;/p'&lt;br /&gt;
&lt;br /&gt;
* der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.&lt;br /&gt;
* sed wird mit '''&amp;quot;-n&amp;quot;''' gestartet, also keine automatische Ausgabe jeder Zeile&lt;br /&gt;
* der s-Befehl hat keine Adresse und normale Struktur '''s///''' , Flag ist '''&amp;quot;p&amp;quot;''' bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben. &lt;br /&gt;
* Suchmuster ist '''^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$''' ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer '''&amp;quot;\[&amp;quot;''' ; dann kommt irgendetwas oder nichts '''&amp;quot;.*&amp;quot;''' , das wird wiedermal gruppiert '''\( \)''', die Gruppe endet vor der Zeichenfolge '''&amp;quot;version &amp;quot;'''; Anschließend wird nach Zeichen im Format &amp;quot;XXXX-XX-XX&amp;quot; gesucht und irgendwas oder nichts kann bis  Zeilenende kommen.&lt;br /&gt;
* von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.&lt;br /&gt;
* ersetzt wird die gesamte Zeile durch '''&amp;quot;txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;''' die \1 \2 \3 \4  wird durch die Gruppen ersetzt.&lt;br /&gt;
* der sed-Befehl formatiert also eine &amp;quot;Versionszeile&amp;quot; neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 7  (für Fortgeschrittene) ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/autoconf'''&lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot; |&lt;br /&gt;
    sed '/^.*\/\([^/][^/]*\)\/*$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\/\)$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\).*/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          s/.*/./; q'&lt;br /&gt;
&lt;br /&gt;
* hier wird '''&amp;quot;X/&amp;quot;''' vor '''&amp;quot;$0&amp;quot;''' (also der aufgerufene Name des Scriptes) mit '''echo''' ausgegeben und an '''sed''' übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Struktur ====&lt;br /&gt;
&lt;br /&gt;
* der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.&lt;br /&gt;
 /ADRESSE1/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE2/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE3/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
           }&lt;br /&gt;
           s ; q&lt;br /&gt;
* Den sed-Befehl '''&amp;quot;q&amp;quot;''' hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option '''-n''' noch die Ausgabe des Musterspeichers veranlaßt.&lt;br /&gt;
* die Bedeutung, die  '''&amp;quot;{ }&amp;quot;'''  hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ''';''' oder '''\n''' getrennt werden)&lt;br /&gt;
* Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann '''sed''' beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schauen wir uns zuerst die s-Befehle an ====&lt;br /&gt;
&lt;br /&gt;
* die ersten 3 s-Befehle sind gleich '''&amp;quot;s//\1/&amp;quot;''' das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die '''//''' unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe '''&amp;quot;\1&amp;quot;''' beim Ersetzen zu ?&lt;br /&gt;
:: würden wir diesen Befehl auf der Konsole versuchen, '''sed 's//\1/'''' käme eine Fehlermedung, &amp;quot;fehlender Suchstring&amp;quot;&lt;br /&gt;
:: sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.&lt;br /&gt;
* der letzte s-Befehl ist einfach '''&amp;quot;s/.*/./&amp;quot;''' ersetzt alles oder nichts durch einen einzigen Punk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Adressen ====&lt;br /&gt;
 &lt;br /&gt;
* ADRESSE1: '''^.*\/\([^/][^/]*\)\/*$''' wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.&lt;br /&gt;
::gesucht und gruppiert wird &amp;quot;ein mindestens 2 Zeichen langes Wort&amp;quot; Wortbegrenzer ist &amp;quot;/&amp;quot; gefunden wird die ganze Zeile.&lt;br /&gt;
:: Achtung: hier &amp;quot;'''^.*\/'''&amp;quot; treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist.[http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gieriges_Verhalten gieriges Verhalten] '''(Greediness of RegEx)'''&lt;br /&gt;
:: gesucht wird am Zeilenanfang &amp;quot;irgendwas oder nichts bis ein '''&amp;quot;/&amp;quot;''' kommt&amp;quot; &lt;br /&gt;
::: ist in der Shellvariable eine oder mehrere '''&amp;quot;/&amp;quot;''' (also das Programm mit dem Path aufgerufen,) dann wird hier als &amp;quot;irgendwas&amp;quot; der längst mögliche String gefunden &lt;br /&gt;
:: durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der &amp;quot;Scriptname ohne den Path&amp;quot;  &lt;br /&gt;
:: dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet. &lt;br /&gt;
&lt;br /&gt;
* ADRESSE2 '''&amp;quot;^X\/\(\/\/\)$&amp;quot;''' kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.&lt;br /&gt;
:: sie sucht nach '''&amp;quot;X///&amp;quot;''' und gruppiert die letzten beiden '''&amp;quot;/&amp;quot;'''&lt;br /&gt;
:: der s-Befehl würde also '''&amp;quot;//&amp;quot;''' ausgeben und sich beenden.&lt;br /&gt;
&lt;br /&gt;
* ADRESSE3 '''&amp;quot;^X\/\(\/\).*&amp;quot;''' (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem '''&amp;quot;/&amp;quot;''' weniger würde auch fündig werden bei vielen aneinandergereihten '''&amp;quot;/&amp;quot;''' und gibt nur ein '''&amp;quot;/&amp;quot;''' aus&lt;br /&gt;
&lt;br /&gt;
* Treffen keine der 3 Adressen zu, zB weil '''&amp;quot;$0&amp;quot;''' leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Da ist noch ein kleiner Trick im Script versteckt ====&lt;br /&gt;
&lt;br /&gt;
Damit bei einer Leeren &amp;quot;$0&amp;quot; das sed-Programm überhaupt arbeiten kann, wird als Trick &lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot;&lt;br /&gt;
benutzt. Das vorangestellte '''&amp;quot;X/&amp;quot;''' wird beim Ersetzten innerhalb von '''sed''' jedesmal wieder entfernt, aber es sichert bei leeren '''$0''' eine ordnungsgemäße Funktion des Programmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Das Ergebnis des gesamten sed-Programmes ====&lt;br /&gt;
&lt;br /&gt;
Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable '''$0''' und ist entweder der '''&amp;quot;Scriptname ohne Path&amp;quot; ; &amp;quot;//&amp;quot; ; &amp;quot;/&amp;quot;  oder &amp;quot;.&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.grymoire.com/Unix/Sed.html An Introduction and Tutorial]&lt;br /&gt;
* [http://www.tty1.net/sed-tutorium_de.html sed-Tutorium-de]&lt;br /&gt;
* [http://sed.sourceforge.net/sedfaq.html THE SED FAQ]&lt;br /&gt;
* [http://sed.sourceforge.net/#tools Hilfreiche Tools für Sed-Programmierung]&lt;br /&gt;
* [http://www.gnu.org/software/sed/manual/ GNU sed user's manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;!-- ~~~~ --&amp;gt;&lt;br /&gt;
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]&lt;br /&gt;
[[Kategorie:Konsole]][[Kategorie:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33040</id>
		<title>Sed</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Sed&amp;diff=33040"/>
		<updated>2019-06-05T02:46:21Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* Was ist sed und was kann sed ? */ Rechtschreibung...         (hier gibt es ein Problem mit der Diffanzeige)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SED  - eine kleine Einführung und Übersicht über ein mächtiges UNIX-Werkzeug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist sed und was kann sed ? ==&lt;br /&gt;
&lt;br /&gt;
[http://linux.die.net/man/1/sed sed] ('''S'''tream-'''ED'''itor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist '''sed''' nicht. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem &amp;quot;programmiertem Rezept&amp;quot; welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren '''Text-Bearbeitungs-Filter''', mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sed wurde 1973/74 von [http://senseis.xmp.net/?McMahon Lee E. McMahon] entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf [[Reguläre Ausdrücke|Regulären Ausdrücken]] auf und umfasst nur wenige [[#Befehlsübersicht|Befehle]]. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von '''sed''' sind der Zeileneditor [http://linux.die.net/man/1/ed ed] (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor '''[[VIM|vi]]'''.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''sed''' erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. &lt;br /&gt;
  sed 's/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g'&lt;br /&gt;
Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache.&lt;br /&gt;
Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von [[awk]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit '''sed''' schon durchsichtiger, und wer sich öfter und intensiver mit '''sed''' beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit '''sed''' die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit '''sed''' programmiert. In diesem [http://sed.sourceforge.net/grabbag/scripts/ SED Script Archiv] sind einige solcher Programme zu finden. Weitere [http://sed.sourceforge.net/#scripts sed-scripte] und weitere [http://sed.sourceforge.net/#gamez Spiele ] gibt es auf  [http://sed.sourceforge.net/ einer der wichtigsten SED-Seiten] (Web-Seiten geschrieben übrigens mit ? : [http://sed.sourceforge.net/local/scripts/sedindex2html.sed.html natürlich mit sed] ;-))) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Heute gibt es eine Vielzahl von [http://sed.sourceforge.net/sedfaq2.html#s2.2 '''sed''' Implementierungen für die unterschiedlichsten Betriebssysteme] die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der [http://de.wikipedia.org/wiki/Regul%C3%A4re_Ausdr%C3%BCcke Regulären Ausdrücke], da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges [http://www.gnu.org/software/sed/manual/ GNUsed] das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Für was benötigen wir sed heute ? ===&lt;br /&gt;
&lt;br /&gt;
Mit '''sed''' lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.&lt;br /&gt;
&lt;br /&gt;
Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist '''sed''' oftmals ein sehr hilfreiches Tool.&lt;br /&gt;
Darüber hinaus kann man '''sed''' überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:&lt;br /&gt;
&lt;br /&gt;
* Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);&lt;br /&gt;
* Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen&lt;br /&gt;
* das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien&lt;br /&gt;
&lt;br /&gt;
Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird '''sed''' interessant. Mit dem Stream Editor lassen sich eine Vielzahl von [http://sed.sourceforge.net/local/docs/emulating_unix.txt Standardkommandos von UNIX simulieren]. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal '''sed''' als die Lösung für solche Problemfälle finden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um '''sed''' finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf '''sed''' zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell '''sed''' als die kleine elegante Lösung die beste Option. &lt;br /&gt;
&lt;br /&gt;
Für viele kleine Dinge ist '''sed''' durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist '''awk''' (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte '''sed''' auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.&lt;br /&gt;
&lt;br /&gt;
== das Funktionsprinzip ==&lt;br /&gt;
&lt;br /&gt;
Das Prinzip von '''sed''' ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnissprobleme beim Schreiben oder Interpretieren von Sed-Programmen.&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von '''sed''' werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt ''' sed''' den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der '''Zeilenzähler''' wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''sed''' hat einen Textbuffer den sogenannten '''Musterspeicher''', dieser ist beim Starten des Programmes leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diese Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Grundverhalten, dass '''sed''' jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von '''sed''' verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was '''sed''' denn ausgeben soll, wir müssen also  &amp;quot;Print-Befehle&amp;quot; benutzen. Die Option bei Aufruf von '''sed''' dazu ist &amp;quot;'''-n'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option '''-n''' die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option '''-n''' so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.&amp;lt;br&amp;gt;&lt;br /&gt;
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programmes benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programmes von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, Nicht selten Option '''-n''' ;-))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== was beinhaltet sed und was kann man damit machen ===&lt;br /&gt;
&lt;br /&gt;
Neben dem '''Musterspeicher''' gibt es noch einen 2. Textbuffer, den sogenannten '''Haltespeicher'''. Auch dieser ist beim Start des Programmes leer. In ihm könnte man jetzt zB den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige [[#Befehlsübersicht| '''sed''' Kommandos]] mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher durch Haltespeicher ersetzen&lt;br /&gt;
*  Haltespeicher durch Musterspeicher ersetzen&lt;br /&gt;
*  Inhalt von Halte- und Musterspeicher tauschen&lt;br /&gt;
*  Inhalt von Musterspeicher an den Haltespeicher anhängen &lt;br /&gt;
*  Inhalt von Haltespeicher an den Musterspeicher anhängen&lt;br /&gt;
'''Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden.''' er ist nur zum Zwischenspeichern&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und was geht jetzt mit dem Musterspeicher?&amp;lt;br&amp;gt;&lt;br /&gt;
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht zB:&lt;br /&gt;
''&lt;br /&gt;
*  Musterspeicher löschen&lt;br /&gt;
*  die nächste Zeile einlesen&lt;br /&gt;
*  die nächste Zeile hinten hinzufügen&lt;br /&gt;
*  Musterspeicher nach stdout ausgeben&lt;br /&gt;
*  Inhalte mit dem Haltespeicher austauschen&lt;br /&gt;
*  den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben&lt;br /&gt;
*  oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben&lt;br /&gt;
*  den Musterspeicher in eine Datei schreiben&lt;br /&gt;
*  Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht  &lt;br /&gt;
*  einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl [http://linux.die.net/man/1/tr tr])&lt;br /&gt;
*  und das Wichtigste, '''innerhalb des Musterspeichers suchen und ersetzen'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Variablen ?&lt;br /&gt;
: außer dem Haltespeicher und der Variable in der '''sed''' automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts&amp;lt;br&amp;gt;&lt;br /&gt;
; Schleifen ?&lt;br /&gt;
: gibt es auch keine, aber es gibt 2 '''Sprungbefehle''', ähnlich wie '''GOTO-Befehle''' und natürlich einen vorzeitigen Programmabbruch&amp;lt;br&amp;gt; &lt;br /&gt;
Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man '''sed''' schon sogut wie komplett erklärt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wie kann man damit Probleme lösen ===&lt;br /&gt;
&lt;br /&gt;
Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?&lt;br /&gt;
&lt;br /&gt;
Der Befehl, der den Hauptteil der Arbeit innerhalb von '''sed''' leistet, ist oben nur als '''&amp;quot;suchen und ersetzen&amp;quot;''' angegeben. Dieser '''s-Befehl''' ist in der Kombination mit [[Reguläre Ausdrücke|Regulären Ausdürcken]] sehr mächtig, ''([[#der s-Befehl|weiter unten spezielles Kapitel]])''. Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. '''Suchen und ersetzen''' umfasst hier zB auch ''&amp;quot;eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen&amp;quot;''. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren zB: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein kleines Problem, ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit '''sed''' muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von '''sed''' ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden.  Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei '''sed''' nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logig selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Probleme mit '''sed''' anzugehen.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ganze erinnert etwas an [http://de.wikipedia.org/wiki/Assemblersprache Assembler-Programmierung], und nicht ganz unbegründet. Die Mehrzahl der Befehle von '''sed''', sind in ihrer Funktion sehr elementar und nicht unähnlich der Operationen die in einer CPU auf Registerebene auch ausgeführt werden können.  Der Unterschied ist nur, die CPU arbeitet mit Registern  einer definierten Bit Breite  und '''sed''' arbeiten mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir zB. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logig, in '''sed''' gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde. &amp;lt;br&amp;gt;&lt;br /&gt;
1973 da hatten die [http://de.wikipedia.org/wiki/PDP-11 Rechner] Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet ([http://de.wikipedia.org/wiki/Geschichte_von_Unix Geschichte von Unix]).&lt;br /&gt;
&amp;lt;br&amp;gt; Terminals gab es zwar, aber der verbreiteste Weg durch einen Rechner war immernoch, von der [http://technikum29.de/de/rechnertechnik/lochkarten-edv Lochkarte] oder [http://www.pdp8.net/tu56/tu56.shtml einem Magnetband] über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie [http://web.mit.edu/multics-history/source/Multics_Internet_Server/Multics_sources.html  Multics] und [http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm nackte Logig], das gesammte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.&amp;lt;br&amp;gt;&lt;br /&gt;
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== der Aufruf und die Optionen von sed ==&lt;br /&gt;
&lt;br /&gt;
=== die Optionen ===&lt;br /&gt;
 &lt;br /&gt;
Eine Option '''-n''' steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind '''-e''' und  '''-f'''&lt;br /&gt;
&lt;br /&gt;
; sed -e REGEL:&lt;br /&gt;
hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option '''-e REGEL''' kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option '''-e''' ist nicht zwingend erforderlich, '''sed''' interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) &lt;br /&gt;
; sed -f REGELDATEI:&lt;br /&gt;
Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option ''' -f ''' an '''sed''' übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet.&lt;br /&gt;
; weitere Optionen sind abhängig von der speziellen sed-Implementierung :&lt;br /&gt;
diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der Aufruf ===&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 BEFEHL | sed -e 'REGEL' &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 sed  -n -e 'REGEL' EINGABEDATEI &amp;gt; AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 BEFEHL | sed -f REGELDATEI | BEFEHL&lt;br /&gt;
 &lt;br /&gt;
 sed -e 'REGEL1' -f REGELDATEI -e 'REGEL2' &amp;lt;EINGABEDATEI &amp;gt;AUSGABEDATEI&lt;br /&gt;
 &lt;br /&gt;
 VARIABLE=`BEFEHL | sed -e 'REGEL1' | sed -ne 'REGEL2' | BEFEHL ` &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. &lt;br /&gt;
&amp;lt;pre&amp;gt;sed -ne '&lt;br /&gt;
        BEFEHL1\&lt;br /&gt;
            Optionen zum BEFEHL1\&lt;br /&gt;
            weitere Optionen&lt;br /&gt;
        ; BEFEHL2 ; BEFEHL3\&lt;br /&gt;
             Optionen zum BEFEHL3&lt;br /&gt;
        ; BEFEHL4 ; BEFEHL5&lt;br /&gt;
 '&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sed-Programm als Script ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die '''[http://de.wikipedia.org/wiki/Shebang Magic Line''' (shebang)]&lt;br /&gt;
 #!/usr/bin/sed -f &lt;br /&gt;
(eventuell noch zusätzlich die Option '''-n''') gesetzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Übergabe von Shell-Variablen an Sed-Programme ====&lt;br /&gt;
&lt;br /&gt;
'''sed''' selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von '''sed''' entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.&lt;br /&gt;
&lt;br /&gt;
Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann '''$Shellvariable'''. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 sed -n '&lt;br /&gt;
 '/$1/' !{&lt;br /&gt;
  	#no match - put the current line in the hold buffer&lt;br /&gt;
 	x&lt;br /&gt;
 	# delete the old one, which is &lt;br /&gt;
 	# now in the pattern buffer&lt;br /&gt;
 	d&lt;br /&gt;
 }'&lt;br /&gt;
Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;/$1/&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'&amp;lt;/font&amp;gt;!{ '''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
die roten Hochkommas lassen die Shell '''/$1/''' sehen und damit wird die Shell beim Aufruf von '''sed''' an dieser Stelle anstatt '''$1''' den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von '''sed'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Nutzung von sed in Here-Dokuments's ====&lt;br /&gt;
&lt;br /&gt;
Eine weitere häufig benutzte Aufrufmöglichkeit von '''sed''' innerhalb von Shell-Scripten ist das [http://en.wikipedia.org/wiki/Heredoc Here Document]&lt;br /&gt;
Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die '''sed''' verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
KASSE=129.32&lt;br /&gt;
WAEHRUNG=&amp;quot;EURO&amp;quot;&lt;br /&gt;
MITARBEITER=&amp;quot;Hr. Maier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
sed -e 's/XXXX/'$KASSE'/g;s/YYYY/'&amp;quot;$WAEHRUNG&amp;quot;'/g;s/ZZZZ/'&amp;quot;$MITARBEITER&amp;quot;'/g' &amp;lt;&amp;lt;EOF&lt;br /&gt;
Der Bargeldbestand von XXXX YYYY wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer ZZZZ&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter '''XXXX ; YYYY ; ZZZZ ''' werden durch '''sed''' dann durch diese Werte ersetzt, die '''sed''' beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt.&lt;br /&gt;
&amp;lt;pre&amp;gt;Der Bargeldbestand von 129.32 EURO wurde heute festgestellt&lt;br /&gt;
verantwortlich ist wie immer Hr. Maier&amp;lt;/pre&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== die Befehle ==&lt;br /&gt;
&lt;br /&gt;
Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)&lt;br /&gt;
* p  = '''p'''rint&lt;br /&gt;
* l  = '''l'''ist&lt;br /&gt;
* i  = '''i'''insert&lt;br /&gt;
* a  = '''a'''pend&lt;br /&gt;
*usw&lt;br /&gt;
&lt;br /&gt;
zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Adressierung der Befehle ===&lt;br /&gt;
&lt;br /&gt;
Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können zB mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen.  Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, ( also &amp;quot;alle Anderen außer den adressierten Zeilen&amp;quot; treffen zu  )&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt&lt;br /&gt;
* gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen&lt;br /&gt;
* viele haben 2 Adressen in der Schreibweise '''Adresse1,Adresse2''' Hier handelt es sich um ein '''von Adresse1  bis zur Adresse2'''&lt;br /&gt;
* (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (zB '''3~4''' würde bedeuten ab Zeile 3 jede 4.Zeile) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Adressierungsmöglichkeiten unterliegen folgenden Regeln&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei&lt;br /&gt;
* Eine Adresse kann ein Regulären Ausdruck sein  '''/regex/''' entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch '''\%regex\%''' zu schreiben, wobei '''%''' ein beliebiges Zeichen ist)&lt;br /&gt;
* zwei Adressen '''Zahl1,Zahl2''' enspricht von Zeilennummer '''Zahl1''' bis Zeilennummer '''Zahl2''' bezogen auf die Eingangsdatei&lt;br /&gt;
* '''/regex1/,/regex2/''' bedeutet vom der Zeile die '''regex1''' erfüllt bis zur Zeile die '''regex2''' erfüllt &lt;br /&gt;
* Kominationen von '''Zahl,/regex/''' und '''/regex/,Zahl''' sind möglich&lt;br /&gt;
* anstatt einer Zahl das Zeichen '''$''' bedeutet die letzte Zeile&lt;br /&gt;
* Zeilenberechnungen mit Zeilennummern wie zB '''$-10''' (als Adresse für die letzten 10 Zeilen gemeint) geht nicht &lt;br /&gt;
* Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in '''{ }''' eingeschlossen sind und durch ''';''' voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. ''' Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen''' &lt;br /&gt;
* Das Zeichen '''!''' zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispiele für Adressierung ====&lt;br /&gt;
&lt;br /&gt;
einfache Beispiel in Kombination mit den Befehlen '''p'''rint und '''d'''elete und der Einfluss der Option '''-n'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '1,10p'          # Zeilen 1 bis 10 ausgeben&lt;br /&gt;
sed -e  '1,10p'          # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben&lt;br /&gt;
sed -e  '2d'             # 2. Zeile löschen&lt;br /&gt;
sed -e  '2,10!d'         # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -ne '2,10p'          # Zeilen 2 bis 10 ausgeben&lt;br /&gt;
sed -e  '10,$p'          # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben&lt;br /&gt;
sed -ne  '$p'            # letzte Zeile ausgeben&lt;br /&gt;
&lt;br /&gt;
sed -e  '/Text/d'        # Alle Zeilen die nicht &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -e  '/Text/!d'       # Alle Zeilen die &amp;quot;Text&amp;quot; enthalten, ausgeben&lt;br /&gt;
sed -ne '/Text/,$!p'     # Alle Zeilen bevor eine Zeile mit &amp;quot;Text&amp;quot; kommt, ausgeben&lt;br /&gt;
sed -ne '/Begin/,/END/p' # Alle Zeilen von &amp;quot;Begin&amp;quot; bis &amp;quot;END&amp;quot; ausgeben (wird &amp;quot;END&amp;quot; nicht gefunden bis Schluss)&lt;br /&gt;
                         # Kommt nach einem &amp;quot;END&amp;quot; wieder ein &amp;quot;Begin&amp;quot; dann von dort aus wieder ausgeben &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hier jetzt mal ein paar Beispiele zur Verwendung von [http://sed.sourceforge.net/sedfaq3.html#s3.7 Charakter Klassen] und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[[:alnum:]]/!p' # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen&lt;br /&gt;
sed -ne '3~2p'             # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 )&lt;br /&gt;
sed -ne '5,/Text/p'        # Ab der 5.Zeile bis zu einer Zeile mit &amp;quot;Text&amp;quot; ausgeben&lt;br /&gt;
sed -ne '3,+7p'            # Die 3.Zeile und die 7 folgenden Zeilen ausgeben&lt;br /&gt;
sed -ne '/Begin/,+2p'      # Die Zeilen die &amp;quot;Begin&amp;quot; enthalten und jeweils die nächsten 2 Zeilen ausgeben&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -ne '/^[EBH]/p'               # alle Zeilen die mit &amp;quot;E&amp;quot;,&amp;quot;B&amp;quot; oder &amp;quot;H&amp;quot; beginnen ausgeben&lt;br /&gt;
sed -e  '/^$/d'                   # alle leeren Zeilen löschen&lt;br /&gt;
sed -ne '/^[^#].*/p'              # jede Zeile ausgeben, die mit einem anderem Zeichen als &amp;quot;#&amp;quot; beginnt&lt;br /&gt;
sed -ne '/^[[:space:]]*#/d'       # Zeilen deren erstes Zeichen (außer Space und Tabulator) &amp;quot;#&amp;quot; ist, löschen&lt;br /&gt;
sed -ne '/^.\{64\}/p'             # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben&lt;br /&gt;
sed -ne '/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p'&lt;br /&gt;
                                  # druckt jede Zeile in der eine IP-Adresse enthalten sein könnte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei '''sed''' noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also  bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um zB alle fehlerfreien Zeilen zu suchen, die einen Zeitstring  '''YYYY-MM-DD''' entsprechen wie ihn zB auch '''date +%F''' liefert, müsste man mit '''sed''' wie folgt adressieren. Hier mal gleich der Konsolausdruck. ;-)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # cat test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2007-13-01&lt;br /&gt;
2006-06-31&lt;br /&gt;
2008-30-02&lt;br /&gt;
2005-02-29&lt;br /&gt;
2006-11-31&lt;br /&gt;
2008-00-02&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: # sed -ne '/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p' test1&lt;br /&gt;
2008-10-02&lt;br /&gt;
2008-03-19&lt;br /&gt;
2007-09-01&lt;br /&gt;
2006-07-28&lt;br /&gt;
2008-10-05&lt;br /&gt;
2004-02-29&lt;br /&gt;
LINUX: #   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei '''sed''' bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch [http://regexp-evaluator.de/evaluator/ Tools] und jede Menge gute Seiten im WWW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ein paar Regeln zu Regulären Ausdrücken in sed ====&lt;br /&gt;
&lt;br /&gt;
Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit '''sed''' und Regulären Ausdrücken mal hier einige  Regeln&amp;lt;br&amp;gt;&lt;br /&gt;
'''sed''' verwendet '''&amp;quot;Basic Regular Expressions&amp;quot;''' einige Unterschiede zu den '''&amp;quot;Erweiterten Regulären Ausdrücken&amp;quot;''' sind zB:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*   Die Quantifikatoren &amp;quot;'''|'''&amp;quot;, &amp;quot;'''+'''&amp;quot; und &amp;quot;'''?'''&amp;quot; sind normale Zeichen ''(GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash &amp;quot;escaped&amp;quot; werden)''&lt;br /&gt;
&lt;br /&gt;
*   die Klammern '''&amp;quot;{&amp;quot; &amp;quot;}&amp;quot; &amp;quot;(&amp;quot; ''' und ''' &amp;quot;)&amp;quot;''' sind normale Zeichen und müssen mit Backslashes &amp;quot;escaped&amp;quot; (aktiviert) werden, also als &amp;quot;'''\{'''&amp;quot; ; &amp;quot;'''\}'''&amp;quot; ; &amp;quot;'''\('''&amp;quot; und  &amp;quot;'''\)'''&amp;quot;geschrieben werden. &lt;br /&gt;
&lt;br /&gt;
*   die Zeichen, die durch &amp;quot;'''\('''&amp;quot; und &amp;quot;'''\)'''&amp;quot; eingeschlossen werden, können später mit &amp;quot;'''\1'''&amp;quot; usw. (max &amp;quot;'''\9'''&amp;quot; ) dereferenziert werden&lt;br /&gt;
&lt;br /&gt;
*   &amp;quot;'''^'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht&lt;br /&gt;
 &lt;br /&gt;
*   &amp;quot;'''$'''&amp;quot; ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht&lt;br /&gt;
    &lt;br /&gt;
*   &amp;quot;'''*'''&amp;quot; ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der s-Befehl ===&lt;br /&gt;
&lt;br /&gt;
Der mit Abstand wichtigste Befehl in '''sed''', der Befehl '''&amp;quot;s///&amp;quot;'''. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit [[VIM|vi oder VIM]] beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit &amp;quot;suchen und ersetzen&amp;quot; erklärt. Die Schreibweise: &amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;font face=&amp;quot;Arial&amp;quot; size=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[ADRESSE]&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''s/'''&amp;lt;/font&amp;gt;SUCHMUSTER&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;ERSETZUNG&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''/'''&amp;lt;/font&amp;gt;[FLAG] &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''ADRESSE''' ist der optionale Ausdruck wie er [[#Adressierung der Befehle|oben]] schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet&lt;br /&gt;
* '''FLAG''' steuert die Eigenschaften des Befehls und ist ebenfalls optional, [[#Adressierung der Befehle|Übersicht der möglichen Flags]]; ist kein Flag angegeben, gilt '''1''' ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.&lt;br /&gt;
* '''s''' ist der Befehlsname selbst&lt;br /&gt;
* '''SUCHMUSTER''' ist ein [[Reguläre Ausdrücke|Regulärer Ausdruck]] nach dem gesucht wird&lt;br /&gt;
* '''ERSETZUNG''' enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.&lt;br /&gt;
* Als Abrenzung der einzelnen Optionen sind  3 '''&amp;quot;/&amp;quot;''' Begrenzer zu setzen. ''(Bei Bedarf darf hier auch statt '''&amp;quot;/&amp;quot;''' jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf '''s''' folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen.&lt;br /&gt;
 sed -e 's/Strauch/Baum/g'&lt;br /&gt;
; Erläuterung&lt;br /&gt;
: * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet&lt;br /&gt;
: * Reguläre Suchausdruck lautet in diesem Beispiel einfach '''&amp;quot;Strauch&amp;quot;'''&lt;br /&gt;
: * Der Ersetzungtext ist '''&amp;quot;Baum&amp;quot;'''&lt;br /&gt;
: * als Flag wird '''&amp;quot;global&amp;quot;''' verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt.&lt;br /&gt;
: * da sed ohne die Option '''-n''' gestartet wurde erfolgt eine automatische Ausgabe.&lt;br /&gt;
&lt;br /&gt;
Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination &amp;quot;Stauch&amp;quot; durch &amp;quot;Baum&amp;quot; ersetzt, also nicht nur das Wort Strauch selbst, sonder zB würde aus dem Wort &amp;quot;Strauchdieb&amp;quot; das Wort  &amp;quot;Baumdieb&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann.  &lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== die Bedeutung der Flags ====&lt;br /&gt;
&lt;br /&gt;
Mit den Flags kann die Funktion des '''s-Befehls''' gesteuert werden. Ist kein Flag angegeben gilt '''1''' ; also nur Ersetzung des ersten Vorkommens des gefunden Strings&lt;br /&gt;
&lt;br /&gt;
{| border=1&lt;br /&gt;
|+ '''Bedeutung der Flags beim s-Befehl '''&lt;br /&gt;
!  Flag   !! Bedeutung !! Beispiel   !! Bemerkung&lt;br /&gt;
|- &lt;br /&gt;
!| N     &lt;br /&gt;
|| N=Zahl (1 &amp;lt; 512) ; das N'te Vorkommen &lt;br /&gt;
!| s/AB/CD/2 &lt;br /&gt;
|| wird N nicht angegeben dann erste Vorkommen &lt;br /&gt;
|- &lt;br /&gt;
!| g     &lt;br /&gt;
|| global ;  alle Vorkommen &lt;br /&gt;
!| s/AB/CD/g &lt;br /&gt;
|| es werden alle Vorkommen ersetzt &lt;br /&gt;
|- &lt;br /&gt;
!| p     &lt;br /&gt;
|| print ; Ausgabe bei Ersetzung &lt;br /&gt;
!| s/AB/CD/p &lt;br /&gt;
|| wurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben &lt;br /&gt;
|- &lt;br /&gt;
!| w DATEI     &lt;br /&gt;
|| write DATEI bei Ersetzung &lt;br /&gt;
!| s/AB/CD/w FILE&lt;br /&gt;
|| bei Ersetzung Ausgabe des Buffers in die angegebene Datei&lt;br /&gt;
|- &lt;br /&gt;
!| i     &lt;br /&gt;
|| case-insensitive ; Groß-Kleinschreibung ignorieren &lt;br /&gt;
!| s/AB/CD/i &lt;br /&gt;
|| ist &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; zu allen SED-Implementierung&lt;br /&gt;
|- &lt;br /&gt;
!| m    &lt;br /&gt;
|| || &lt;br /&gt;
|| betrifft Interpretation von '''^ '''und''' $''' ; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; &lt;br /&gt;
|- &lt;br /&gt;
!| x     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|-&lt;br /&gt;
!| s     &lt;br /&gt;
|| ||  &lt;br /&gt;
|| &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;nicht kompatibel&amp;lt;/font&amp;gt; ; nur bei ssed im Perlmodus &lt;br /&gt;
|}&lt;br /&gt;
es sind auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. zB&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX: # echo &amp;quot;abcabcabc&amp;quot; | sed -ne 's/AB/CD/2ip'&lt;br /&gt;
abcCDcabc&lt;br /&gt;
LINUX: # &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== kleine Befehlsbeispiele zum Suchen und Ersetzten ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -e 's/blau\|lila/rot/2'     # Das 2.Vorkommen je Zeile von &amp;quot;blau&amp;quot; oder &amp;quot;lila&amp;quot; wird durch &amp;quot;rot&amp;quot; ersetzt&lt;br /&gt;
&lt;br /&gt;
sed -e '/^$/!s/^/#/ '           # bei alle nichtleeren Zeilen am Zeilenanfang &amp;quot;#&amp;quot; einfügen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/#.*$//'               # von einem Zeichen &amp;quot;#&amp;quot; bis zum Zeilenende alles löschen&lt;br /&gt;
&lt;br /&gt;
sed 's/^[ \t]*//;s/[ \t]*$//'   # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen&lt;br /&gt;
&lt;br /&gt;
sed -e 's/Michael[^a]/Herr &amp;amp;/'  # ersetze &amp;quot;Michael&amp;quot; durch &amp;quot;Herr Michael&amp;quot; jedoch nicht wenn hinter &amp;quot;Michael&amp;quot; ein &amp;quot;a&amp;quot; folgt.&lt;br /&gt;
&lt;br /&gt;
sed -e 's/[Cc]olor/[b]&amp;amp;[\/b]/g' # jedes &amp;quot;Color&amp;quot; und &amp;quot;color&amp;quot; in &amp;quot;[b]Color[/b]&amp;quot; oder &amp;quot;[b]color[/b]&amp;quot; änderen&lt;br /&gt;
&lt;br /&gt;
date +%F | sed -e 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/'&lt;br /&gt;
                                #das Datumsformat YYYY-MM-DD umwandeln zu &amp;quot;heute ist der DD.MM. YYYY&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Besonderheiten der Beispiele'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Beispiel: es wird eine Oderverknüpfung benutzt  '''|''' muss dabei entwertet werden also '''\|'''&lt;br /&gt;
# Beispiel: Verwendung der Sonderzeichen '''^''' für Zeilenanfang und '''$''' für Zeilenende&lt;br /&gt;
# Beispiel: '''#.*$''' bedeutet Zeichen '''#''' anschließend müssen 0 oder beliebig viele beliebige Zeichen '''(.*)''' stehen, bis Zeilenende '''($)''' ; alles wird durch NICHTS ersetzt '''(//)'''&lt;br /&gt;
# Beispiel: '''[ \t]''' an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das '''&amp;quot;*&amp;quot;''' darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch '''&amp;quot;;&amp;quot;''' getrennt, beide werden hintereinander auf alle Zeilen ausgeführt. &lt;br /&gt;
# Beispiel: '''[^a]''' das '''&amp;quot;a&amp;quot;''' ist durch '''&amp;quot;^&amp;quot;''' negiert, das Bedeutet ('''nicht &amp;quot;a&amp;quot;''') an dieser Stelle, das '''&amp;quot;&amp;amp;&amp;quot;''' im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.&lt;br /&gt;
# Beispiel: Im Ersetzungsfeld steht wieder '''&amp;quot;&amp;amp;&amp;quot;''' der '''&amp;quot;/&amp;quot;''' im Ersetzungstext musste entwertet werden '''&amp;quot;\/&amp;quot;'''    &lt;br /&gt;
# Beispiel: Hier haben wir zum einem '''&amp;quot;\{ \}&amp;quot;''' mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier zB '''[0-9]\{4\}''' bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir '''&amp;quot;\( \)&amp;quot;''' das ist eine Gruppierung (ähnlich einer Variable)  mit '''&amp;quot;\1&amp;quot; bis &amp;quot;\9&amp;quot;''' kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus '''&amp;quot;\3 \2 \1&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Befehlsübersicht ===&lt;br /&gt;
&lt;br /&gt;
{| border=2&lt;br /&gt;
|+ '''Übersicht der Befehle und Schlüsselworte'''&lt;br /&gt;
!  Kommando   !!    Addr      !!   stdin   !!  stdout  !!  Muster Speicher !! Halte Speicher !! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;;&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Trennzeichen zwischen einzelner Befehle&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;!&amp;lt;/font&amp;gt; || - || - || - || - || - &lt;br /&gt;
|| Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{ }&amp;lt;/font&amp;gt; || 2 || - || - || - || - &lt;br /&gt;
|| umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ''';''' getrennt werden&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;#&amp;lt;/font&amp;gt;  || - || - || - || - || - &lt;br /&gt;
||Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;:&amp;lt;/font&amp;gt; MARKE || - || - || - || - || - &lt;br /&gt;
|| definiert das Sprungziel '''MARKE''' Siehe Kommandos '''b''' oder '''t'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;=&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| gibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;a&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text nach der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;b&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| Sprungbefehl zur '''MARKE''' bzw. zum Ende des Scripts&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;c&amp;lt;/font&amp;gt;  || 2 || - || X || X || - &lt;br /&gt;
|| Musterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;d&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;D&amp;lt;/font&amp;gt; || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher bis zum Zeichen „newline“ löschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;g&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Musterspeicher wird durch den Inhalt des Haltespeicher ersetzt.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;G&amp;lt;/font&amp;gt;  || 2 || - || - || X || - &lt;br /&gt;
|| Haltespeicher wird an den Inhalt des Musterspeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;h&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Haltespeicher wird durch den Inhalt des Musterspeicher ersetzt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;H&amp;lt;/font&amp;gt;  || 2 || - || - || - || X &lt;br /&gt;
|| Musterspeicher wird an den Inhalt des Haltespeicher angefügt&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;i&amp;lt;/font&amp;gt;  || 1 || - || X || - || - &lt;br /&gt;
|| gibt die nachfolgenden Text vor der Ausgabe des Buffers aus&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;l&amp;lt;/font&amp;gt;  || 1 || - || X || - || -&lt;br /&gt;
|| Musterspeicher ausgegeben. (&amp;quot;C-Notation&amp;quot; unbekannte Zeichen in Oktalformat)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;n&amp;lt;/font&amp;gt;  || 2 || X || ? || X || - &lt;br /&gt;
|| je nach Option '''-n''' wird der Buffer ausgegeben oder nicht, neue Zeile laden &lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;N&amp;lt;/font&amp;gt;  || 2 || X || - || X || - &lt;br /&gt;
|| Nächste Zeile an Inhalt des Musterspeichers angefügen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;p&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;P&amp;lt;/font&amp;gt;  || 2 || - || X || - || - &lt;br /&gt;
|| Musterspeicher bis zum nächsten „newline“-Zeichen ausgeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;q&amp;lt;/font&amp;gt;  || 1 || - || - || - || - &lt;br /&gt;
|| sed Beenden, bei nicht gesetzter Option '''-n''' wird Musterspeicher ausgegeben&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;r&amp;lt;/font&amp;gt;  FILE|| 1 || - || X || - || - &lt;br /&gt;
|| Inhalt einer angegebenen '''FILE''' wird eingelesen und ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;s&amp;lt;/font&amp;gt;/regex/rpl/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt '''regex''' durch '''rpl'''. Null oder mehrere '''flg''' wirken steuernd ein&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;t&amp;lt;/font&amp;gt;  MARKE || 2 || - || - || - || - &lt;br /&gt;
|| bedingter Sprungbefehl zur '''MARKE''' abhängig von vorheriger '''s''' oder '''y''' Kommandos&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;w&amp;lt;/font&amp;gt;  FILE|| 2 || - || X || - || - &lt;br /&gt;
|| Schreibt Musterspeicher in '''FILE'''&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;x&amp;lt;/font&amp;gt;  || 2 || - || - || X || X &lt;br /&gt;
|| Inhalt von Muster- und Haltespeicher vertauschen&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;y&amp;lt;/font&amp;gt;/src/rpc/flg|| 2 || - || - || X || - &lt;br /&gt;
|| Ersetzt jedes Zeichen im pattern buffer welches in '''src''' vorkommt durch das entsprechenden Zeichen in '''rpc'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== kleine sed Programme am praktischen Beispiel erklärt ==&lt;br /&gt;
&lt;br /&gt;
Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten.  Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen.&lt;br /&gt;
Machen wir doch die Probe aufs Exempel: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/rpmconfigcheck'''&lt;br /&gt;
 sed -e 's/^/    /' &amp;lt; $configcheckfile&lt;br /&gt;
* einfacher s-Befehl, Eingabedatei ist der Variable '''configcheckfile''' gespeichert&lt;br /&gt;
* '''&amp;quot;^&amp;quot;''' Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/smbfs'''&lt;br /&gt;
 mountpoint=$( echo &amp;quot;$mountpoint&amp;quot;|sed &amp;quot;s/\/*$//&amp;quot;)&lt;br /&gt;
* es wird die Variable '''mountpoint''' (in der scheinbar Text steht) mit '''echo''' ausgegeben, durch '''sed''' gefiltert und die Ausgabe wieder in der Variable '''mountpoint''' gespeichert&lt;br /&gt;
* '''&amp;quot;s/\/*$//&amp;quot;''' Trennzeichen ist '''&amp;quot;/&amp;quot;''' das haben wir aber 4 Mal ;-) , Beim näheren Hinsehen ist das 2 '''&amp;quot;/&amp;quot;''' mit '''&amp;quot;\&amp;quot;''' entwertet &lt;br /&gt;
* damit lautet unsere Suchmaske ohne Quotierung &amp;quot;'''/*$'''&amp;quot; und das ist schlichtweg als letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) '''&amp;quot;/&amp;quot;''' ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren_.28Angabe_der_Anzahl_Wiederholungen.29 Quantoren]) &lt;br /&gt;
gemeint&lt;br /&gt;
* ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle '''&amp;quot;/&amp;quot;''' am Ende des Variableinhaltes abzuschneiden &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/fbset'''&lt;br /&gt;
 mode=`echo $FBSET_PARAMS | sed -e 's/^-[^ ]*//' -e 's/ -[^ ]*//g'`&lt;br /&gt;
* auch hier wird der Inhalt einer Variable durch '''sed''' gefiltert und das Ergebnis in einer anderen Variable gespeichert&lt;br /&gt;
* '''sed''' hat hier 2 Regeln wie wir an 2 mal '''-e''' und der Quotierung schnell herauslesen. &lt;br /&gt;
* die erste Regel ist ein s-Befehl, Suchmuster ist '''&amp;quot;^-[^ ]*&amp;quot;''' bedeutet Am Zeilenanfang '''&amp;quot;^&amp;quot;''' ein '''&amp;quot;-&amp;quot;''' und dann''' &amp;quot;[^ ]*&amp;quot;''' also [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Ein_Zeichen_aus_einer_Auswahl alles andere nur kein Leerzeichen] und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.&lt;br /&gt;
* die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein,  dann wird auch bis zum nächsten  Leerzeichen nach dem Strich alles gelöscht. &lt;br /&gt;
* der 2. Befehl arbeitet global, das heist es werden alle &amp;quot; -irgendwas&amp;quot; gelöscht.&lt;br /&gt;
* In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem &amp;quot;-&amp;quot; aus dem Variabelinhalt zu beseitigen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/network''' &lt;br /&gt;
 RL=`sed -n 's=^id:\(.\):initdefault.*$=\1=p' /etc/inittab`&lt;br /&gt;
* der Inhalt von /etc/inittab wird durch '''sed''' gefiltert und in der Variable''' RL''' abgelegt.&lt;br /&gt;
* es ist ein s-Befehl '''-n''', also keine automatische Ausgabe,&lt;br /&gt;
*Dieses Mal ist das Begrenzungszeichen '''&amp;quot;=&amp;quot;''' da es unmittelbar nach dem '''&amp;quot;s&amp;quot;''' kommt, der Befehl hat also hier die Struktur '''s===''' und nicht wie bisher gewohnt '''s///'''&lt;br /&gt;
* als Flag haben wir ein '''&amp;quot;p&amp;quot;''', also sollte '''sed''' hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben&lt;br /&gt;
* Suchmuster: am Anfang '''&amp;quot;id:&amp;quot;''' dann kommt [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Beliebiges_Zeichen irgend ein Zeichen] das mit '''&amp;quot;\( \)&amp;quot;''' [http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern gruppiert] ist, und dann geht es weiter mit '''&amp;quot;:initdefault&amp;quot;''' und anschließen alle Zeichen bis Zeilenende.&lt;br /&gt;
* Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von '''&amp;quot;\1&amp;quot;''' also dem was vom Muster in der '''\( \)''' Klammer gefunden wird ([http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gruppierung_mit_runden_Klammern Rückwärtsreferenz]).&lt;br /&gt;
* Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/etc/rc.d/xdm'''&lt;br /&gt;
 /etc/X11/xdm/SuSEconfig.xdm | \&lt;br /&gt;
 sed 's+\(.*\)+/etc/init.d/xdm: \1+g' | \&lt;br /&gt;
          /bin/logger&lt;br /&gt;
&lt;br /&gt;
* nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit &amp;quot;\&amp;quot; das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.&lt;br /&gt;
* es wird ein Script '''/etc/X11/xdm/SuSEconfig.xdm''' ausgeführt und die Ausgabe durch '''sed''' mit einem s-Befehl gefiltert, diese Ausgabe wird  dem Programm '''/bin/logger''' übergeben.&lt;br /&gt;
* der s-Befehl hat hier die Struktur '''s+++''' da ein '''&amp;quot;+&amp;quot;''' unmittelbar dem '''&amp;quot;s&amp;quot;''' folgt. &lt;br /&gt;
* eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.&lt;br /&gt;
* die Suchmaske ist '''\(.*\)''' und bedeutet soviel wie gruppiert '''\( \)''' wird &amp;quot;Alles&amp;quot; (beliebiges Zeichen, 0 mal oder beliebig oft)&lt;br /&gt;
* ersetzt wird es durch &amp;quot;'''/etc/init.d/xdm: \1'''&amp;quot; , wobei '''\1''' durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.&lt;br /&gt;
* das Flag '''&amp;quot;g&amp;quot;''' ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.&lt;br /&gt;
* Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile '''&amp;quot;/etc/init.d/xdm: &amp;quot;''' einzufügen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6 ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/texi2dvi4a2ps'''&lt;br /&gt;
 BEFEHL | sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;/p'&lt;br /&gt;
&lt;br /&gt;
* der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.&lt;br /&gt;
* sed wird mit '''&amp;quot;-n&amp;quot;''' gestartet, also keine automatische Ausgabe jeder Zeile&lt;br /&gt;
* der s-Befehl hat keine Adresse und normale Struktur '''s///''' , Flag ist '''&amp;quot;p&amp;quot;''' bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben. &lt;br /&gt;
* Suchmuster ist '''^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$''' ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer '''&amp;quot;\[&amp;quot;''' ; dann kommt irgendetwas oder nichts '''&amp;quot;.*&amp;quot;''' , das wird wiedermal gruppiert '''\( \)''', die Gruppe endet vor der Zeichenfolge '''&amp;quot;version &amp;quot;'''; Anschließend wird nach Zeichen im Format &amp;quot;XXXX-XX-XX&amp;quot; gesucht und irgendwas oder nichts kann bis  Zeilenende kommen.&lt;br /&gt;
* von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.&lt;br /&gt;
* ersetzt wird die gesamte Zeile durch '''&amp;quot;txiformat=\1 txiversion=&amp;quot;\2\3\4&amp;quot;''' die \1 \2 \3 \4  wird durch die Gruppen ersetzt.&lt;br /&gt;
* der sed-Befehl formatiert also eine &amp;quot;Versionszeile&amp;quot; neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 7  (für Fortgeschrittene) ===&lt;br /&gt;
&lt;br /&gt;
gefunden in '''/usr/bin/autoconf'''&lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot; |&lt;br /&gt;
    sed '/^.*\/\([^/][^/]*\)\/*$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\/\)$/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          /^X\/\(\/\).*/{&lt;br /&gt;
            s//\1/&lt;br /&gt;
            q&lt;br /&gt;
          }&lt;br /&gt;
          s/.*/./; q'&lt;br /&gt;
&lt;br /&gt;
* hier wird '''&amp;quot;X/&amp;quot;''' vor '''&amp;quot;$0&amp;quot;''' (also der aufgerufene Name des Scriptes) mit '''echo''' ausgegeben und an '''sed''' übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Struktur ====&lt;br /&gt;
&lt;br /&gt;
* der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.&lt;br /&gt;
 /ADRESSE1/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE2/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
          }&lt;br /&gt;
 /ADRESSE3/{&lt;br /&gt;
           s///&lt;br /&gt;
           q&lt;br /&gt;
           }&lt;br /&gt;
           s ; q&lt;br /&gt;
* Den sed-Befehl '''&amp;quot;q&amp;quot;''' hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option '''-n''' noch die Ausgabe des Musterspeichers veranlaßt.&lt;br /&gt;
* die Bedeutung, die  '''&amp;quot;{ }&amp;quot;'''  hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ''';''' oder '''\n''' getrennt werden)&lt;br /&gt;
* Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann '''sed''' beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schauen wir uns zuerst die s-Befehle an ====&lt;br /&gt;
&lt;br /&gt;
* die ersten 3 s-Befehle sind gleich '''&amp;quot;s//\1/&amp;quot;''' das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die '''//''' unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe '''&amp;quot;\1&amp;quot;''' beim Ersetzen zu ?&lt;br /&gt;
:: würden wir diesen Befehl auf der Konsole versuchen, '''sed 's//\1/'''' käme eine Fehlermedung, &amp;quot;fehlender Suchstring&amp;quot;&lt;br /&gt;
:: sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.&lt;br /&gt;
* der letzte s-Befehl ist einfach '''&amp;quot;s/.*/./&amp;quot;''' ersetzt alles oder nichts durch einen einzigen Punk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Analyse der Adressen ====&lt;br /&gt;
 &lt;br /&gt;
* ADRESSE1: '''^.*\/\([^/][^/]*\)\/*$''' wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.&lt;br /&gt;
::gesucht und gruppiert wird &amp;quot;ein mindestens 2 Zeichen langes Wort&amp;quot; Wortbegrenzer ist &amp;quot;/&amp;quot; gefunden wird die ganze Zeile.&lt;br /&gt;
:: Achtung: hier &amp;quot;'''^.*\/'''&amp;quot; treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist.[http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Gieriges_Verhalten gieriges Verhalten] '''(Greediness of RegEx)'''&lt;br /&gt;
:: gesucht wird am Zeilenanfang &amp;quot;irgendwas oder nichts bis ein '''&amp;quot;/&amp;quot;''' kommt&amp;quot; &lt;br /&gt;
::: ist in der Shellvariable eine oder mehrere '''&amp;quot;/&amp;quot;''' (also das Programm mit dem Path aufgerufen,) dann wird hier als &amp;quot;irgendwas&amp;quot; der längst mögliche String gefunden &lt;br /&gt;
:: durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der &amp;quot;Scriptname ohne den Path&amp;quot;  &lt;br /&gt;
:: dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet. &lt;br /&gt;
&lt;br /&gt;
* ADRESSE2 '''&amp;quot;^X\/\(\/\/\)$&amp;quot;''' kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.&lt;br /&gt;
:: sie sucht nach '''&amp;quot;X///&amp;quot;''' und gruppiert die letzten beiden '''&amp;quot;/&amp;quot;'''&lt;br /&gt;
:: der s-Befehl würde also '''&amp;quot;//&amp;quot;''' ausgeben und sich beenden.&lt;br /&gt;
&lt;br /&gt;
* ADRESSE3 '''&amp;quot;^X\/\(\/\).*&amp;quot;''' (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem '''&amp;quot;/&amp;quot;''' weniger würde auch fündig werden bei vielen aneinandergereihten '''&amp;quot;/&amp;quot;''' und gibt nur ein '''&amp;quot;/&amp;quot;''' aus&lt;br /&gt;
&lt;br /&gt;
* Treffen keine der 3 Adressen zu, zB weil '''&amp;quot;$0&amp;quot;''' leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Da ist noch ein kleiner Trick im Script versteckt ====&lt;br /&gt;
&lt;br /&gt;
Damit bei einer Leeren &amp;quot;$0&amp;quot; das sed-Programm überhaupt arbeiten kann, wird als Trick &lt;br /&gt;
 echo X/&amp;quot;$0&amp;quot;&lt;br /&gt;
benutzt. Das vorangestellte '''&amp;quot;X/&amp;quot;''' wird beim Ersetzten innerhalb von '''sed''' jedesmal wieder entfernt, aber es sichert bei leeren '''$0''' eine ordnungsgemäße Funktion des Programmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Das Ergebnis des gesamten sed-Programmes ====&lt;br /&gt;
&lt;br /&gt;
Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable '''$0''' und ist entweder der '''&amp;quot;Scriptname ohne Path&amp;quot; ; &amp;quot;//&amp;quot; ; &amp;quot;/&amp;quot;  oder &amp;quot;.&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
== weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.grymoire.com/Unix/Sed.html An Introduction and Tutorial]&lt;br /&gt;
* [http://www.tty1.net/sed-tutorium_de.html sed-Tutorium-de]&lt;br /&gt;
* [http://sed.sourceforge.net/sedfaq.html THE SED FAQ]&lt;br /&gt;
* [http://sed.sourceforge.net/#tools Hilfreiche Tools für Sed-Programmierung]&lt;br /&gt;
* [http://www.gnu.org/software/sed/manual/ GNU sed user's manual]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;!-- ~~~~ --&amp;gt;&lt;br /&gt;
[[Konsole#Unixwerkzeuge|zurück zu UNIX-Werkzeuge]]&lt;br /&gt;
[[Kategorie:Konsole]][[Kategorie:Scripte]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzer:Itu&amp;diff=33039</id>
		<title>Benutzer:Itu</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzer:Itu&amp;diff=33039"/>
		<updated>2019-06-05T02:14:28Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Komme gewissermassen aktuell vom [http://de.linwiki.org linwiki] &amp;lt;big&amp;gt;(†)&amp;lt;/big&amp;gt; hierher, welches so verlassen war dass es drohte von Vandalen und Spammern eingenommen zu werden.... &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mir fällt gerade auf dass es in beiden Wikis doch sehr hochwertige Artikel gibt.&lt;br /&gt;
&lt;br /&gt;
Eigentlich fahre ich auf dem Linux-Hauptzug: Ubuntu . Aber das dortige Wiki ist mir zu umständlich, also leider nicht ''wiki wiki'' genug und vieles ist ja auch nicht distributionsabhängig. &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Itu|Itu]] 18:04, 18. Sep. 2011 (UTC) &amp;lt;br&amp;gt;&lt;br /&gt;
--[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 04:14, 5. Jun. 2019 (CEST)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Partitionen_vergr%C3%B6%C3%9Fern_(GParted)&amp;diff=30970</id>
		<title>Partitionen vergrößern (GParted)</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Partitionen_vergr%C3%B6%C3%9Fern_(GParted)&amp;diff=30970"/>
		<updated>2014-01-29T14:45:55Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* Links */ per favore: mein artikel im linwiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Review|Kompletter Artikel}}--[[Benutzer:Gehrke|Gehrke]] ([[Benutzer Diskussion:Gehrke|Diskussion]]) 10:24, 27. Dez. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
Manchmal muss man die Partitionierung eines konfigurierten Systems ändern, beispielsweise weil sich einzelne Partitionen als zu klein herausgestellt haben. Dieser Artikel beschreibt beispielhaft ein Verfahren, bei welchem der Umbau ohne Neuinstallation und vor allem ohne Datenverlust durchgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hierzu wird die Live-Version von [[GParted]] verwendet. Das Beispiel wurde in einer virtualisierten Umgebung unter [[VirtualBox]] durchgeführt.&lt;br /&gt;
&lt;br /&gt;
{{Box Achtung||Warnung: Es ist absolut notwendig, von allen relevanten Daten zuvor eine valide Sicherheitskopie anzufertigen. Die hier behandelten Schritte bergen ein hohes Risiko für die Konsistenz des gesamten Datenbestandes!}}&lt;br /&gt;
&lt;br /&gt;
=Ausgangsbasis=&lt;br /&gt;
Das folgende Partitionierungsschema zeigt die aktuelle Konfiguration: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # lsblk&lt;br /&gt;
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&lt;br /&gt;
sda               8:0    0    8G  0 disk &lt;br /&gt;
├─sda1            8:1    0  101M  0 part /boot&lt;br /&gt;
├─sda2            8:2    0  6.6G  0 part &lt;br /&gt;
│ ├─system-root 253:0    0  6.1G  0 lvm  /&lt;br /&gt;
│ └─system-swap 253:1    0  512M  0 lvm  [SWAP]&lt;br /&gt;
└─sda3            8:3    0  1.3G  0 part /images-pp&lt;br /&gt;
sdb              8:16  0    8G  0 disk&lt;br /&gt;
└─sdb1            8:17  0    8G  0 part /root/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Hier handelt es sich um eine Konfiguration für einen ganz bestimmten Zweck, diese soll keinesfalls als beispielhaft für eine sinnvolle Partitionierung im produktiven Einsatz gelten!&lt;br /&gt;
&lt;br /&gt;
=Ziel=&lt;br /&gt;
Was soll gemacht werden?&lt;br /&gt;
*sda1 soll auf 4GB erweitert werden.&lt;br /&gt;
*sda2 soll auf 15GB erweitert werden.&lt;br /&gt;
*sda3 wird gelöscht.&lt;br /&gt;
*sdb dient nur temporär der Aufnahme der Images und ist nicht Gegenstand einer Partitionsbearbeitung.&lt;br /&gt;
&lt;br /&gt;
=Sicherung=&lt;br /&gt;
Zuvor wurden von 'sda1' und 'sda2' per dd Images in 'sdb1' erstellt. Dies geschah in einer separaten Sitzung, gebootet in einem Recovery-System - also nicht am laufenden System!&lt;br /&gt;
&lt;br /&gt;
Test, ob die Images valide sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # mkdir /root/sdb1&lt;br /&gt;
localhost:~ # mount -o ro /dev/sdb1 /root/sdb1&lt;br /&gt;
localhost:~ # mkdir /root/sda1; mount -o loop /root/sdb1/sda1-boot.img /root/sda1&lt;br /&gt;
&lt;br /&gt;
localhost:~ # mkdir /root/sda2; mount -o loop /root/sdb1/sda2-root-lvm.img /root/sda2&lt;br /&gt;
mount: unknown filesystem type 'LVM2_member'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das sollte in diesem Kontext ausreichen...&lt;br /&gt;
&lt;br /&gt;
=Vergrößerung=&lt;br /&gt;
==Schritt 1: sda vergrößern==&lt;br /&gt;
Das wird mit VirtualBox-Werkzeugen auf dem Host erreicht, während die VM down ist. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
j2:~ # ls -ltar /home/user/VirtualBox\ VMs/OpenSUSE\ 13.1\ NoCrypt/OpenSUSE\ 13.1\ NoCrypt.vdi &lt;br /&gt;
-rw------- 1 user 1000 7703924736 Dec 22 15:45 /home/user/VirtualBox VMs/OpenSUSE 13.1 NoCrypt/OpenSUSE 13.1 NoCrypt.vdi&lt;br /&gt;
j2:~ # VBoxManage modifyhd &amp;quot;/home/user/VirtualBox VMs/OpenSUSE 13.1 NoCrypt/OpenSUSE 13.1 NoCrypt.vdi&amp;quot; --resize 19456&lt;br /&gt;
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%&lt;br /&gt;
j2:~ # ls -ltar /home/user/VirtualBox\ VMs/OpenSUSE\ 13.1\ NoCrypt/OpenSUSE\ 13.1\ NoCrypt.vdi &lt;br /&gt;
-rw------- 1 user 1000 7704973312 Dec 24 09:58 /home/user/VirtualBox VMs/OpenSUSE 13.1 NoCrypt/OpenSUSE 13.1 NoCrypt.vdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die geringe Größenänderung hier scheint plausibel durch die Sparse-Konfiguration erklärbar zu sein. VirtualBox meldet jedenfalls die neue Größe von 19 GB.&lt;br /&gt;
&lt;br /&gt;
In der realen Welt entspricht dieser Schritt dem Einbau einer größeren Festplatte und dem Übertragen des Diskimages per [[dd]] von der alten auf die neue Platte.&lt;br /&gt;
&lt;br /&gt;
Danach startet die VM problemlos, nutzt aber den zusätzlichen Speicher nicht:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # fdisk -l /dev/sda&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sda: 8589 MB, 8589934592 bytes, 16777216 sectors&lt;br /&gt;
Units = sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disk label type: dos&lt;br /&gt;
Disk identifier: 0x000d8d71&lt;br /&gt;
&lt;br /&gt;
   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;
/dev/sda1   *        2048      208895      103424   83  Linux&lt;br /&gt;
/dev/sda2          208896    14057471     6924288   8e  Linux LVM&lt;br /&gt;
/dev/sda3        14057472    16756735     1349632   83  Linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 1.png|thumb|c|right|250px|GParted - Vergrößerung der Festplatte wird innerhalb der VM nicht erkannt]]Das System hat von dem neuen Speicherplatz noch nichts mitbekommen. Das Verhalten zeigt sich ebenfalls, wenn die VM von einer Live-Version von GParted gebootet wird:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 2.png|thumb|c|right|250px|GParted - Die neue Größe wurde erkannt. Noch keine Änderungen durchgeführt.]]Hier wird ein Bug von [[VirtualBox]] vermutet. Es ist ein kleiner Trick notwendig, um die Änderung in der VM zu reflektieren. Dabei wird eine '''neue''' virtuelle Maschine erzeugt, welche das vergrößerte Image als Festplatte enthält und das ISO-Image der Live-Version von GParted als CD zum Booten zugeteilt bekommt. Darin wird die neue Größe dann erkannt.&lt;br /&gt;
&lt;br /&gt;
==Schritt 2: Änderung der Partitionierung==&lt;br /&gt;
Zur Änderung der Partitionierung wird das System mit einer Live-Version von GParted gebootet. Innerhalb von GParted wird dort ein Bereich von 11 GB als 'unallocated' vermerkt.&lt;br /&gt;
&lt;br /&gt;
Die Schritte im einzelnen:&lt;br /&gt;
===Löschen von 'sda3'===&lt;br /&gt;
Erfolgt über das Kontextmenü, danach sind 12.3 GB frei.&lt;br /&gt;
==='sda2' verschieben und vergrößern===&lt;br /&gt;
Das erfolgt ebenfalls über das Kontextmenü 'Resize/Move' mit diesen Parametern:&lt;br /&gt;
*Free space preceding (MiB): 4098&lt;br /&gt;
*New size (MiB): 15360&lt;br /&gt;
*Free space following (MiB): 0&lt;br /&gt;
==='sda1' vergrößern===&lt;br /&gt;
Parameter:&lt;br /&gt;
*Free space preceding (MiB): 0&lt;br /&gt;
*New size (MiB): 4095&lt;br /&gt;
*Free space following (MiB): 0&lt;br /&gt;
===Durchführung der Schritte===&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 3.png|thumb|c|right|250px|GParted - Noch ausstehende Konfigurationsänderungen]]&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 4.png|thumb|c|right|250px|GParted - Durchführung der Änderungen]]&lt;br /&gt;
Abschließend auf 'Apply' klicken, um alle Schritte durchzuführen. Es werden noch mal alle Schritte aufgeführt, die durchgeführt werden sollen und eine explizite Bestätigung eingeholt, weil die folgenden Aktivitäten Datenbestände löschen können bzw. werden.&lt;br /&gt;
&lt;br /&gt;
Die folgende Durchführung kann einige Zeit in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
Abschließend sollte die virtuelle Maschine sauber beendet werden.&lt;br /&gt;
&lt;br /&gt;
=Vergrößerung der Dateisysteme=&lt;br /&gt;
Nach dem Start der VM wird überprüft, ob die Partitionierung nun den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Der erste Start der virtuellen Maschine kann unverhältnismäßig lange dauern, weil nach der Partitionsänderung Dateisystem-Checks durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # fdisk -l /dev/sda&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sda: 20.4 GB, 20401094656 bytes, 39845888 sectors&lt;br /&gt;
Units = sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disk label type: dos&lt;br /&gt;
Disk identifier: 0x000d8d71&lt;br /&gt;
&lt;br /&gt;
   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;
/dev/sda1   *        2048     8386559     4192256   83  Linux&lt;br /&gt;
/dev/sda2         8388608    39843839    15727616   8e  Linux LVM&lt;br /&gt;
&lt;br /&gt;
localhost:~ # lsblk&lt;br /&gt;
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&lt;br /&gt;
sda               8:0    0   19G  0 disk &lt;br /&gt;
├─sda1            8:1    0    4G  0 part /boot&lt;br /&gt;
└─sda2            8:2    0   15G  0 part &lt;br /&gt;
  ├─system-root 253:0    0  6.1G  0 lvm  /&lt;br /&gt;
  └─system-swap 253:1    0  512M  0 lvm  [SWAP]&lt;br /&gt;
&lt;br /&gt;
localhost:~ # pvs&lt;br /&gt;
  PV         VG     Fmt  Attr PSize  PFree&lt;br /&gt;
  /dev/sda2  system lvm2 a--  15.00g 8.40g&lt;br /&gt;
&lt;br /&gt;
localhost:~ # lvs&lt;br /&gt;
  LV   VG     Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert&lt;br /&gt;
  root system -wi-ao---   6.10g                                           &lt;br /&gt;
  swap system -wi-ao--- 512.00m                                           &lt;br /&gt;
&lt;br /&gt;
localhost:~ # df -h&lt;br /&gt;
Filesystem               Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mapper/system-root  5.9G  4.5G  1.2G  81% /&lt;br /&gt;
devtmpfs                 486M   32K  486M   1% /dev&lt;br /&gt;
tmpfs                    499M   80K  499M   1% /dev/shm&lt;br /&gt;
tmpfs                    499M  2.7M  496M   1% /run&lt;br /&gt;
tmpfs                    499M     0  499M   0% /sys/fs/cgroup&lt;br /&gt;
tmpfs                    499M  2.7M  496M   1% /var/lock&lt;br /&gt;
tmpfs                    499M  2.7M  496M   1% /var/run&lt;br /&gt;
/dev/sda1                3.9G   50M  3.7G   2% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Man erkennt, dass /boot auf ''sda1'' und das PV auf ''sda2'' vergrössert wurde.&lt;br /&gt;
&lt;br /&gt;
Aber das LV für /root ist noch unverändert und muss separat vergrößert werden. Auch dies sollte  '''auf keinen Fall im laufenden System''' durchgeführt werden, sondern stattdessen nochmal mit dem GParted-ISO gebootet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@debian:~$ sudo lvchange -a y system/root&lt;br /&gt;
&lt;br /&gt;
user@debian:~$ sudo lvresize --resizefs --size +8.3G system/root&lt;br /&gt;
  Rounding size to boundary between physical extents: 8.30 GiB&lt;br /&gt;
fsck from util-linux 2.20.1&lt;br /&gt;
/dev/mapper/system-root: clean, 147123/399840 files, 1184202/1598464 blocks&lt;br /&gt;
  Extending logical volume root to 14.40 GiB&lt;br /&gt;
  Logical volume root successfully resized&lt;br /&gt;
resize2fs 1.42.8 (20-Jun-2013)&lt;br /&gt;
Resizing the filesystem on /dev/mapper/system-root to 3774464 (4k) blocks.&lt;br /&gt;
The filesystem on /dev/mapper/system-root is now 3774464 blocks long.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anschließend steht der Speicherplatz vollständig zur Verfügung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # lvs&lt;br /&gt;
  LV   VG     Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert&lt;br /&gt;
  root system -wi-ao---  14.40g                                           &lt;br /&gt;
  swap system -wi-ao--- 512.00m    &lt;br /&gt;
                                       &lt;br /&gt;
localhost:~ # df -h&lt;br /&gt;
Filesystem               Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mapper/system-root   15G  4.5G  8.9G  34% /&lt;br /&gt;
devtmpfs                 486M   32K  486M   1% /dev&lt;br /&gt;
tmpfs                    499M   80K  499M   1% /dev/shm&lt;br /&gt;
tmpfs                    499M  2.6M  496M   1% /run&lt;br /&gt;
tmpfs                    499M     0  499M   0% /sys/fs/cgroup&lt;br /&gt;
tmpfs                    499M  2.6M  496M   1% /var/lock&lt;br /&gt;
tmpfs                    499M  2.6M  496M   1% /var/run&lt;br /&gt;
/dev/sda1                3.9G  240M  3.5G   7% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[[GParted LiveCD]]&lt;br /&gt;
*[[LVM]]&lt;br /&gt;
*[http://derekmolloy.ie/resize-a-virtualbox-disk/ Resize a VirtualBox guest Linux VDI Disk (Derek Molloy)]&lt;br /&gt;
*linwiki.org: [http://de.linwiki.org/wiki/Partitionsgr%C3%B6sse_%C3%A4ndern  Partitionsgrösse ändern]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Partitionen]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Standardeintrag_Bootmen%C3%BC_%C3%A4ndern_(GRUB2)&amp;diff=30969</id>
		<title>Diskussion:Standardeintrag Bootmenü ändern (GRUB2)</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Standardeintrag_Bootmen%C3%BC_%C3%A4ndern_(GRUB2)&amp;diff=30969"/>
		<updated>2014-01-29T14:43:03Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Änderung über den Namen 'menuentry' (GRUB_DEFAULT=saved)=&lt;br /&gt;
Diesen Part habe ich entfernt. Er funktioniert zwar, aber es scheint mir eher eine missbräuchliche Verwendung der Konfiguration zu sein. --[[Benutzer:Gehrke|Gehrke]] ([[Benutzer Diskussion:Gehrke|Diskussion]]) 11:12, 7. Dez. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mein Review: Schwer verständlich für jemand, der sich nicht gut auskennt mit Grub: Was ist der Standardeintrag, was ist der Index? Einfach mehr erklären, Platz ist ja noch... --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 15:43, 29. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Partitionen_vergr%C3%B6%C3%9Fern_(GParted)&amp;diff=30968</id>
		<title>Partitionen vergrößern (GParted)</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Partitionen_vergr%C3%B6%C3%9Fern_(GParted)&amp;diff=30968"/>
		<updated>2014-01-29T14:36:19Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Review|Kompletter Artikel}}--[[Benutzer:Gehrke|Gehrke]] ([[Benutzer Diskussion:Gehrke|Diskussion]]) 10:24, 27. Dez. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
Manchmal muss man die Partitionierung eines konfigurierten Systems ändern, beispielsweise weil sich einzelne Partitionen als zu klein herausgestellt haben. Dieser Artikel beschreibt beispielhaft ein Verfahren, bei welchem der Umbau ohne Neuinstallation und vor allem ohne Datenverlust durchgeführt werden kann.&lt;br /&gt;
&lt;br /&gt;
Hierzu wird die Live-Version von [[GParted]] verwendet. Das Beispiel wurde in einer virtualisierten Umgebung unter [[VirtualBox]] durchgeführt.&lt;br /&gt;
&lt;br /&gt;
{{Box Achtung||Warnung: Es ist absolut notwendig, von allen relevanten Daten zuvor eine valide Sicherheitskopie anzufertigen. Die hier behandelten Schritte bergen ein hohes Risiko für die Konsistenz des gesamten Datenbestandes!}}&lt;br /&gt;
&lt;br /&gt;
=Ausgangsbasis=&lt;br /&gt;
Das folgende Partitionierungsschema zeigt die aktuelle Konfiguration: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # lsblk&lt;br /&gt;
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&lt;br /&gt;
sda               8:0    0    8G  0 disk &lt;br /&gt;
├─sda1            8:1    0  101M  0 part /boot&lt;br /&gt;
├─sda2            8:2    0  6.6G  0 part &lt;br /&gt;
│ ├─system-root 253:0    0  6.1G  0 lvm  /&lt;br /&gt;
│ └─system-swap 253:1    0  512M  0 lvm  [SWAP]&lt;br /&gt;
└─sda3            8:3    0  1.3G  0 part /images-pp&lt;br /&gt;
sdb              8:16  0    8G  0 disk&lt;br /&gt;
└─sdb1            8:17  0    8G  0 part /root/sdb1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hinweis: Hier handelt es sich um eine Konfiguration für einen ganz bestimmten Zweck, diese soll keinesfalls als beispielhaft für eine sinnvolle Partitionierung im produktiven Einsatz gelten!&lt;br /&gt;
&lt;br /&gt;
=Ziel=&lt;br /&gt;
Was soll gemacht werden?&lt;br /&gt;
*sda1 soll auf 4GB erweitert werden.&lt;br /&gt;
*sda2 soll auf 15GB erweitert werden.&lt;br /&gt;
*sda3 wird gelöscht.&lt;br /&gt;
*sdb dient nur temporär der Aufnahme der Images und ist nicht Gegenstand einer Partitionsbearbeitung.&lt;br /&gt;
&lt;br /&gt;
=Sicherung=&lt;br /&gt;
Zuvor wurden von 'sda1' und 'sda2' per dd Images in 'sdb1' erstellt. Dies geschah in einer separaten Sitzung, gebootet in einem Recovery-System - also nicht am laufenden System!&lt;br /&gt;
&lt;br /&gt;
Test, ob die Images valide sind:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # mkdir /root/sdb1&lt;br /&gt;
localhost:~ # mount -o ro /dev/sdb1 /root/sdb1&lt;br /&gt;
localhost:~ # mkdir /root/sda1; mount -o loop /root/sdb1/sda1-boot.img /root/sda1&lt;br /&gt;
&lt;br /&gt;
localhost:~ # mkdir /root/sda2; mount -o loop /root/sdb1/sda2-root-lvm.img /root/sda2&lt;br /&gt;
mount: unknown filesystem type 'LVM2_member'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Das sollte in diesem Kontext ausreichen...&lt;br /&gt;
&lt;br /&gt;
=Vergrößerung=&lt;br /&gt;
==Schritt 1: sda vergrößern==&lt;br /&gt;
Das wird mit VirtualBox-Werkzeugen auf dem Host erreicht, während die VM down ist. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
j2:~ # ls -ltar /home/user/VirtualBox\ VMs/OpenSUSE\ 13.1\ NoCrypt/OpenSUSE\ 13.1\ NoCrypt.vdi &lt;br /&gt;
-rw------- 1 user 1000 7703924736 Dec 22 15:45 /home/user/VirtualBox VMs/OpenSUSE 13.1 NoCrypt/OpenSUSE 13.1 NoCrypt.vdi&lt;br /&gt;
j2:~ # VBoxManage modifyhd &amp;quot;/home/user/VirtualBox VMs/OpenSUSE 13.1 NoCrypt/OpenSUSE 13.1 NoCrypt.vdi&amp;quot; --resize 19456&lt;br /&gt;
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%&lt;br /&gt;
j2:~ # ls -ltar /home/user/VirtualBox\ VMs/OpenSUSE\ 13.1\ NoCrypt/OpenSUSE\ 13.1\ NoCrypt.vdi &lt;br /&gt;
-rw------- 1 user 1000 7704973312 Dec 24 09:58 /home/user/VirtualBox VMs/OpenSUSE 13.1 NoCrypt/OpenSUSE 13.1 NoCrypt.vdi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die geringe Größenänderung hier scheint plausibel durch die Sparse-Konfiguration erklärbar zu sein. VirtualBox meldet jedenfalls die neue Größe von 19 GB.&lt;br /&gt;
&lt;br /&gt;
In der realen Welt entspricht dieser Schritt dem Einbau einer größeren Festplatte und dem Übertragen des Diskimages per [[dd]] von der alten auf die neue Platte.&lt;br /&gt;
&lt;br /&gt;
Danach startet die VM problemlos, nutzt aber den zusätzlichen Speicher nicht:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # fdisk -l /dev/sda&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sda: 8589 MB, 8589934592 bytes, 16777216 sectors&lt;br /&gt;
Units = sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disk label type: dos&lt;br /&gt;
Disk identifier: 0x000d8d71&lt;br /&gt;
&lt;br /&gt;
   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;
/dev/sda1   *        2048      208895      103424   83  Linux&lt;br /&gt;
/dev/sda2          208896    14057471     6924288   8e  Linux LVM&lt;br /&gt;
/dev/sda3        14057472    16756735     1349632   83  Linux&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 1.png|thumb|c|right|250px|GParted - Vergrößerung der Festplatte wird innerhalb der VM nicht erkannt]]Das System hat von dem neuen Speicherplatz noch nichts mitbekommen. Das Verhalten zeigt sich ebenfalls, wenn die VM von einer Live-Version von GParted gebootet wird:&lt;br /&gt;
&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 2.png|thumb|c|right|250px|GParted - Die neue Größe wurde erkannt. Noch keine Änderungen durchgeführt.]]Hier wird ein Bug von [[VirtualBox]] vermutet. Es ist ein kleiner Trick notwendig, um die Änderung in der VM zu reflektieren. Dabei wird eine '''neue''' virtuelle Maschine erzeugt, welche das vergrößerte Image als Festplatte enthält und das ISO-Image der Live-Version von GParted als CD zum Booten zugeteilt bekommt. Darin wird die neue Größe dann erkannt.&lt;br /&gt;
&lt;br /&gt;
==Schritt 2: Änderung der Partitionierung==&lt;br /&gt;
Zur Änderung der Partitionierung wird das System mit einer Live-Version von GParted gebootet. Innerhalb von GParted wird dort ein Bereich von 11 GB als 'unallocated' vermerkt.&lt;br /&gt;
&lt;br /&gt;
Die Schritte im einzelnen:&lt;br /&gt;
===Löschen von 'sda3'===&lt;br /&gt;
Erfolgt über das Kontextmenü, danach sind 12.3 GB frei.&lt;br /&gt;
==='sda2' verschieben und vergrößern===&lt;br /&gt;
Das erfolgt ebenfalls über das Kontextmenü 'Resize/Move' mit diesen Parametern:&lt;br /&gt;
*Free space preceding (MiB): 4098&lt;br /&gt;
*New size (MiB): 15360&lt;br /&gt;
*Free space following (MiB): 0&lt;br /&gt;
==='sda1' vergrößern===&lt;br /&gt;
Parameter:&lt;br /&gt;
*Free space preceding (MiB): 0&lt;br /&gt;
*New size (MiB): 4095&lt;br /&gt;
*Free space following (MiB): 0&lt;br /&gt;
===Durchführung der Schritte===&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 3.png|thumb|c|right|250px|GParted - Noch ausstehende Konfigurationsänderungen]]&lt;br /&gt;
[[Bild:Partitionierung mit GParted ändern - 4.png|thumb|c|right|250px|GParted - Durchführung der Änderungen]]&lt;br /&gt;
Abschließend auf 'Apply' klicken, um alle Schritte durchzuführen. Es werden noch mal alle Schritte aufgeführt, die durchgeführt werden sollen und eine explizite Bestätigung eingeholt, weil die folgenden Aktivitäten Datenbestände löschen können bzw. werden.&lt;br /&gt;
&lt;br /&gt;
Die folgende Durchführung kann einige Zeit in Anspruch nehmen.&lt;br /&gt;
&lt;br /&gt;
Abschließend sollte die virtuelle Maschine sauber beendet werden.&lt;br /&gt;
&lt;br /&gt;
=Vergrößerung der Dateisysteme=&lt;br /&gt;
Nach dem Start der VM wird überprüft, ob die Partitionierung nun den Erwartungen entspricht.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Der erste Start der virtuellen Maschine kann unverhältnismäßig lange dauern, weil nach der Partitionsänderung Dateisystem-Checks durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # fdisk -l /dev/sda&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sda: 20.4 GB, 20401094656 bytes, 39845888 sectors&lt;br /&gt;
Units = sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disk label type: dos&lt;br /&gt;
Disk identifier: 0x000d8d71&lt;br /&gt;
&lt;br /&gt;
   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;
/dev/sda1   *        2048     8386559     4192256   83  Linux&lt;br /&gt;
/dev/sda2         8388608    39843839    15727616   8e  Linux LVM&lt;br /&gt;
&lt;br /&gt;
localhost:~ # lsblk&lt;br /&gt;
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&lt;br /&gt;
sda               8:0    0   19G  0 disk &lt;br /&gt;
├─sda1            8:1    0    4G  0 part /boot&lt;br /&gt;
└─sda2            8:2    0   15G  0 part &lt;br /&gt;
  ├─system-root 253:0    0  6.1G  0 lvm  /&lt;br /&gt;
  └─system-swap 253:1    0  512M  0 lvm  [SWAP]&lt;br /&gt;
&lt;br /&gt;
localhost:~ # pvs&lt;br /&gt;
  PV         VG     Fmt  Attr PSize  PFree&lt;br /&gt;
  /dev/sda2  system lvm2 a--  15.00g 8.40g&lt;br /&gt;
&lt;br /&gt;
localhost:~ # lvs&lt;br /&gt;
  LV   VG     Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert&lt;br /&gt;
  root system -wi-ao---   6.10g                                           &lt;br /&gt;
  swap system -wi-ao--- 512.00m                                           &lt;br /&gt;
&lt;br /&gt;
localhost:~ # df -h&lt;br /&gt;
Filesystem               Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mapper/system-root  5.9G  4.5G  1.2G  81% /&lt;br /&gt;
devtmpfs                 486M   32K  486M   1% /dev&lt;br /&gt;
tmpfs                    499M   80K  499M   1% /dev/shm&lt;br /&gt;
tmpfs                    499M  2.7M  496M   1% /run&lt;br /&gt;
tmpfs                    499M     0  499M   0% /sys/fs/cgroup&lt;br /&gt;
tmpfs                    499M  2.7M  496M   1% /var/lock&lt;br /&gt;
tmpfs                    499M  2.7M  496M   1% /var/run&lt;br /&gt;
/dev/sda1                3.9G   50M  3.7G   2% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Man erkennt, dass /boot auf ''sda1'' und das PV auf ''sda2'' vergrössert wurde.&lt;br /&gt;
&lt;br /&gt;
Aber das LV für /root ist noch unverändert und muss separat vergrößert werden. Auch dies sollte  '''auf keinen Fall im laufenden System''' durchgeführt werden, sondern stattdessen nochmal mit dem GParted-ISO gebootet werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@debian:~$ sudo lvchange -a y system/root&lt;br /&gt;
&lt;br /&gt;
user@debian:~$ sudo lvresize --resizefs --size +8.3G system/root&lt;br /&gt;
  Rounding size to boundary between physical extents: 8.30 GiB&lt;br /&gt;
fsck from util-linux 2.20.1&lt;br /&gt;
/dev/mapper/system-root: clean, 147123/399840 files, 1184202/1598464 blocks&lt;br /&gt;
  Extending logical volume root to 14.40 GiB&lt;br /&gt;
  Logical volume root successfully resized&lt;br /&gt;
resize2fs 1.42.8 (20-Jun-2013)&lt;br /&gt;
Resizing the filesystem on /dev/mapper/system-root to 3774464 (4k) blocks.&lt;br /&gt;
The filesystem on /dev/mapper/system-root is now 3774464 blocks long.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Anschließend steht der Speicherplatz vollständig zur Verfügung:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost:~ # lvs&lt;br /&gt;
  LV   VG     Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert&lt;br /&gt;
  root system -wi-ao---  14.40g                                           &lt;br /&gt;
  swap system -wi-ao--- 512.00m    &lt;br /&gt;
                                       &lt;br /&gt;
localhost:~ # df -h&lt;br /&gt;
Filesystem               Size  Used Avail Use% Mounted on&lt;br /&gt;
/dev/mapper/system-root   15G  4.5G  8.9G  34% /&lt;br /&gt;
devtmpfs                 486M   32K  486M   1% /dev&lt;br /&gt;
tmpfs                    499M   80K  499M   1% /dev/shm&lt;br /&gt;
tmpfs                    499M  2.6M  496M   1% /run&lt;br /&gt;
tmpfs                    499M     0  499M   0% /sys/fs/cgroup&lt;br /&gt;
tmpfs                    499M  2.6M  496M   1% /var/lock&lt;br /&gt;
tmpfs                    499M  2.6M  496M   1% /var/run&lt;br /&gt;
/dev/sda1                3.9G  240M  3.5G   7% /boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[[GParted LiveCD]]&lt;br /&gt;
*[[LVM]]&lt;br /&gt;
*[http://derekmolloy.ie/resize-a-virtualbox-disk/ Resize a VirtualBox guest Linux VDI Disk (Derek Molloy)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Partitionen]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Linux_mit_hdparm_beschleunigen&amp;diff=30963</id>
		<title>Linux mit hdparm beschleunigen</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Linux_mit_hdparm_beschleunigen&amp;diff=30963"/>
		<updated>2014-01-27T11:49:57Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* Befehlsbeispiele */ lost&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux beschleunigen durch hdparm ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; hdparm : ist ein Konsolentool mit dessen Hilfe man die EIDE-/ATAPI-Parameter abfragen und einstellen kann.&lt;br /&gt;
&lt;br /&gt;
Mittels des Befehls hdparm lassen sich von den IDE Geräten die Hardwaredaten und aktuelle Einstellungen auslesen. Darüber hinaus lassen sich in diesen Geräten auch bestimmte Parameter gezielt setzen.&lt;br /&gt;
 &lt;br /&gt;
=== Wichtigste Funktionen ===&lt;br /&gt;
&lt;br /&gt;
* Auslesen der Identification Info&lt;br /&gt;
* Auslesen der Drive Geometry&lt;br /&gt;
* I/O Kommunikationsparameter abfragen und setzen&lt;br /&gt;
* Kommunikationsgeschwindigkeit testen&lt;br /&gt;
* Power Management&lt;br /&gt;
* Akustik Management&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Befehlsbeispiele ===&lt;br /&gt;
&lt;br /&gt;
; hdparm : Eine Liste aller bekannter Optionen analog --help&lt;br /&gt;
; hdparm /dev/hda : Ausgabe der wichtigsten momentan aktiven Einstellungen&lt;br /&gt;
; hdparm -i /dev/hda : Identifikation und unterstützte Optionen&lt;br /&gt;
; hdparm -tT /dev/hda : Lese-Geschwindigkeitstest&lt;br /&gt;
; hdparm -d1 /dev/hda : Einschalten des DMA-Modus&lt;br /&gt;
; hdparm -M128 /dev/hda : Festplatte in den Flüstermodus versetzen&lt;br /&gt;
; hdparm -S ??? /dev/hda : nach einer gewissen Zeit der Inaktivität wird Platte abgeschaltet, Die Zeit errechnet sich ??? (1-251), bei 0 dann deaktiviert&lt;br /&gt;
; hdparm -y /dev/hda : sofortiger Stand-by-Modus&lt;br /&gt;
; hdparm -Y /dev/hda : sofortiges vollständiges Abschalten (Vorsicht)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einen Überblick und Erklärung dazu liefert man hdparm&lt;br /&gt;
&lt;br /&gt;
Es gibt auch ein GUI front end für hdparm, im LC sind derzeit aber noch keinerlei Meinungen über dieses Tool eingegangen.&lt;br /&gt;
* http://rpmfind.net/linux/RPM/sourceforge/d/dr/drivetweak/ghdparm-gnome-0.1-1.i386.html&lt;br /&gt;
&lt;br /&gt;
=== Geschwindigkeit der Laufwerke optimieren ===&lt;br /&gt;
&lt;br /&gt;
Mit hdparm können die I/O Parameter der IDE Festplatten beeinflusst werden. In früheren Linuxversionen gab es hiermit eine ganze Menge Optimierungpotential, das die Geschwindigkeit des gesamten Linuxsystems positiv beeinflussen konnte. In den aktuellen Linuxversionen sind die Einstellungen, die Linux hier von Haus aus vornimmt, schon oftmals so gut, dass man hier meist nicht mehr sehr viele Geschwindigkeitsgewinne erzielen kann. Dennoch ist das Verfahren nach wie vor das gleiche. Es gibt eine ganze Reihe von Seiten im Netz, die die Vorgehensweise genau erklären, hier nur einige wenige Links&lt;br /&gt;
&lt;br /&gt;
Links zu Seiten in denen die Benutzung von hdparm zur Optimierung des I/O erklärt ist&lt;br /&gt;
* [http://www.linuxdevcenter.com/pub/a/linux/2000/06/29/hdparm.html Speeding up Linux Using hdparm]&lt;br /&gt;
* [http://www.linux-magazin.de/Artikel/ausgabe/2004/03/hdparm/hdparm.html Wer bremst, verschenkt]&lt;br /&gt;
* [http://www.pc-erfahrung.de/Index.html?linux_hdparm.html Festplatenleistung optimieren]&lt;br /&gt;
* http://www.pro-linux.de/news/2002/0066.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wer sich gerne näher damit beschäftigen möchte dem sei das [http://tomshardware.thgweb.de/2002/07/30/ide_kurs_teil_1_grundlagen_und_technik_im_detail/index.html hier] zur Lektüre empfohlen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fehler nach Optimierung mit hdparm ====&lt;br /&gt;
Entscheidend für die maximal zu erreichende Geschwindigkeit ist unter anderem der Typ des Bus Kontrollers, der Kontroller auf dem Gerät selbst und die Verkabelung. Es gibt für verschiedene Busgeschwindigkeiten auch verschiedene Kabeltypen. Auch die Güte und der Zustand der Kabel sowie der Steckverbindungen kann unter Umständen schon bei maximalen Geschwindigkeiten Probleme bereiten.&lt;br /&gt;
&lt;br /&gt;
Solche Probleme machen sich in der /var/log/messages und in dmesg oft als lange Liste folgender Meldungen breit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }&lt;br /&gt;
hda: dma_intr: error=0x84 { DriveStatusError BadCRC } &lt;br /&gt;
&amp;lt;/pre&amp;gt;  &lt;br /&gt;
Sollten solche Meldungen sich häufen, dann sollte man entweder versuchen die I/O Geschwindigkeit wieder niedriger einzustellen oder nach den Ursachen zu suchen. Ursachen sind meist die Kabel und Steckverbindungen, seltener die Platte oder Kontroller selbst. Möglich ist auch, dass an einem Bus zwei Geräte angeschlossen sind, eines mit DMA und eines ohne DMA konfiguriert. Auch eine solche Einstellung kann Probleme verursachen und seitenweise Fehlermeldungen produzieren. [http://de.opensuse.org/SDB:Datenfehler_bei_IDE_Ger%C3%A4ten_beheben Datenfehler bei IDE Geräten beheben]&lt;br /&gt;
&lt;br /&gt;
=== Warnung vor der Benutzung ===&lt;br /&gt;
&lt;br /&gt;
hdparm hat eine ganze Reihe von nicht ganz ungefährlichen Optionen. Einige Optionen sind nur für spezielle Hardwareanforderungen, wie z. B. Hot plug über IDE Wechselrahmen ausgelegt, bei anderen stehen Warnhinweise in der ManPage. Prinzipiell ist dies kein Programm mit dem man ohne genauere Kenntnisse der Funktion mit schlecht dokumentierten Optionen und Optionskombinationen an einem aktivem System herumspielen sollte. Hier droht echter Datenverlust.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
''nach einem TIP von ''  '''oc2pus'''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Konsole|Zurück zur Konsolenübersicht]]&lt;br /&gt;
[[Category:Konsole]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Scannen_per_Netzwerk&amp;diff=30949</id>
		<title>Scannen per Netzwerk</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Scannen_per_Netzwerk&amp;diff=30949"/>
		<updated>2014-01-22T05:36:11Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Review|kompletter Artikel}}&lt;br /&gt;
=Scannen per Netzwerk=&lt;br /&gt;
Da hat man nun einen Scanner der mit Hilfe von Sane unter Linux direkt läuft sowie ein Netzwerk und will auch von anderen Rechnern aus scannen statt nur von dem Rechner aus an dem der Scanner hängt.&lt;br /&gt;
Da saned (der sane-Backenddaemon) durchaus dazu in der Lage ist als Server oder als Vermittler für die eigentlichen Frontends wie kooka, xsane, xscanimage, [[GIMP]], [[Libreoffice]] oder ähnliche zu fungieren, aber die gängigen Konfigurationstools der meisten Distributionen dies nicht direkt in ihrer Konfigurationsoberfläche anbieten, benötigt man ein wenig Handarbeit um die gewünschte Funktionalität zu erhalten, und zwar sowohl auf der Serverseite als auch auf der Clientseite.&lt;br /&gt;
&lt;br /&gt;
==Die Scanserverkonfiguration==&lt;br /&gt;
Als erstes benötigt man die Information, welche Clientrechner überhaupt scannen dürfen sollen.&lt;br /&gt;
Diese tragen wir entweder alle einzeln in die Datei '''/etc/sane.d/saned.conf''' bzw. bei einigen Distributionen in die '''/etc/saned.conf''' ein.&lt;br /&gt;
Je nachdem ob man mit verfügbarer Namensauflösung per eigenem [[DNS]]-Server im eigenen Netz arbeitet oder mit entsprechenden Einträgen in '''/etc/hosts''' oder nur puren IP-Adressen, trägt man nun entweder die Namen der Clientrechner, deren IP-Adressen oder gar einen kompletten Netzwerkadressbereich ein.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 ## Access list&lt;br /&gt;
 # A list of host names, IP addresses or IP subnets (CIDR notation) that&lt;br /&gt;
 # are permitted to use local SANE devices. IPv6 addresses must be enclosed&lt;br /&gt;
 # in brackets, and should always be specified in their compressed form.&lt;br /&gt;
 #&lt;br /&gt;
 # The hostname matching is not case-sensitive.&lt;br /&gt;
 #scan-client.somedomain.firm&lt;br /&gt;
 #192.168.0.1&lt;br /&gt;
 192.168.2.1/24&lt;br /&gt;
 #[2001:7a8:185e::42:12]&lt;br /&gt;
 #[2001:7a8:185e::42:12]/64&lt;br /&gt;
&lt;br /&gt;
Je nach verwendeter Software und der Frage, ob der Rechner an dem der Scanner hängt auch als Arbeitsrechner genutzt wird oder nicht, kann ein zusätzlicher Eintrag für ''localhost'' dort auch Sinn machen.&lt;br /&gt;
&lt;br /&gt;
Anschließend muss im xinetd-Daemon noch in seiner Konfiguration saned aktiviert werden, damit der Scandaemon saned überhaupt über das Netzwerk verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
'''/etc/xinetd.d/sane-port'''&lt;br /&gt;
 # default: off&lt;br /&gt;
 # description: The saned provides scanner service via the network.  \&lt;br /&gt;
 #       Applications like kooka, xsane or xscanimage can use the remote \&lt;br /&gt;
 #       scanner. &lt;br /&gt;
 service sane-port&lt;br /&gt;
 {&lt;br /&gt;
         socket_type     = stream&lt;br /&gt;
         wait            = no&lt;br /&gt;
         disable         = no&lt;br /&gt;
         protocol        = tcp&lt;br /&gt;
         user            = root&lt;br /&gt;
         group           = root&lt;br /&gt;
         server          = /usr/sbin/saned&lt;br /&gt;
         port        = 6566&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Wie in der Konfigfuration zu sehen ist, nutzt saned den Port 6566 im TCP-Modus, weswegen noch sicherzustellen ist, dass dieser Port auch in '''/etc/services''' eingetragen ist, sowie eine eventuell laufende [[Firewall]] so eingestellt ist, dass der Paketfilter die Übertragung auf Port 6566 im lokalen Netzwerk (nicht über das Internet!) auch zulässt.&lt;br /&gt;
&lt;br /&gt;
Sofern xinetd und die Firewall bereits laufen, sollte man beide neu starten oder zumindest ihre Konfigurationen neu einlesen lassen.&lt;br /&gt;
Der User root mit der Gruppe root wird nur benötigt, wenn man nicht die Gerätedateien mit anderen Rechten als sie per default vergeben sind versehen will. Bei den meisten Distributionen wäre jedoch der User saned aus der Gruppe saned die korrektere Wahl. Allerdings kann es bei USB-Scannern vorkommen, dass dieser Benutzer nicht auf den Scanner zugreifen darf, da die Rechte aufgrund der dynamischen Einbindung von USB-Geräten per default eben nicht dazu passen. Dort ist root eben der einfachere Weg den Zugang zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
Wenn diese Schritte soweit erfolgt sind kann der erste Test stattfinden:&lt;br /&gt;
Man startet auf einem der Clientrechner einfach &lt;br /&gt;
 telnet scanservername 6566&lt;br /&gt;
und schaut, ob dort telnet mit einer Fehlermeldung abbricht oder nicht. Wartet telnet auf eine Eingabe, dann ist kein Fehler vorhanden und der Serverdaemon läuft bereits. Abbrechen kann man telnet in der [[Konsole]] / einer Terminalemulation mit der Tastenkombination Strg-C.&lt;br /&gt;
&lt;br /&gt;
Nun fehlt nur noch die Clientrechnereinrichtung.&lt;br /&gt;
&lt;br /&gt;
==Die Clientrechnerkonfiguration==&lt;br /&gt;
Hier bedarf es nicht viel. Es muss nur das net-Backend im saned (der hier ja nicht als Server, sondern als Vermittler zum tatsächlichen Server fungieren soll) aktiviert werden und diesem Backend der Server bekanntgegeben werden.&lt;br /&gt;
Dazu editiert man '''/etc/sane.d/dll.conf''' und fügt folgende Zeile ein bzw. entfernt die Auskommentierung der entsprechenden Backendzeile, die per Default schon dort, aber eben auskommentiert ist:&lt;br /&gt;
&lt;br /&gt;
 net&lt;br /&gt;
&lt;br /&gt;
Nun ist prinzipiell schon mal die Umleitung aufs Netzwerk aktiviert, aber der Clientrechner weiß ja noch nicht, welchen Server er dafür befragen soll. Dies wird sichergestellt in der Konfiguration des net-Backends unter '''/etc/sane.d/net.conf''', indem man dort den Server einträgt:&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
'''/etc/sane.d/net.conf'''&lt;br /&gt;
&lt;br /&gt;
 # This is the net backend config file.&lt;br /&gt;
 ## net backend options&lt;br /&gt;
 # Timeout for the initial connection to saned. This will prevent the backend&lt;br /&gt;
 # from blocking for several minutes trying to connect to an unresponsive&lt;br /&gt;
 # saned host (network outage, host down, ...). Value in seconds.&lt;br /&gt;
 # connect_timeout = 60&lt;br /&gt;
 ## saned hosts&lt;br /&gt;
 # Each line names a host to attach to.&lt;br /&gt;
 # If you list &amp;quot;localhost&amp;quot; then your backends can be accessed either&lt;br /&gt;
 # directly or through the net backend.  Going through the net backend&lt;br /&gt;
 # may be necessary to access devices that need special privileges.&lt;br /&gt;
 # localhost&lt;br /&gt;
 192.168.2.1&lt;br /&gt;
&lt;br /&gt;
Den Eintrag ''localhost'' sollte man aktivieren, sofern man einen weiteren Scanner an dem Clientrechner hängen hat, der auch an den Server gehen soll um einen &amp;quot;Zweitscanner&amp;quot; zu erreichen, ansonsten dürfte dieser Eintrag für die meisten Frontends nicht benötigt werden.&lt;br /&gt;
Nun kann die Verfügbarkeit für den / die Clientrechner am Clientrechner selbst getestet werden, indem man&lt;br /&gt;
 scanimage -L&lt;br /&gt;
in einer Konsole eingibt. Dort sollte der Scanner, der am Server vor der Aktivierung der Netzwerkfunktion logischerweise ja schon eingerichtet worden sein sollte, nun auch zu sehen sein und man kann das Frontend seiner Wahl nun scannen lassen.&lt;br /&gt;
&lt;br /&gt;
==Weiterführende Informationen==&lt;br /&gt;
===Generelle Informationen===&lt;br /&gt;
*[http://www.sane-project.org/ Website des SANE-Projekts]&lt;br /&gt;
&lt;br /&gt;
===Netzwerkfähige Frontends für SANE für diverse Nicht-Linux Systeme===&lt;br /&gt;
*[https://github.com/mback2k/wiasane/wiki/Downloads wiasane, ein SANE-Frontend (eher:WIA-Treiber) für Windows 7]&lt;br /&gt;
*[https://play.google.com/store/apps/details?id=com.sane.droid SANEDroid, ein SANE-Frontend für Android-Systeme]&lt;br /&gt;
*[http://sanetwain.ozuzo.net/#ini SaneTwain, eine SANE 2 Twain Bridge (Windows XP)]&lt;br /&gt;
*[http://www.os2warp.be/index2.php?name=tamehome Tame/2, ein SANE-Frontend für OS/2 / eComstation]&lt;br /&gt;
*[http://www.ellert.se/twain-sane/ TWAIN SANE Interface for MacOS X]&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
[[Scanner|zurück zur Scannerübersicht]]&lt;br /&gt;
[[Kategorie:Scanner]] [[Kategorie:Netzwerk]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Direkter_Zugriff_auf_qemu-Images_von_einem_Virtualisierungs-Host&amp;diff=30916</id>
		<title>Diskussion:Direkter Zugriff auf qemu-Images von einem Virtualisierungs-Host</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Direkter_Zugriff_auf_qemu-Images_von_einem_Virtualisierungs-Host&amp;diff=30916"/>
		<updated>2014-01-17T22:55:24Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Review ==&lt;br /&gt;
Bin alles durchgegangen, finde zwar nichts zu bemängeln, aber ich verstehe da ziemlich wenig von der Thematik. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 23:55, 17. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30895</id>
		<title>Diskussion:Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30895"/>
		<updated>2014-01-12T18:57:47Z</updated>

		<summary type="html">&lt;p&gt;Itu: es zählt wohl nur das lokale Terminal, oder?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Offenbar gibt es noch effektive farbcodes &amp;gt; 50.&lt;br /&gt;
 for i in $(seq 1 255); do  echo -ne  &amp;quot;\033[$i&amp;quot;m  ; echo -n $i&amp;quot; &amp;quot;  ; done ; echo -e  &amp;quot;\033[0m&amp;quot;&lt;br /&gt;
zumindest von 90 bis 106 sind da bei mir noch weitere, sehr nützliche Farben. &lt;br /&gt;
Siehe auch https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 11:48, 10. Jan. 2014 (CET)&lt;br /&gt;
:: sind aber oftmals nur in wenigen Terminaltypen bekannt, man sollte also wenn man dieses in einem Script benutzen will, vorher genau den Terminaltype und eventuell weitere Terminal Einstellungen prüfen, sonst kann das auf einem anderem Rechner oder in einem anderem Terminal sehr schnell zu unleserlichen &amp;quot;Itzelpritz&amp;quot; führen. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 22:31, 11. Jan. 2014 (CET)&lt;br /&gt;
:::Hm, Ubuntu hat das jedenfalls so. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 19:57, 12. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
==Skript==&lt;br /&gt;
Kann mal jemand das Skript vom Abschnitt [[Farbe_in_der_Konsole#farbiges_Prompt]] erläutern? Die erste Zeile versteh ich sogar fast, mich interessiert der Prompt im then-zweig. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 07:53, 11. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: meinst du das hier ?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if test \( &amp;quot;$TERM&amp;quot; = &amp;quot;xterm&amp;quot; -o &amp;quot;${TERM#screen}&amp;quot; != &amp;quot;$TERM&amp;quot; \) -a -z &amp;quot;$EMACS&amp;quot;&lt;br /&gt;
then&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\[\e]2;\u@\h:\w\007\e]1;\h\007\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::Steht fast alles im Text. '''export''' und Variablenzuweisung sowie die Bedeutung der Variable '''PS1''' lass ich mal weg. das sollte klar sein. &lt;br /&gt;
&lt;br /&gt;
::Ich zitiere mal aus dem Beitragstext und markiere farbig.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;ist folgendes Format '''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt; , &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;gefolgt von einer beliebigen Anzahl von Codes, die durch ; getrennt sind&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;und das letzte mit m abgeschlossen ist&amp;lt;/font&amp;gt;'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
export PS1=&amp;quot;\[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;31&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;m&amp;lt;/font&amp;gt;\]\u@\h:\w&amp;gt; \[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;m&amp;lt;/font&amp;gt;\]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: Das ist also nichts weiter als das setzen der Farbe '''Rot (31)''' und das zurücksetzten der Attribute auf '''Defaultwert (0)''' .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: zu erkennen hier noch zusätzlich beides Mal ist dieses zusätzlich noch in entwertete Eckige Klammern gesetzt worden. &amp;lt;br&amp;gt;&lt;br /&gt;
export PS1=&amp;quot;'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\[&amp;lt;/font&amp;gt;'''\033[31m'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\]&amp;lt;/font&amp;gt;'''\u@\h:\w&amp;gt; '''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\[&amp;lt;/font&amp;gt;'''\033[0m'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\]&amp;lt;/font&amp;gt;'''&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
::Eine Erklärung hierfür ist zu finden ebenfalls bei den promptvars die jetzt gleich kommen. Dieses ist eine Eigenheit bei den Promptvariablen. und bedeutet '''Begin'''n und '''End'''e &amp;quot;'''of a sequence of non-printing characters'''&amp;quot;  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:: das &amp;quot;'''\u@\h:\w&amp;gt;''' &amp;quot; besteht aus den normalen Zeichen  '''@ : &amp;gt;''' und dazwischen sind &amp;quot;'''\u \h \w'''&amp;quot; das sind '''promptvars'''&lt;br /&gt;
:: die Bedeutung der '''promptvars''' ist nachzulesen in der Manpage von bash unter Abschnitt '''PROMPTING''' das sind nichts weiter als Variablen die innerhalb des Prompt verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
:: Ich hoffe mal die Erklärung hilft und verwirrt nicht noch mehr, ist schwierig sowas im Wikiformat sauber und übersichtlich zu Formatieren damit es leicht verständlich ist.  ;-))))  [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 22:11, 11. Jan. 2014 (CET)&lt;br /&gt;
:::Danke für die sehr ausführliche Erläuterung, aber das hier ist im wesentlich alles klar verstanden. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 19:01, 12. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: In dem '''then''' Zweig sind jetzt hier zusätzlich noch weitere Steuerzeichen eingebettet.&amp;lt;br&amp;gt;&lt;br /&gt;
::: '''\[\e]2;\u@\h:\w\007\e]1;\h\007\]'''&amp;lt;br&amp;gt;&lt;br /&gt;
::: Diese haben nichts mit der eigentlichen Konsolfarbe zu tun, diese Sequenzen werden auch nicht mit '''m''' abgeschlossen sondern mit '''\007''' oder was dem Gleich wäre  '''\a''' .&amp;lt;br&amp;gt;'''\e]2;\u@\h:\w\007''' bin ich mir sicher das diese oben in den Titelbar des Terminalwindows schreibt, was '''\e]1;\h\007''' macht, müsste ich auch erst suchen. Auf den ersten Blick irgend was mit dem Icon. Mal selbst forschen , in meinem Xterm funktioniert beides nicht :-)&amp;lt;br&amp;gt;&lt;br /&gt;
::::: das erste( '''\[\e]2;irgendwas\a\]''' ) funktioniert doch, man muss nur xterm oder kterm benutzen. das andere scheint wohl bei KDE4 nicht zu funktionieren, ist wohl für andere Windowsmanager gedacht. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 11:37, 12. Jan. 2014 (CET)&lt;br /&gt;
::: versuche mal [https://dougbarton.us/Bash/Bash-prompts.html das hier] als Einsprungpunkt. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 00:04, 12. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30894</id>
		<title>Diskussion:Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30894"/>
		<updated>2014-01-12T18:01:49Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* Skript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Offenbar gibt es noch effektive farbcodes &amp;gt; 50.&lt;br /&gt;
 for i in $(seq 1 255); do  echo -ne  &amp;quot;\033[$i&amp;quot;m  ; echo -n $i&amp;quot; &amp;quot;  ; done ; echo -e  &amp;quot;\033[0m&amp;quot;&lt;br /&gt;
zumindest von 90 bis 106 sind da bei mir noch weitere, sehr nützliche Farben. &lt;br /&gt;
Siehe auch https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 11:48, 10. Jan. 2014 (CET)&lt;br /&gt;
:: sind aber oftmals nur in wenigen Terminaltypen bekannt, man sollte also wenn man dieses in einem Script benutzen will, vorher genau den Terminaltype und eventuell weitere Terminal Einstellungen prüfen, sonst kann das auf einem anderem Rechner oder in einem anderem Terminal sehr schnell zu unleserlichen &amp;quot;Itzelpritz&amp;quot; führen. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 22:31, 11. Jan. 2014 (CET)&lt;br /&gt;
:::Hm, Ubuntu/Debian aber auch CentOS haben das alle, hier bei mir. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 18:52, 12. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skript==&lt;br /&gt;
Kann mal jemand das Skript vom Abschnitt [[Farbe_in_der_Konsole#farbiges_Prompt]] erläutern? Die erste Zeile versteh ich sogar fast, mich interessiert der Prompt im then-zweig. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 07:53, 11. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: meinst du das hier ?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if test \( &amp;quot;$TERM&amp;quot; = &amp;quot;xterm&amp;quot; -o &amp;quot;${TERM#screen}&amp;quot; != &amp;quot;$TERM&amp;quot; \) -a -z &amp;quot;$EMACS&amp;quot;&lt;br /&gt;
then&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\[\e]2;\u@\h:\w\007\e]1;\h\007\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::Steht fast alles im Text. '''export''' und Variablenzuweisung sowie die Bedeutung der Variable '''PS1''' lass ich mal weg. das sollte klar sein. &lt;br /&gt;
&lt;br /&gt;
::Ich zitiere mal aus dem Beitragstext und markiere farbig.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;ist folgendes Format '''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt; , &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;gefolgt von einer beliebigen Anzahl von Codes, die durch ; getrennt sind&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;und das letzte mit m abgeschlossen ist&amp;lt;/font&amp;gt;'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
export PS1=&amp;quot;\[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;31&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;m&amp;lt;/font&amp;gt;\]\u@\h:\w&amp;gt; \[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;m&amp;lt;/font&amp;gt;\]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: Das ist also nichts weiter als das setzen der Farbe '''Rot (31)''' und das zurücksetzten der Attribute auf '''Defaultwert (0)''' .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: zu erkennen hier noch zusätzlich beides Mal ist dieses zusätzlich noch in entwertete Eckige Klammern gesetzt worden. &amp;lt;br&amp;gt;&lt;br /&gt;
export PS1=&amp;quot;'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\[&amp;lt;/font&amp;gt;'''\033[31m'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\]&amp;lt;/font&amp;gt;'''\u@\h:\w&amp;gt; '''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\[&amp;lt;/font&amp;gt;'''\033[0m'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\]&amp;lt;/font&amp;gt;'''&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
::Eine Erklärung hierfür ist zu finden ebenfalls bei den promptvars die jetzt gleich kommen. Dieses ist eine Eigenheit bei den Promptvariablen. und bedeutet '''Begin'''n und '''End'''e &amp;quot;'''of a sequence of non-printing characters'''&amp;quot;  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:: das &amp;quot;'''\u@\h:\w&amp;gt;''' &amp;quot; besteht aus den normalen Zeichen  '''@ : &amp;gt;''' und dazwischen sind &amp;quot;'''\u \h \w'''&amp;quot; das sind '''promptvars'''&lt;br /&gt;
:: die Bedeutung der '''promptvars''' ist nachzulesen in der Manpage von bash unter Abschnitt '''PROMPTING''' das sind nichts weiter als Variablen die innerhalb des Prompt verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
:: Ich hoffe mal die Erklärung hilft und verwirrt nicht noch mehr, ist schwierig sowas im Wikiformat sauber und übersichtlich zu Formatieren damit es leicht verständlich ist.  ;-))))  [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 22:11, 11. Jan. 2014 (CET)&lt;br /&gt;
:::Danke für die sehr ausführliche Erläuterung, aber das hier ist im wesentlich alles klar verstanden. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 19:01, 12. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: In dem '''then''' Zweig sind jetzt hier zusätzlich noch weitere Steuerzeichen eingebettet.&amp;lt;br&amp;gt;&lt;br /&gt;
::: '''\[\e]2;\u@\h:\w\007\e]1;\h\007\]'''&amp;lt;br&amp;gt;&lt;br /&gt;
::: Diese haben nichts mit der eigentlichen Konsolfarbe zu tun, diese Sequenzen werden auch nicht mit '''m''' abgeschlossen sondern mit '''\007''' oder was dem Gleich wäre  '''\a''' .&amp;lt;br&amp;gt;'''\e]2;\u@\h:\w\007''' bin ich mir sicher das diese oben in den Titelbar des Terminalwindows schreibt, was '''\e]1;\h\007''' macht, müsste ich auch erst suchen. Auf den ersten Blick irgend was mit dem Icon. Mal selbst forschen , in meinem Xterm funktioniert beides nicht :-)&amp;lt;br&amp;gt;&lt;br /&gt;
::::: das erste( '''\[\e]2;irgendwas\a\]''' ) funktioniert doch, man muss nur xterm oder kterm benutzen. das andere scheint wohl bei KDE4 nicht zu funktionieren, ist wohl für andere Windowsmanager gedacht. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 11:37, 12. Jan. 2014 (CET)&lt;br /&gt;
::: versuche mal [https://dougbarton.us/Bash/Bash-prompts.html das hier] als Einsprungpunkt. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 00:04, 12. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30893</id>
		<title>Diskussion:Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30893"/>
		<updated>2014-01-12T17:52:51Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Offenbar gibt es noch effektive farbcodes &amp;gt; 50.&lt;br /&gt;
 for i in $(seq 1 255); do  echo -ne  &amp;quot;\033[$i&amp;quot;m  ; echo -n $i&amp;quot; &amp;quot;  ; done ; echo -e  &amp;quot;\033[0m&amp;quot;&lt;br /&gt;
zumindest von 90 bis 106 sind da bei mir noch weitere, sehr nützliche Farben. &lt;br /&gt;
Siehe auch https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 11:48, 10. Jan. 2014 (CET)&lt;br /&gt;
:: sind aber oftmals nur in wenigen Terminaltypen bekannt, man sollte also wenn man dieses in einem Script benutzen will, vorher genau den Terminaltype und eventuell weitere Terminal Einstellungen prüfen, sonst kann das auf einem anderem Rechner oder in einem anderem Terminal sehr schnell zu unleserlichen &amp;quot;Itzelpritz&amp;quot; führen. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 22:31, 11. Jan. 2014 (CET)&lt;br /&gt;
:::Hm, Ubuntu/Debian aber auch CentOS haben das alle, hier bei mir. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 18:52, 12. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skript==&lt;br /&gt;
Kann mal jemand das Skript vom Abschnitt [[Farbe_in_der_Konsole#farbiges_Prompt]] erläutern? Die erste Zeile versteh ich sogar fast, mich interessiert der Prompt im then-zweig. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 07:53, 11. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: meinst du das hier ?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if test \( &amp;quot;$TERM&amp;quot; = &amp;quot;xterm&amp;quot; -o &amp;quot;${TERM#screen}&amp;quot; != &amp;quot;$TERM&amp;quot; \) -a -z &amp;quot;$EMACS&amp;quot;&lt;br /&gt;
then&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\[\e]2;\u@\h:\w\007\e]1;\h\007\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::Steht fast alles im Text. '''export''' und Variabelzuweisung sowie die Bedeutung der Variable '''PS1''' lass ich mal weg. das sollte klar sein. &lt;br /&gt;
&lt;br /&gt;
::Ich zitiere mal aus dem Beitragstext und markiere farbig.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;ist folgendes Format '''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt; , &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;gefolgt von einer beliebigen Anzahl von Codes, die durch ; getrennt sind&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;und das letzte mit m abgeschlossen ist&amp;lt;/font&amp;gt;'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
export PS1=&amp;quot;\[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;31&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;m&amp;lt;/font&amp;gt;\]\u@\h:\w&amp;gt; \[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\033[&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;m&amp;lt;/font&amp;gt;\]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:: Das ist also nichts weiter als das setzen der Farbe '''Rot (31)''' und das zurücksetzten der Attribute auf '''Defaultwert (0)''' .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: zu erkennen hier noch zusätzlich beides Mal ist dieses zusätzlich noch in entwertete Eckige Klammern gesetzt worden. &amp;lt;br&amp;gt;&lt;br /&gt;
export PS1=&amp;quot;'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\[&amp;lt;/font&amp;gt;'''\033[31m'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\]&amp;lt;/font&amp;gt;'''\u@\h:\w&amp;gt; '''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\[&amp;lt;/font&amp;gt;'''\033[0m'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;\]&amp;lt;/font&amp;gt;'''&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
::Eine Erklärung hierfür ist zu finden ebenfalls bei den promtvars die jetzt gleich kommen. Dieses ist eine Eigeneheit bei den Promptvariablen. und bedeutet '''Begin'''n und '''End'''e &amp;quot;'''of a sequence of non-printing characters'''&amp;quot;  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
:: das &amp;quot;'''\u@\h:\w&amp;gt;''' &amp;quot; besteht aus den normalen Zeichen  '''@ : &amp;gt;''' und dazwischen sind &amp;quot;'''\u \h \w'''&amp;quot; das sind '''promptvars'''&lt;br /&gt;
:: die Bedeutung der '''promptvars''' ist nachzulesen in der Manpage von bash unter Abschnitt '''PROMPTING''' das sind nichts weiter als Variablen die innerhalb des Prompt verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
:: Ich hoffe mal die Erklärung hilft und verwirrt nicht noch mehr, ist schwierig sowas im Wikiformat sauber und übersichtlich zu Formatieren damit es leicht verständlich ist.  ;-))))  [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 22:11, 11. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::: In dem '''then''' Zweig sind jetzt hier zusätzlich noch weitere Steuerzeichen eingebettet.&amp;lt;br&amp;gt;&lt;br /&gt;
::: '''\[\e]2;\u@\h:\w\007\e]1;\h\007\]'''&amp;lt;br&amp;gt;&lt;br /&gt;
::: Diese haben nichts mit der eigentlichen Konsolfarbe zu tun, diese Sequenzen werden auch nicht mit '''m''' abgeschlossen sondern mit '''\007''' oder was dem Gleich wäre  '''\a''' .&amp;lt;br&amp;gt;'''\e]2;\u@\h:\w\007''' bin ich mir sicher das diese oben in den Titelbar des Terminalwindows schreibt, was '''\e]1;\h\007''' macht, müsste ich auch erst suchen. Auf den ersten Blick irgend was mit dem Icon. Mal selbst forschen , in meinem Xterm funktioniert beides nicht :-)&amp;lt;br&amp;gt;&lt;br /&gt;
::::: das erste( '''\[\e]2;irgendwas\a\]''' ) funktioniert doch, man muss nur xterm oder kterm benutzen. das andere scheint wohl bei KDE4 nicht zu funktionieren, ist wohl für andere Windowsmanager gedacht. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 11:37, 12. Jan. 2014 (CET)&lt;br /&gt;
::: versuche mal [https://dougbarton.us/Bash/Bash-prompts.html das hier] als Einsprungpunkt. [[Benutzer:Robi|Robi]] ([[Benutzer Diskussion:Robi|Diskussion]]) 00:04, 12. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30883</id>
		<title>Diskussion:Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30883"/>
		<updated>2014-01-11T06:53:31Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Offenbar gibt es noch effektive farbcodes &amp;gt; 50.&lt;br /&gt;
 for i in $(seq 1 255); do  echo -ne  &amp;quot;\033[$i&amp;quot;m  ; echo -n $i&amp;quot; &amp;quot;  ; done ; echo -e  &amp;quot;\033[0m&amp;quot;&lt;br /&gt;
zumindest von 90 bis 106 sind da bei mir noch weitere, sehr nützliche Farben. &lt;br /&gt;
Siehe auch https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 11:48, 10. Jan. 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skript==&lt;br /&gt;
Kann mal jemand das Skript vom Abschnitt [[Farbe_in_der_Konsole#farbiges_Prompt]] erläutern? Die erste Zeile versteh ich sogar fast, mich interessiert der Prompt im then-zweig. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 07:53, 11. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Farbe_in_der_Konsole&amp;diff=30882</id>
		<title>Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Farbe_in_der_Konsole&amp;diff=30882"/>
		<updated>2014-01-10T13:29:10Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* Die ANSI Escape Sequence für Attribut- und Farbdarstellung */ ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Farbe in der Konsole ==&lt;br /&gt;
&lt;br /&gt;
; Vorbemerkung :&lt;br /&gt;
hin und wieder möchte man auch auf einem Textterminal etwas Hervorheben oder farbig markieren. Das so etwas geht, hat wohl jeder schon einmal erlebt, nachdem man z.B. '''mc''' gestartet hat oder bei der Ausgabe von '''ls''' sich über die bunten Dateinamen gewundert hat.&lt;br /&gt;
&lt;br /&gt;
* Auf einem Textterminal ist eine farbige Anzeige mittels '''ANSI Escape Sequences''' möglich&lt;br /&gt;
* Nicht alle Terminals unterstützen dies &lt;br /&gt;
* Welchen Terminaltyp man derzeit benutzt, ist in der TERM-Umgebungsvariable hinterlegt. '''echo $TERM'''&lt;br /&gt;
* Eine Übersicht, welche Typen farbige Ausgaben unterstützen findet man in der Datei /etc/DIR_COLORS (es ist aber nicht die authoritative Quelle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Die ANSI Escape Sequence für Attribut- und Farbdarstellung ===&lt;br /&gt;
 &lt;br /&gt;
; das Prinzip der Escape-Sequenzen für farbige Ausgabe:&lt;br /&gt;
ist folgendes Format '''\033[''', gefolgt von einer beliebigen Anzahl von Codes, die durch ''';''' getrennt sind, und das letzte mit '''m''' abgeschlossen ist, z.B. '''\033[1;37;41m'''.&lt;br /&gt;
&lt;br /&gt;
dabei gilt im Einzelnen&lt;br /&gt;
* '''Eröffnung der Sequenz''' ist immer '''\033[''' oder etwas abgekürzt '''\e[''' &lt;br /&gt;
&lt;br /&gt;
* Codes für die Hintergrundfarbe:&lt;br /&gt;
:* 40=schwarz&lt;br /&gt;
:* 41=rot&lt;br /&gt;
:* 42=grün&lt;br /&gt;
:* 43=braun&lt;br /&gt;
:* 44=blau&lt;br /&gt;
:* 45=violett (&amp;quot;magenta&amp;quot;)&lt;br /&gt;
:* 46=cyan&lt;br /&gt;
:* 47=grau (&amp;quot;weiß&amp;quot;)&lt;br /&gt;
:* 49=Standard&lt;br /&gt;
: &amp;quot;Standard&amp;quot; bezieht sich auf die Voreinstellung des Terminals bzw. des Konsolenprogramms, und kann - insbesondere bei grafischen Terminalemulatoren - von allen (40 bis 47) in der Farbe abweichen.&lt;br /&gt;
&lt;br /&gt;
* Codes für Textattribute:&lt;br /&gt;
:* 0=alle Attribute und Farben zurücksetzen&lt;br /&gt;
:* 1=fett&lt;br /&gt;
:* 2=kursiv (wird oft nicht dargestellt oder durch eine Farbe ersetzt)&lt;br /&gt;
:* 4=unterstrichen&lt;br /&gt;
:* 5=blinken&lt;br /&gt;
:* 7=reverse&lt;br /&gt;
:* 22=fett ausschalten&lt;br /&gt;
:* 24=Unterstreichung ausschalten&lt;br /&gt;
:* 25=Blinken ausschalten&lt;br /&gt;
:* 27=reverse umkehren&lt;br /&gt;
&lt;br /&gt;
* Codes für die Vordergrundfarben&lt;br /&gt;
:* Wie bei Hintergrund, aber statt 40-47,49 jeweils 30-37,39&lt;br /&gt;
&lt;br /&gt;
* ''die einzelnen Codes werden mit Semikolon ohne zusätzliche Leerzeichen getrennt''&lt;br /&gt;
&lt;br /&gt;
* '''den Abschluss''' bildet ein '''m'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in Verbindung mit dem Attribut 0 oder 1 ergeben sich folgende Textfarben &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Black       0;30     Dark Gray     1;30&lt;br /&gt;
Blue        0;34     Light Blue    1;34&lt;br /&gt;
Green       0;32     Light Green   1;32&lt;br /&gt;
Cyan        0;36     Light Cyan    1;36&lt;br /&gt;
Red         0;31     Light Red     1;31&lt;br /&gt;
Purple      0;35     Light Purple  1;35&lt;br /&gt;
Brown       0;33     Yellow        1;33&lt;br /&gt;
Light Gray  0;37     White         1;37&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispiel für farbige Ausgaben ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo -e &amp;quot;\033[46;1;31m TESTAUSGABE \033[43;4;34m KUNTER \033[45;1;32m BUNT \033[44;1;33m ANGESTRICHEN \033[0m&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am Ende sollte möglichst immer '''\033[0m''' anbinden, damit die nachfolgende Ausgabe dann wieder &amp;quot;normal&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Script um eine Farbübersicht zu erhalten ====&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht welche Farben wie auf welcher Hintergrundfarbe wirkt, kann man mit diesem kleinem Script hier erzeugen&lt;br /&gt;
[[http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html Fundort]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
#   This file echoes a bunch of color codes to the &lt;br /&gt;
#   terminal to demonstrate what's available.  Each &lt;br /&gt;
#   line is the color code of one forground color,&lt;br /&gt;
#   out of 17 (default + 16 escapes), followed by a &lt;br /&gt;
#   test use of that color on all nine background &lt;br /&gt;
#   colors (default + 8 escapes).&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
T='gYw'   # The test text&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\n                 40m     41m     42m     43m\&lt;br /&gt;
     44m     45m     46m     47m&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \&lt;br /&gt;
           '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \&lt;br /&gt;
           '  36m' '1;36m' '  37m' '1;37m';&lt;br /&gt;
  do FG=${FGs// /}&lt;br /&gt;
  echo -en &amp;quot; $FGs \033[$FG  $T  &amp;quot;&lt;br /&gt;
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;&lt;br /&gt;
    do echo -en &amp;quot;$EINS \033[$FG\033[$BG  $T  \033[0m&amp;quot;;&lt;br /&gt;
  done&lt;br /&gt;
  echo;&lt;br /&gt;
done&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== der Befehl tput ===&lt;br /&gt;
&lt;br /&gt;
Wie wir es gewohnt sind, gibt es unter LINUX immer mehrere Möglichkeiten um ein und das selbe zu erreichen.&lt;br /&gt;
mit dem Befehl '''tput''' läßt sich ebenfalls Farbe auf die Konsole zaubern. Das ist aber nur ein Teilbereich dieses Befehls.&lt;br /&gt;
Für genauere Informationen bitte in die Manpages von  [http://www.die.net/doc/linux/man/man1/tput.1.html tput] und [http://www.die.net/doc/linux/man/man5/terminfo.5.html terminfo] schauen. Einen kleinen Vorgeschmack über die Möglichkeiten mittels&lt;br /&gt;
tput die Farben innerhalb des Terminals zu beeinflussen bekommt man auch [http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html hier]&lt;br /&gt;
&lt;br /&gt;
Neben der Wahl von Textfarbe, Hintergrundfarbe, Textattribute wie Fett und Unterstrichen (um nur mal einige der Wichtigsten zu nennen), kann man&lt;br /&gt;
mit tput auch den Cursor innerhalb des Terminals frei positionieren, einzelne Zeichen oder Zeilen löschen, oder neue Zeichen und Zeilen dazwischenschieben, den Bildschirm leer machen, oder das Terminal auf seine Einstellungen zurücksetzen, wenn man mal nur noch Sonderzeichen auf dem Bildschirm hat, die Eigenschaften des aktuellen Terminals abfragen und vieles mehr. Aber auch hier ist zu bemerken, dass die Möglichkeiten dieses Befehles schon durch die jeweiligen Terminaleinstellungen beschränkt werden. Man sollte also daran denken, wenn man innerhalb eines Scriptes mit tput arbeitet, dass es auf einem anderem Rechner oder den Einstellungen eines anderen Users durchaus auch ein furchtbares unansehnliches Bild ergeben kann. Auch sollte man unbedingt prüfen ob sich am Ende wirklich ein Terminal ( besser sogar noch welcher Terminaltyp ) befindet, oder die Ausgabe eventuell in eine Datei oder in eine Pipe geleitet ist. Anstelle von Erklärungen der einzelnen Funktionen und Optionen von tput hier ein kleines Script in dem einige Funktionen von tput eingebaut sind, zum Ausprobieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -t 1 ]&lt;br /&gt;
then&lt;br /&gt;
typeset -i ZEILE&lt;br /&gt;
&lt;br /&gt;
tput clear&lt;br /&gt;
for HINTERGRUND in 0 1 2 3 4 5 6 7 8&lt;br /&gt;
do&lt;br /&gt;
  tput sgr0&lt;br /&gt;
  tput setaf $HINTERGRUND&lt;br /&gt;
  ZEILE=5+$HINTERGRUND&lt;br /&gt;
&lt;br /&gt;
  for POSITION in 5 30 55&lt;br /&gt;
  do&lt;br /&gt;
    tput cup  $ZEILE $POSITION&lt;br /&gt;
    if [ $POSITION -eq 30 ]&lt;br /&gt;
     then tput smul&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $POSITION -eq 55 ]&lt;br /&gt;
     then tput bold; tput rmul;&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    for FARBE in 0 1 2 3 4 5 6 7 8&lt;br /&gt;
    do&lt;br /&gt;
      tput setab $FARBE&lt;br /&gt;
      echo -n &amp;quot;X-&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
tput sgr0&lt;br /&gt;
tput home&lt;br /&gt;
for i in 1 2 3&lt;br /&gt;
do&lt;br /&gt;
 tput bel&lt;br /&gt;
 sleep 1&lt;br /&gt;
 tput flash&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
echo &amp;quot;Ausgabe geht nicht an ein Terminal&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Anwendung von tput innerhalb eines Scriptes ====&lt;br /&gt;
&lt;br /&gt;
oftmals wird man Farb- oder Testattribute öfter innerhalb eines Scriptes verwenden wollen.&lt;br /&gt;
Es ist deshalb oftmals von Vorteil, wenn man diese Attribute in Variable ablegt, und dann an Ort und Stelle in die&lt;br /&gt;
Ausgaben einbaut. Ein kleines Beispiel soll das verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BLACK=`tput setaf 0`&lt;br /&gt;
ROT=`tput setaf 1`&lt;br /&gt;
BLAU=`tput setaf 4`&lt;br /&gt;
GELB=`tput setaf 3`&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Das hier ist ein Text der durch ${ROT}rote${BLACK} durch ${BLAU}blaue ${BLACK}&amp;quot; &lt;br /&gt;
echo &amp;quot;und ${GELB}gelbe ${BLACK} Worte ${ROT}unterbrochen ${BLACK}ist.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anwendung im Shell Prompt ===&lt;br /&gt;
 &lt;br /&gt;
==== farbiges Prompt ====&lt;br /&gt;
&lt;br /&gt;
Die Shellvariable PS1 steuert das Verhalten des Prompts.&lt;br /&gt;
Du kannst folgendes in deine .bashrc (in deinem Homeverzeichnis) schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if test \( &amp;quot;$TERM&amp;quot; = &amp;quot;xterm&amp;quot; -o &amp;quot;${TERM#screen}&amp;quot; != &amp;quot;$TERM&amp;quot; \) -a -z &amp;quot;$EMACS&amp;quot;&lt;br /&gt;
then&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\[\e]2;\u@\h:\w\007\e]1;\h\007\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann die Datei neu einlesen oder eine neue Bash eröffnen damit die Änderung wirkt&amp;lt;br/&amp;gt;&lt;br /&gt;
es genügt '''.bashrc''' im Homeverzeichnis abzusetzen&lt;br /&gt;
&lt;br /&gt;
Danach solltest du einen roten Prompt haben. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Farbiger Errorlevel im Prompt ====&lt;br /&gt;
&lt;br /&gt;
Errorlevel in rot anzeigen &lt;br /&gt;
Folgenden Code in der aktuellen Bash ausführen oder für dauerhaften Gebrauch in der ~/.bashrc ablegen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PROMPT_COMMAND='LASTERROR=&amp;quot;[$?]&amp;quot; ; test &amp;quot;$LASTERROR&amp;quot; = &amp;quot;[0]&amp;quot; || echo -ne &amp;quot;\033[93;41m${LASTERROR}\033[0m&amp;quot;'&lt;br /&gt;
export PROMPT_COMMAND &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird der Rückgabe Wert eines Befehles oder Scriptes insofern er nicht '''0''' ist, innerhalb des folgenden Prompt farbig angezeigt, das kann sehr hilfreich sein, z. B. für das Schreiben und Testen von Befehlsketten oder Scripte.&lt;br /&gt;
&lt;br /&gt;
==== Links zum Thema Prompt ====&lt;br /&gt;
* [http://www.tldp.org/linuxfocus/common/sart/index.html#2000-02-14%3A5 Colors in the command prompt]&lt;br /&gt;
* [http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/index.html Bash-Prompt]&lt;br /&gt;
&lt;br /&gt;
=== Anwendungen innerhalb des ls Befehles ===&lt;br /&gt;
&lt;br /&gt;
Der ls Befehl kann Dateientypen an Dateiattributen und Prefixen erkennen und farbig darstellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch [http://www.die.net/doc/linux/man/man1/ls.1.html man ls] &amp;lt;br/&amp;gt;&lt;br /&gt;
Verantwortlich für das Einschalten dieser Funktion ist die Option '''--color'''&lt;br /&gt;
&lt;br /&gt;
==== Zuordnung der Farben zu den Dateitypen ====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung der Farben zu den Dateitypen wird global für alle in der '''/etc/DIR_COLORS''' vorgenommen.&lt;br /&gt;
Jedem User sollte es aber möglich sein diese Datei in sein Homeverzeichnis unter dem Namen '''.dir_colors''' zu kopieren, dann kann er seinen Bedürfnissen und Vorlieben entsprechend, selbst seine persönlichen Einstellungen durch ändern dieser Datei vornehmen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /etc/DIR_COLORS ~/.dir_colors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach einfach die bash neu starten, damit die Änderungen wirken.&lt;br /&gt;
&lt;br /&gt;
Mehr Infos mit '''man DIR_COLORS'''&lt;br /&gt;
&lt;br /&gt;
==== Links zum Thema ls und Color ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.linux-user.de/ausgabe/2001/12/092-zubefehl/ls-3.html ls Bitte in bunt]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syntax Highlighting im [[Text editieren mit vi|vi]] ===&lt;br /&gt;
&lt;br /&gt;
Der [[Text editieren mit vi|Texteditor vi]] auf der Konsole, der in keinem LINUX/UNIX fehlt, ist in den modernen Linuxsystemen auf einen wesentlich leistungsfähigeren Nachfolger [http://www.vim.org/ '''vim'''] oder einen Klon davon, gelinkt. Dieser Editor kann unter Anderem auch '''Syntax Highlighting&amp;quot;''' für eine Vielzahl von Dateitypen.&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis ''/usr/share/vim/current/syntax/'' stehen die Syntaxkonfigurationsfiles. Anhand der Endung (prefix) der zu editierenden Datei erkennt vim welche Syntax für diesen Dateitype zu benutzen ist. Selbstverständlich kann man auch seine eigenen Syntax-Konfigurationsfiles entwerfen und einsetzen und auch die Farben anpassen. Siehe dazu http://vimdoc.sourceforge.net/htmldoc/usr_44.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ein- Ausschalten des Syntax highlighting im vim ====&lt;br /&gt;
&lt;br /&gt;
; permanent durch Eintrag in der Vim-Konfigurationsdatei ~/.vimrc :&lt;br /&gt;
anlegen der Datei bzw. erweitern dieser Datei und folgenden Eintrag vornehmen &lt;br /&gt;
 '''syntax on'''&lt;br /&gt;
&lt;br /&gt;
; bei Bedarf durch Zeilenoption beim Start von vi :&lt;br /&gt;
 # vi +'''&amp;quot;syn on&amp;quot;''' file.prefix&lt;br /&gt;
&lt;br /&gt;
; bei Bedarf während der Sitzung im Kommandomodus :&lt;br /&gt;
hier kann während der Sitzung dieser Modus nach Belieben Ein- und Ausgeschaltet werden&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:syntax on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Analog Ausschalten &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:syntax off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Orginal http://www.linux-club.de/viewtopic.php?t=15252--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Konsole]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30881</id>
		<title>Diskussion:Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30881"/>
		<updated>2014-01-10T10:48:42Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Offenbar gibt es noch effektive farbcodes &amp;gt; 50.&lt;br /&gt;
 for i in $(seq 1 255); do  echo -ne  &amp;quot;\033[$i&amp;quot;m  ; echo -n $i&amp;quot; &amp;quot;  ; done ; echo -e  &amp;quot;\033[0m&amp;quot;&lt;br /&gt;
zumindest von 90 bis 106 sind da bei mir noch weitere, sehr nützliche Farben. &lt;br /&gt;
Siehe auch https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 11:48, 10. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30880</id>
		<title>Diskussion:Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Farbe_in_der_Konsole&amp;diff=30880"/>
		<updated>2014-01-10T09:53:14Z</updated>

		<summary type="html">&lt;p&gt;Itu: Die Seite wurde neu angelegt: „Offenbar gibt es noch effektive farbcodes &amp;gt; 50.  for i in $(seq 1 255); do  echo -ne  &amp;quot;\033[$i&amp;quot;m  ; echo -n $i&amp;quot; &amp;quot;  ; done ; echo -e  &amp;quot;\033[0m&amp;quot; zumindest von 90…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Offenbar gibt es noch effektive farbcodes &amp;gt; 50.&lt;br /&gt;
 for i in $(seq 1 255); do  echo -ne  &amp;quot;\033[$i&amp;quot;m  ; echo -n $i&amp;quot; &amp;quot;  ; done ; echo -e  &amp;quot;\033[0m&amp;quot;&lt;br /&gt;
zumindest von 90 bis 106 sind da bei mir noch weitere, sehr nützliche Farben. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 10:53, 10. Jan. 2014 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=ImageMagick&amp;diff=30871</id>
		<title>ImageMagick</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=ImageMagick&amp;diff=30871"/>
		<updated>2014-01-07T13:22:23Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Software|&lt;br /&gt;
 Name= '''ImageMagick'''&amp;lt;br /&amp;gt;[[Bild:imagemagick-logo.jpg]]&lt;br /&gt;
|Hersteller= ImageMagick Studio LLC&lt;br /&gt;
|AktuelleVersion= 6.3.3-9&lt;br /&gt;
|AktuelleVersionFreigabeDatum= 20.04.2007&lt;br /&gt;
|Betriebssystem= Linux, Windows, Solaris, MacOS, FreeBSD&lt;br /&gt;
|Kategorie= [[Grafik]]&lt;br /&gt;
|Lizenz= [http://de.wikipedia.org/wiki/GPL GLP] [http://www.imagemagick.org/script/license.php kompatibel]&lt;br /&gt;
|Deutsch= Nein&lt;br /&gt;
|Website= http://www.imagemagick.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist was kann ImageMagick ==&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/ImageMagick ImageMagick][http://tarr.uspto.gov/servlet/tarr?regser=serial&amp;amp;entry=78333969 ®] ist ein Softwarepaket, zur Erstellung und Bearbeitung von [http://de.wikipedia.org/wiki/Rastergrafik Rastergrafiken]. Es kann Bilder in eine Vielzahl gebräuchlicher Formate (derzeit ungefähr 100) einschließlich DPX, GIF, JPEG, JPEG-2000, pdf, PhotoCD, png, Postskriptum, SVG und tiff lesen, umwandeln und schreiben. Mit ImageMagick können zum Beispiel Bilder kombiniert, in andere Formate umgewandelt, gedreht, gespiegelt, zugeschnitten oder in der Größe verändert werden. Es lassen sich aber auch umfangreiche Manipulationen an den Bildfarben und verschiedene spezielle Effekte und Filter anwenden, oder Text, Linien, Polygone, Ellipsen und Bézier Kurven mit ImageMagick zeichnen. Die Funktionalität von ImageMagick wird gewöhnlich von der Kommandozeile oder aus Scripten heraus verwendet. Darüber hinaus bietet ImageMagick aber auch die Möglichkeit und Schnittstellen, um die Funktionen aus anderen Programmen und Programmiersprachen heraus, aufzurufen. &lt;br /&gt;
Es lassen sich Bilder auch dynamisch erzeugen oder ändern, was es unter anderem für Webanwendungen sehr interessant macht. Einen kleinen Überblick über  Möglichkeiten der Bildbearbeitung mit ImageMagick kann man sich auf [http://www.imagemagick.org/script/examples.php der Beispielseite] ansehen. &lt;br /&gt;
 &lt;br /&gt;
ImageMagick ist eine freie Software, die sowohl als fertige Programmpakete für eine ganze Reihe Betriebssysteme, sowie auch als Quellenprogrammpaket zur Verfügung steht, und die frei verwendet, kopiert, geändert und verteilt werden kann. [http://www.imagemagick.org/script/license.php Seine Lizenz] ist mit [http://www.fsf.org/licensing/licenses/ GPL] kompatibel. ImageMagick gibt es für alle verbreiteten Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier sind einige Beispiele aufgeführt, was man mit ImageMagick tun kann:&lt;br /&gt;
* '''Formatumwandlung''': ein Bild von einem Format in andere umwandeln (z.B. png zu JPEG)&lt;br /&gt;
* '''Transformation''': die Größe neu bestimmen, drehen, beschneiden, flippen oder trimmen &lt;br /&gt;
* '''Bildtransparents''': Teile eines Bildes unsichtbar machen &lt;br /&gt;
* '''Zeichnen''': Formen oder Text einem Bild hinzufügen &lt;br /&gt;
* '''Dekorieren''': einen Rand oder einen Rahmen einem Bild hinzufügen &lt;br /&gt;
* '''Spezielle Effekte''': Unschärfe, schärfen, Schwellewerten anwenden oder abtönen eines Bildes &lt;br /&gt;
* '''Mathematische Berechnungen''': einen mathematischen Ausdruck auf ein Bild oder einzelne Bildkanäle anwenden &lt;br /&gt;
* '''Text u. Anmerkungen''': Schrift oder künstlerische Textverzierungen auf einem Bild einsetzen &lt;br /&gt;
* '''Identifikation''': das Format und die Attribute eines Bildes beschreiben oder auslesen &lt;br /&gt;
* '''Animation''': eine GIF Animation von einer Gruppe Bildern erstellen &lt;br /&gt;
* '''Bildmontage''': Überdeckung von Bildern oder Mischen der einzelnen Bildkanäle  &lt;br /&gt;
* '''Kombinationen''': ein Set von Vorschaubildern zu einem Bild kombinieren &lt;br /&gt;
* '''Unterstützung für große Bilder''': Mega- und Gigapixel Bildgrößen lesen, verarbeiten oder schreiben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Wohl alle größeren Linux-Distributionen bringen fertige Installationspakete von ImageMagick mit. Eventuell muss das Paket von der Installations-DVD nachinstalliert werden. Die Installation über einen Paketmanager sollte kein Problem darstellen. Einer manuellen Installation mittels rpm-Kommando wird wegen vieler Abhängigkeiten abgeraten.&amp;lt;br&amp;gt;&lt;br /&gt;
Paketname ist unter SuSE '''ImageMagick''' ( ''eines der wenigen Pakete mit Großbuchstaben im Namen'' )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bemerkungen zu den Versionen ===&lt;br /&gt;
&lt;br /&gt;
An ImageMagick wird zurzeit&amp;lt;!-- =Jahr? --&amp;gt; sehr viel und erfolgreich gearbeitet, das umfasst sowohl neue Funktionen und Methoden wie auch die Beseitigung von Bugs.&lt;br /&gt;
Es ist also nicht verwunderlich, wenn fast wöchentlich eine neue Sub-Version auf den Download-Servern zu finden ist. ([http://www.imagemagick.org/script/changelog.php Changelog])&lt;br /&gt;
Das hat aber nicht nur Vorteile. Nicht alles was man unter [http://www.imagemagick.org/Usage/ Beispiele] findet, wird man auf seinem Rechner zum Laufen bekommen, da dort oftmals in den Beispielen die neusten Methoden vorgestellt und dokumentiert werden. Und hat man mit Hilfe der oben genannten Beispiele endlich sein Script so, dass es genau das macht, was man will, läuft das Script aber nicht zwangläufig auf dem nächsten Rechner auch, wenn dort noch eine ältere Version darauf ist. Einen sehr großen Sprung hat es zwischen der Hauptversion 5 und 6 gegeben. ''(Die Version 5 wurde z.B. noch unter Suse 9.1 ausgeliefert)'' Hier kann man davon ausgehen, dass einige Befehle und Optionen und somit ganze Scripte zwischen beiden Hauptversionen überhaupt nicht kompatibel ist. Eine Erklärung warum das notwendig war, kann man nachlesen unter [http://www.imagemagick.org/Usage/basics/#why why]. Man sollte sich also überlegen, mit welcher Version man komplizierte Scripte und Konzepte mit ImageMagick entwickeln will, die dann auch auf anderen (eventuell unter älteren Versionen) Rechnern laufen sollen. Im Zweifelsfall sollte man daran denken, bei der Weitergabe komplizierter Scripte einen Verweis auf die eigene verwendete Version von ImageMagick zu hinterlegen. Als Anhaltspunkte hier die ausgelieferten Versionen von [[openSUSE]]. ''(Es werden bei den default-Onlineaktualisierungen von [[openSUSE]] auch keine neuen Versionen installiert sondern lediglich Erneuerungen bei Sicherheitsproblemen oder schwerwiegenden Fehlern durchgeführt.)''&lt;br /&gt;
&lt;br /&gt;
Unter Suse sind folgende Versionen von ImageMagick ausgeliefert worden:&lt;br /&gt;
*  SuSE 10.0: 6.2.3&lt;br /&gt;
*  SuSE 10.1: 6.2.5&lt;br /&gt;
*  [[openSUSE]] 10.2: 6.3.0&lt;br /&gt;
*  aktuell: Version (22.04.2007) 6.3.3&lt;br /&gt;
&lt;br /&gt;
=== ImageMagick selbst kompilieren ===&lt;br /&gt;
&lt;br /&gt;
ImageMagick selbst zu kompilieren geht nach dem berühmten 3-Satz wie [[Software aus dem Quelltext Installieren/Deinstallieren|hier]] beschrieben.&lt;br /&gt;
das ''configure-Script'' ohne besondere Optionen wird sich auf dem Rechner nach jeder Menge Library und Header-Dateien umschauen, und dementsprechend ImageMagick konfigurieren. &lt;br /&gt;
Sobald configure fehlerfrei beendet wurde, sollte man sich dessen Ausgabe, insbesondere folgenden Abschnitt, etwas genauer anschauen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ImageMagick is configured as follows. Please verify that this configuration&lt;br /&gt;
matches your expectations.&lt;br /&gt;
&lt;br /&gt;
Host system type : i686-pc-linux-gnu&lt;br /&gt;
&lt;br /&gt;
                  Option                        Value&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
Shared libraries  --enable-shared=yes           yes&lt;br /&gt;
Static libraries  --enable-static=yes           yes&lt;br /&gt;
Module support    --with-modules=yes            yes&lt;br /&gt;
GNU ld            --with-gnu-ld=yes             yes&lt;br /&gt;
Quantum depth     --with-quantum-depth=16       16&lt;br /&gt;
&lt;br /&gt;
Delegate Configuration:&lt;br /&gt;
BZLIB             --with-bzlib=yes              yes&lt;br /&gt;
DJVU              --with-djvu=yes               yes&lt;br /&gt;
DPS               --with-dps=yes                no&lt;br /&gt;
FlashPIX          --with-fpx=no                 no&lt;br /&gt;
FontConfig        --with-fontconfig=yes         yes&lt;br /&gt;
FreeType          --with-freetype=yes           yes&lt;br /&gt;
GhostPCL          None                          pcl6 (unknown)&lt;br /&gt;
Ghostscript       None                          gs (8.15.3)&lt;br /&gt;
Ghostscript fonts --with-gs-font-dir=default    /usr/share/ghostscript/fonts/&lt;br /&gt;
Ghostscript lib   --with-gslib=yes              no (failed tests)&lt;br /&gt;
Graphviz          --with-gvc=yes                no&lt;br /&gt;
JBIG              --with-jbig=yes               no&lt;br /&gt;
JPEG v1           --with-jpeg=yes               yes&lt;br /&gt;
JPEG-2000         --with-jp2=yes                yes&lt;br /&gt;
LCMS              --with-lcms=yes               no&lt;br /&gt;
Magick++          --with-magick-plus-plus=yes   yes&lt;br /&gt;
PERL              --with-perl=yes               /usr/bin/perl&lt;br /&gt;
PNG               --with-png=yes                yes&lt;br /&gt;
RSVG              --with-rsvg=yes               yes&lt;br /&gt;
TIFF              --with-tiff=yes               yes&lt;br /&gt;
Windows fonts     --with-windows-font-dir=      none&lt;br /&gt;
WMF               --with-wmf=yes                        yes&lt;br /&gt;
X11               --with-x=                     yes&lt;br /&gt;
XML               --with-xml=yes                yes&lt;br /&gt;
ZLIB              --with-zlib=yes               yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
hier hat das Script entsprechend der Tools und Dateien, die es auf dem Rechner gefunden hat, die Konfiguration der optional-Features und optionalen Pakete zusammengefasst. Ist hier bei einer gewünschen Option ein '''no''' oder '''none''' eingetragen, sollten man mit dem Paketmanager die entsprechenden Devel-Pakete oder gar die entsprechenden Libray- oder Programmpakete nachinstallieren und ''configure'' noch einmal laufen lassen.&lt;br /&gt;
&lt;br /&gt;
== Schnittstellen zu anderen Programmen oder Programmiersprachen ==&lt;br /&gt;
&lt;br /&gt;
Zur Zeit sind folgende [http://www.imagemagick.org/script/api.php Interface für ImageMagick] bekannt.&lt;br /&gt;
&lt;br /&gt;
* [https://gna.org/projects/g2f/ G2F] ('''Ada''')&lt;br /&gt;
* [http://www.imagemagick.org/script/magick-core.php MagickCore] ('''C''')&lt;br /&gt;
* [http://www.imagemagick.org/script/magick-wand.php MagickWand] ('''C''')&lt;br /&gt;
* [http://www.imagemagick.org/ChMagick/ ChMagick] ('''Ch''')&lt;br /&gt;
* [http://www.imagemagick.org/script/ImageMagickObject.php ImageMagickObject] ('''COM+''')&lt;br /&gt;
* [http://www.imagemagick.org/Magick++/ Magick++] ('''C++''')&lt;br /&gt;
* [http://www.yeo.id.au/jmagick/ JMagick] ('''Java''')&lt;br /&gt;
* [http://common-lisp.net/project/cl-magick/ CL-Magick] ('''Lisp''')&lt;br /&gt;
* [http://code.google.com/p/nmagick/ nMagick] ('''Neko/haXe''')&lt;br /&gt;
* [http://midimick.com/magicknet/ MagickNet] ('''.NET''')&lt;br /&gt;
* [http://wiki.lazarus.freepascal.org/PascalMagick PascalMagick] ('''Pascal''')&lt;br /&gt;
* [http://www.imagemagick.org/script/perl-magick.php PerlMagick] ('''Perl''')&lt;br /&gt;
* [http://www.magickwand.org/ MagickWand for PHP] ('''PHP''')&lt;br /&gt;
* [http://www.imagemagick.org/download/python/ PythonMagick] ('''Python''')&lt;br /&gt;
* [http://rmagick.rubyforge.org/ RMagick] ('''Ruby''') &lt;br /&gt;
* [http://tclmagick.sourceforge.net/ TclMagick] ('''Tcl/TK''')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Befehle von ImageMagick ==&lt;br /&gt;
&lt;br /&gt;
=== convert ===&lt;br /&gt;
&lt;br /&gt;
'''convert''' ist das wohl wichtigste Kommando innerhalb ImageMagick. Die meisten Operationen können mit diesem Kommando gemacht werden.&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/convert Convert] kennt eine Unmenge an Operatoren, Settings und Kombinationen die auf ein oder mehrere Eingangsbilder sowohl einzeln oder in Kombinationen Anwendung finden können, um dann daraus ein oder mehrere Ausgangsbilder zu erstellen. Und damit noch lange nicht genug kann convert auch mit einer Befehlszeile ganze Sequenzen von Bilder verarbeiten, oder intern in fast beliebiger Schachtelungstiefe Zwischenbilder in eine Stack speichern, um sie von dort aus in eine der nächsten Teilschritte weiterzuverarbeiten. Eine Einführung in die Kommandostruktur und deren Möglichkeiten kann [http://www.imagemagick.org/script/command-line-processing.php hier] nachgelesen werden. &lt;br /&gt;
&lt;br /&gt;
Mit convert können unter anderem Kopien von Bilddateien in andere Bildformate oder Farbtiefen hergestellt werden, es können die Größe der Bilder verändert, Bilder gedrehen, gespiegeln oder verzerren werden, Bildteile herausgeschnitten, oder weggeblendet werden, Rahmen und Hintergrund  der Bilder kann gestaltet werden, es können Bilder beschriftet oder es kann mit den Zeichnenwerkzeugen oder nur durch pure Mathematik Zwischenbilder oder Bildmasken für die weitere Bildverarbeitung neu erstellt werden. Es konnen mehrere Bilder zu einen Bild montiert und dabei die Farbkanäle der einzelnen Bilder auf die unterschiedlichste Art beeinflußt werden. Es können animierte Bilder erzeugt und bearbeitet werden, und es können Fotos be- und überarbeitet werden mit so ziemlich allen Funktionen die grafische Bildbearbeitungsprogramme auch haben, und und und. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Das Wichtigste: die Ursprungsbilder werden mit convert nicht überschrieben und bleiben erhalten wie sie sind, und es werden dabei immer neu Bilddateien erzeugt.'''&lt;br /&gt;
&lt;br /&gt;
Die Möglichkeiten und Kombinationsmöglichkeiten dieses Kommandos sind schier unüberschaubar. Leider ist die Verständlichkeit und Übersichtlichkeit der einzelnen Kommandos dann manchmal auch nicht mehr überschaubar.&amp;lt;br&amp;gt;&lt;br /&gt;
Wer sich damit näher damit befassen möchte dem sei [http://www.imagemagick.org/Usage/ die Beispielseite] von Anthony Thyssen empfohlen. &lt;br /&gt;
Für alle anderen [[ImageMagick nützliche Beispiele| eine kleine Seite mit nützlichen Beispielaufrufen]] und Kommentaren zu den Befehlen.&lt;br /&gt;
&lt;br /&gt;
=== mogrify ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/mogrify mogrify] ist in vielerlei Hinsicht gleich dem Kommando convert. Die Optionen sind auch analog denen von convert. Mogrify arbeitet jedoch immer ein Bild nach dem anderen ab, und nicht alle Funktionen von convert sind somit damit machbar. Der Hauptunterschied besteht jedoch darin, dass mogrify, wenn wir es ihm nicht explizid anweisen wird, die Ursprungsdatei überschreibt. Die Änderungen werden also unter dem Namen der Ursprungsdatei abgespeichert. Aus diesem Grunde sollte man mit mogrify sehr bedacht umgehen, und von den Dateien Kopien vor der Bearbeitung erstellt haben. Der Befehl eignet sich also immer dort, wo Dateien gleich an Ort und Stelle bearbeitet werden sollen, ohne dabei extra neue Dateien anzulegen.&lt;br /&gt;
&lt;br /&gt;
{{Box Achtung||&lt;br /&gt;
der Umgang mit dem Befehl mogify ist gefährlich, da in der Vielzahl der Fälle das Ergebnisbild unter den selben Namen wie das Ursprungsbild abgelegt wird. Man sollte unbedingt vorher Sicherheitskopien der Bilder anfertigen}}&lt;br /&gt;
Einige [[ImageMagick nützliche Beispiele |einfache Beispiele]] für die Benutzung dieses Programmes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== montage ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/montage  Montage] ist ein weiteres Kommando zur Bildbearbeitung, das unter anderem auch eine Vielzahl Optionen von convert verarbeiten kann. Es wurde jedoch speziell für die Erzeugung von Thumbnails von Bildern und deren Gruppierung und Gruppenansicht entwickelt. Darüber hinaus wird montage vor allem dort verwendet, wo mehrere Bilder aneinander gereiht und so zu einem einzigem Bild zusammengesetzt werden sollen. Für einige Spezialanwendungen wie zB. Textgenerierung aus verschiedenen Fonts und ähnlichem, ist es sehr gut geeignet. &lt;br /&gt;
&lt;br /&gt;
{{Box Hinweis||&lt;br /&gt;
die Optionen und Möglichkeiten dieses Befehles sind in den Hauptversionen 5 und 6 sehr unterschiedlich.}}&lt;br /&gt;
Einige [[ImageMagick nützliche Beispiele |einfache Beispiele]] für die Benutzung dieses Programmes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== composite ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/composite composite] ist ein sehr spezielles Kommando, dessen Funktionen sich auch aus den anderen Programmen von ImageMagick aufrufen lassen. Es ermöglicht die verschiedensten Methoden des  mischens und überlagerns von 2 und mehreren Bildern. Die Funktionen gehen zT. hier weit über das Maß hinaus, dass man von einem normalem Grafikbearbeitungsprogramm erwarten würde. Die Anwendung dieses Befehles oder seiner Funktionen setzt ein grundlegendes Wissen über Bildformate, Farbräume, Farben und Techniken voraus, und/oder kostest sehr viel Zeit beim ausprobieren und testen. Mit diesem Befehl beginnt wohl die Zauberei in der Grafikbearbeitung. &lt;br /&gt;
&lt;br /&gt;
An dieser Stelle kann hier für Möglichkeiten und weiterreichende Informationen nur auf [http://www.imagemagick.org/Usage/compose/ Beispielseiten] verwiesen werden, auch wenn hier und da in den [[ImageMagick nützliche Beispiele |Befehlsbeispielen hier im Wiki]] die eine oder andere Funktion dieses Befehles genutzt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== display ===&lt;br /&gt;
&lt;br /&gt;
Das Tool [http://www.imagemagick.org/script/display.php display] dient wie es der Name vermuten lässt zum Anzeigen von Bildern auf der X11 Oberfläche. Darüberhinaus ist aber display ein komplettes Bildbearbeitungsprogramm mit einer, wenn auch dürftigen, grafischen Oberfläche. Ein großer Teil der Einzeloperationen von convert lassen sich über eine Menüführung oder über Tasten interaktiv aufrufen. Eine umfangreiche ausführliche Erklärung über alle Funktionen von display erhaltet ihr in [http://man.cx/display dieser Manpage] ( ''die mit den Paketen oder aus dem Quelltext derzeitig installierbaren Manpages sind bei weitem nicht so umfangreich'' )&lt;br /&gt;
&lt;br /&gt;
Man kann also durchaus mit display seine Bilder erstellen, bearbeiten, drucken und speichern, ebenso kann man die einzelnen Optionen erst einmal mit grafischer Unterstützung ausprobieren, die man zB. in Scripten zusammenfassen möchte. display kann auch von der Standarteingabe lesen, wenn ihm bekannt ist, welches Format er hierüber erhält. Damit lassen sich die Ausgabebilder der einzelnen Tools von ImageMagick durch eine Pipe zu display schicken und sich das Ergebnis anschauen, eh man jedesmal bei jedem Versuch das Ergebnisbild erst auf die Festplatte schreibt, um es dann von dort mit display anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
 convert bild.jpg -resize 50% gif:-  | display gif:-&lt;br /&gt;
&lt;br /&gt;
hier wird in diesem Befehlsbeispiel convert mitgeteilt, Ausgabefile: '''gif:-''' was nicht anderes bedeutet wie Format &amp;quot;gif&amp;quot; an die Standartausgabe.&lt;br /&gt;
display bekommt die selbe Information und interpretiert dieses dann anzuzeigendes Bild: Standarteingabe in Format &amp;quot;gif&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== animate ===&lt;br /&gt;
&lt;br /&gt;
Beim selbstgestalten oder bearbeiten von animierten Bildern hat man das Problem, wo kann man seine Zwischenergebnisse oder die gesammte Animation jetzt anschauen? display liefert hier auch nur ungenügende Ergebnisse, andere Programme eventuell nur das erste Bild der Animation, und die dafür vorgesehenen Plugins und Programme zur Wiedergabe, haben keine Möglichkeit des manuellen Eingreifens in den Ablauf. Hierfür ist bei ImageMagick das Progamm [http://man.cx/animate animate] gedacht. Mit animate lassen sich sowohl fertige Animationen, sowie auch Einzelbilder als Animation auf einer X-Oberfläche anzeigen. &amp;lt;br&amp;gt;&lt;br /&gt;
Mit ein paar Tasten '''&amp;lt; &amp;gt; 'SPACE' ? 'F1''''  lässt sich auch die Geschwindigkeit ändern oder auf Einzelbildmodus umschalten, Bildinformationen ansehen oder Hilfe holen. Die Rechte Maustaste öffnet ein Service-Menü, damit kann man dieses und noch einiges mehr, dann auch noch übersichtlich mit der Maus steuern. Mit einer Reihe von Optionen beim Start lassen sich dann noch einige Feineinstellungen oder Effekte erreichen.&amp;lt;br&amp;gt; &lt;br /&gt;
Das einfache Abspielen einer animierten GIF ist recht simpel:&lt;br /&gt;
unter KDE oder Gnome aus einem Terminal heraus einfach&lt;br /&gt;
 animate datei.gif&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu [http://www.imagemagick.org/script/animate.php animate]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl [http://man.cx/import import] können vom X-Server  [[Screenshots]] erstellt werden. Es können der gesamte Desktop einzelne Fenster oder frei definierte Bereiche als Bild abgespeichert werden, siehe dazu auch die [[Screenshots#Screenshots mit ImageMagik|Kurzbeschreibung]]. Ein ganze Reihe von Optionen ermöglicht es dabei auch gleich bestimmte Bearbeitungsschritte, die man sonst später noch machen müsste, gleich mit zu erledigen, zB eine transparente Farbe, die richtige Größe und Auflösung, Farbtiefe und vieles mehr. Dabei kann das automatisch, verzögert, auf Mausklick ausgelöst, oder gleich mehrfach als Serienbild aufgenommen werden, um dann daraus zB. einen Film zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== identify ===&lt;br /&gt;
&lt;br /&gt;
Um mehr über ein Bild oder mehrere Bilder zu erfahren, dazu gibt es den Befehl [http://man.cx/identify identify]. mit diesem Befehl lassen sich Format und Eigenschaften eines Bildes anzeigen. Defekte oder unvollständige Bilder werden hier ebenso als solche erkannt. &amp;lt;br&amp;gt;&lt;br /&gt;
 identify BILDERNAME&lt;br /&gt;
gibt uns im wesentlichen einen kurzen Überlick über Bildtyp, Bild- und Datengröße, Farbe&lt;br /&gt;
 identify -verbose BILDERNAME&lt;br /&gt;
gibt uns die kompletten detailierten Daten die in diesem Bild gespeichert sind, einschließlich eventueller [http://de.wikipedia.org/wiki/EXIF EXIF]&amp;lt;br&amp;gt;&lt;br /&gt;
Durch eine Reihe von zusätzlichen Parametern lassen sich auch gezielt wichtige Paramerter direkt abrufen, ohne sie erst noch aus dieser Liste ausfiltern zu müssen.  Die wichtigsten Informationen kann man alle mit der Option [http://www.imagemagick.org/script/command-line-options.php#format -format] gezielt auslesen zB. um  nur die Größe eines Bildes zu ermitteln&lt;br /&gt;
 # identify -format &amp;quot;%wx%h&amp;quot; img_0002.jpg&lt;br /&gt;
 2560x1920&lt;br /&gt;
&lt;br /&gt;
und um die Druckgröße eines Bildes bei 96dpi ( 96 Pixel je [http://de.wikipedia.org/wiki/Inch Zoll] )zu errechnen&lt;br /&gt;
 # identify -format &amp;quot;%[fx:w/96*2.54] cm  X %[fx:h/96*2.54] cm&amp;quot; img_0002.jpg&lt;br /&gt;
 67.7333 cm  X 50.8 cm&lt;br /&gt;
&lt;br /&gt;
Für weiter Informationen zu allen Optionen kann diese [http://www.imagemagick.org/script/identify.php Startseite] genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== conjure ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/conjure(1) conjure] ist ein spezielles Tool von ImageMagick, mit dessen Hilfe Bildbearbeitung mittels Script möglich ist. Script bedeutet hier allerdings nicht Shellscript sondern eine auf XML basierende spezielle Script Sprache MSL ( '''M'''agick '''S'''cripting '''L'''anguage ). Eine kurze Beschreibung gibt es [http://www.imagemagick.org/script/conjure.php hier] nähere Informationen zu MSL sind auch im Internet auf die Schnelle nicht  zu finden, wer sich damit befassen möchte kann dieses [http://www.linux-nantes.org/~fmonnier/ImageMagick/improved-msl.php HOWTO] anschauen, inwieweit es kompatibel ist, ist nicht bekannt. Ansonsten sollen in der Datei '''coders/msl.c''' lt. ImageMagick nähere Informationen zu MSL sein.'' Aus der Dürftigkeit der Informationen muss man schließen, dass conjure weniger gebräuchlich ist.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== compare ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/%20compare compare] ist ein Programm mit denen 2 Bilder mathematisch vergleichen werden können. Das macht nur Sinn zwischen gleichen Bildern, also Orginalbild und Bild nach Bearbeitung. Damit läßt sich zB. feststellen, wo bestimmte Filter oder Funktionen auf das Bild eingewirkt haben, wenn die rein optischen Veränderungen nur sehr gering sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mit diesem kleinem Beispiel &lt;br /&gt;
läßt sich nachweisen, dass bei jeder Bearbeitung von JPEG die Qualität ein klein wenig schlechter wird, weil ein komplettes decode und re-encode des Formates durchgeführt wird.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 convert logo: -quality 100 test.jpg&lt;br /&gt;
 cp test.jpg test1.jpg&lt;br /&gt;
 mogrify -set comment 'Das ist eine Testdatei' test1.jpg&lt;br /&gt;
 compare test1.jpg test.jpg png:- | display png:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung: &lt;br /&gt;
* aus dem integrierten ImageMagick-Logo erstellen wir ein JPEG mit niedrigst möglicher Kompression&lt;br /&gt;
* wir kopieren diese Datei über das Betriebssystem (''damit sind beide absolut identisch'')&lt;br /&gt;
* in der Bildkopie schreiben wir nur einen Kommentar in die Bild-Eigenschaften&lt;br /&gt;
* danach überprüfen wir die beiden Bilder auf Unterschiede und lassen sie uns mit display anzeigen. &lt;br /&gt;
( ''Differenzen zwischen den Bildern sind als rote Punkte gekennzeichnet, zum Vergleich könnt ihr das gleiche noch einmal aber mit '''-quality 50''' testen'' )&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele für compare in der [http://www.imagemagick.org/script/compare.php Befehlsbeschreibung]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== xtp ===&lt;br /&gt;
&lt;br /&gt;
Mit ImageMagick installiert man sich gleichzeitig noch das Tool ''xtp''. Es handelt sich hier um ein Tool für Filetransfer mit ähnlichen Funktionen wie [http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/1/ftp-man-page.html ftp], &lt;br /&gt;
es kommt ohne Interaktivität mit dem User aus. Es ist vieleicht am ehesten vergleichbar mit [http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/1/wget-man-page.html wget].&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt ist es zwar schön zu wissen, das man dieses Programm auf dem Rechner hat, doch wozu und warum wurde es mit ImageMagick installiert?&lt;br /&gt;
Die Funktionen dieses Programmes können die Tools von ImageMagick bei Bedarf automatisch aufrufen. Das bringt den Vorteil, wir können mit ImageMagick direkt auf die Bilder im Internet zugreifen. Es entfällt das manuelle lästige Downloaden und zwischenspeichern von Bilddateien.&lt;br /&gt;
Einfach im Browser die Bildadresse kopieren und in die Befehlszeile einsetzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiele:'''&lt;br /&gt;
* Bild aus dem Internet direkt mit convert bearbeiten und das Ergebnis ansehen&lt;br /&gt;
&amp;lt;pre&amp;gt;convert http://www.linux-club.de/images/konqui.gif -mattecolor tomato -frame 9x20+4+0 png:- | display png:-&amp;lt;/pre&amp;gt;&lt;br /&gt;
* man möchte wissen welche EXIF-Informationen man mit seinen Bildern im Internet veröffentlicht&lt;br /&gt;
&amp;lt;pre&amp;gt;identify -format &amp;quot;%[EXIF:*]&amp;quot; http://www.linux-club.de/wiki/images/Musterbild.jpg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.imagemagick.org/Usage/ Beispiele für die Benutzung von ImageMagick] {{englisch}}&lt;br /&gt;
* [http://www-128.ibm.com/developerworks/library/l-graf/?ca=dnt-428 Graphics from the Command Line] {{englisch}}&lt;br /&gt;
* [http://www-128.ibm.com/developerworks/library/l-graf2/?ca=dgr-lnxw15GraphicsLine More graphics from the command line] {{englisch}}&lt;br /&gt;
* Kleiner Tipp am Rande für alle die nicht immer online sein wollen, wenn ihr ImageMagick installiert habt, dann habt ihr einige der Hilfe- und Dokuseiten als HTML mit installiert (normalerweise unterhalb von '''/usr/share/doc/packages/ImageMagick/''' )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Grafik]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=ImageMagick&amp;diff=30870</id>
		<title>ImageMagick</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=ImageMagick&amp;diff=30870"/>
		<updated>2014-01-07T12:49:00Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* xtp */ nur üble Werbung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Software|&lt;br /&gt;
 Name= '''ImageMagick'''&amp;lt;br /&amp;gt;[[Bild:imagemagick-logo.jpg]]&lt;br /&gt;
|Hersteller= ImageMagick Studio LLC&lt;br /&gt;
|AktuelleVersion= 6.3.3-9&lt;br /&gt;
|AktuelleVersionFreigabeDatum= 20.04.2007&lt;br /&gt;
|Betriebssystem= Linux, Windows, Solaris, MacOS, FreeBSD&lt;br /&gt;
|Kategorie= [[Grafik]]&lt;br /&gt;
|Lizenz= [http://de.wikipedia.org/wiki/GPL GLP] [http://www.imagemagick.org/script/license.php kompatibel]&lt;br /&gt;
|Deutsch= Nein&lt;br /&gt;
|Website= http://www.imagemagick.org&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Was ist was kann ImageMagick ==&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/ImageMagick ImageMagick][http://tarr.uspto.gov/servlet/tarr?regser=serial&amp;amp;entry=78333969 ®] ist eine Softwarepaket, zum Erstellung und Bearbeitung von [http://de.wikipedia.org/wiki/Rastergrafik Rastergrafiken]. Es kann Bilder in eine Vielzahl gebräuchlicher Formate (derzeit ungefähr 100) einschließlich DPX, GIF, JPEG, JPEG-2000, pdf, PhotoCD, png, Postskriptum, SVG und tiff lesen, umwandeln und schreiben. Mit ImageMagick können zum Beispiel Bilder kombiniert, in andere Formate umgewandelt, gedreht, gespiegelt, zugeschnitten oder in der Größe verändert werden. Es lassen sich aber auch umfangreiche Manipulationen an den Bildfarben und verschiedene spezielle Effekte und Filter anwenden, oder Text, Linien, Polygone, Ellipsen und Bézier Kurven mit ImageMagick zeichnen. Die Funktionalität von ImageMagick wird gewöhnlich von der Kommandozeile oder aus Scripten heraus verwendet. Darüber hinaus bietet ImageMagick aber auch die Möglichkeit und Schnittstellen, um die Funktionen aus anderen Programmen und Programmiersprachen heraus, aufzurufen. &lt;br /&gt;
Es lassen sich Bilder auch dynamisch erzeugen oder ändern, was es unter anderem für Webanwendungen sehr interessant macht. Einen kleinen Überblick über  Möglichkeiten der Bildbearbeitung mit ImageMagick kann man sich auf [http://www.imagemagick.org/script/examples.php der Beispielseite] ansehen. &lt;br /&gt;
 &lt;br /&gt;
ImageMagick ist eine freie Software, die sowohl als fertige Programmpakete für eine ganze Reihe Betriebssysteme, sowie auch als Quellenprogrammpaket zur Verfügung steht, und die frei verwendet, kopiert, geändert und verteilt werden kann. [http://www.imagemagick.org/script/license.php Seine Lizenz] ist mit [http://www.fsf.org/licensing/licenses/ GPL] kompatibel. ImageMagick läuft auf alle Hauptbetriebssysteme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hier sind einige Beispiele aufgeführt, was man mit ImageMagick tun kann:&lt;br /&gt;
* '''Formatumwandlung''': ein Bild von einem Format in andere umwandeln (z.B. png zu JPEG)&lt;br /&gt;
* '''Transformation''': die Größe neu bestimmen, drehen, beschneiden, flippen oder trimmen &lt;br /&gt;
* '''Bildtransparents''': Teile eines Bildes unsichtbar machen &lt;br /&gt;
* '''Zeichnen''': Formen oder Text einem Bild hinzufügen &lt;br /&gt;
* '''Dekorieren''': einen Rand oder einen Rahmen einem Bild hinzufügen &lt;br /&gt;
* '''Spezielle Effekte''': Unschärfe, schärfen, Schwellewerte anwenden oder abtönen eines Bildes &lt;br /&gt;
* '''Mathematische Berechnungen''': einen mathematischen Ausdruck auf ein Bild oder einzelne Bildkanäle anwenden &lt;br /&gt;
* '''Text u. Anmerkungen''': Schrift oder künstlerische Textverzierungen auf einem Bild einsetzen &lt;br /&gt;
* '''Identifikation''': das Format und die Attribute eines Bildes beschreiben oder auslesen &lt;br /&gt;
* '''Animation''': eine GIF Animation von einer Gruppe Bildern erstellen &lt;br /&gt;
* '''Bildmontage''': Uberdeckung von Bildern oder mischen der einzelnen Bildkanäle  &lt;br /&gt;
* '''Kombinationen''': ein Set von Vorschaubilder als Bild erstellen &lt;br /&gt;
* '''Unterstützung für große Bilder''': Mega- und Gigapixel Bildgrößen lesen, verarbeiten oder schreiben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Wohl alle größeren Linux-Distributionen bringen fertige Installationspakete von ImageMagick mit. Eventuell muss das Paket von der Installations-DVD nachinstalliert werden. Die Installation über einen Paketmanager sollte kein Problem darstellen. Einer manuellen Installation mittels rpm-Kommando wird wegen vieler Abhängigkeiten abgeraten.&amp;lt;br&amp;gt;&lt;br /&gt;
Paketname ist  unter SuSE '''ImageMagick''' ( ''eines der wenigen Pakete mit Großbuchstaben im Namen'' )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bemerkungen zu den Versionen ===&lt;br /&gt;
&lt;br /&gt;
An ImageMagick wird zurzeit sehr viel und erfolgreich gearbeitet, das umfasst sowohl neue Funktionen und Methoden wie auch die Beseitigung von Bugs.&lt;br /&gt;
Es ist also nicht verwunderlich, wenn fast wöchentlich eine neue Sub-Version auf den Download-Servern zu finden ist. ([http://www.imagemagick.org/script/changelog.php Changelog])&lt;br /&gt;
Das hat aber nicht nur Vorteile. Nicht alles was man unter [http://www.imagemagick.org/Usage/ Beispiele] findet, wird man auf seinem Rechner zum Laufen bekommen, da dort oftmals in den Beispielen die neusten Methoden vorgestellt und dokumentiert werden. Und hat man mit Hilfe der oben genannten Beispiele endlich sein Script so, dass es genau das macht, was man will, läuft das Script aber nicht zwangläufig auf dem nächsten Rechner auch, wenn dort noch eine ältere Version darauf ist. Einen sehr großen Sprung hat es zwischen der Hauptversion 5 und 6 gegeben. ''(Die Version 5 wurde z.B. noch unter Suse 9.1 ausgeliefert)'' Hier kann man davon ausgehen, dass einige Befehle und Optionen und somit ganze Scripte zwischen beiden Hauptversionen überhaupt nicht kompatibel ist. Eine Erklärung warum das notwendig war, kann man nachlesen unter [http://www.imagemagick.org/Usage/basics/#why why]. Man sollte sich also überlegen, mit welcher Version man komplizierte Scripte und Konzepte mit ImageMagick entwickeln will, die dann auch auf anderen (eventuell unter älteren Versionen) Rechnern laufen sollen. Im Zweifelsfall sollte man daran denken, bei der Weitergabe komplizierter Scripte einen Verweis auf die eigene verwendete Version von ImageMagick zu hinterlegen. Als Anhaltspunkte hier die ausgelieferten Versionen von [[openSUSE]]. ''(Es werden bei den default-Onlineaktualisierungen von [[openSUSE]] auch keine neuen Versionen installiert sondern lediglich Erneuerungen bei Sicherheitsproblemen oder schwerwiegenden Fehlern durchgeführt.)''&lt;br /&gt;
&lt;br /&gt;
Unter Suse sind folgende Versionen von ImageMagick ausgeliefert worden:&lt;br /&gt;
*  SuSE 10.0: 6.2.3&lt;br /&gt;
*  SuSE 10.1: 6.2.5&lt;br /&gt;
*  [[openSUSE]] 10.2: 6.3.0&lt;br /&gt;
*  aktuell: Version (22.04.2007) 6.3.3&lt;br /&gt;
&lt;br /&gt;
=== ImageMagick selbst kompilieren ===&lt;br /&gt;
&lt;br /&gt;
ImageMagick selbst zu kompilieren geht nach dem berühmten 3-Satz wie [[Software aus dem Quelltext Installieren/Deinstallieren|hier]] beschrieben.&lt;br /&gt;
das ''configure-Script'' ohne besondere Optionen wird sich auf dem Rechner nach jeder Menge Library und Header-Dateien umschauen, und dementsprechend ImageMagick konfigurieren. &lt;br /&gt;
Sobald configure fehlerfrei beendet wurde, sollte man sich dessen Ausgabe, insbesondere folgenden Abschnitt, etwas genauer anschauen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ImageMagick is configured as follows. Please verify that this configuration&lt;br /&gt;
matches your expectations.&lt;br /&gt;
&lt;br /&gt;
Host system type : i686-pc-linux-gnu&lt;br /&gt;
&lt;br /&gt;
                  Option                        Value&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
Shared libraries  --enable-shared=yes           yes&lt;br /&gt;
Static libraries  --enable-static=yes           yes&lt;br /&gt;
Module support    --with-modules=yes            yes&lt;br /&gt;
GNU ld            --with-gnu-ld=yes             yes&lt;br /&gt;
Quantum depth     --with-quantum-depth=16       16&lt;br /&gt;
&lt;br /&gt;
Delegate Configuration:&lt;br /&gt;
BZLIB             --with-bzlib=yes              yes&lt;br /&gt;
DJVU              --with-djvu=yes               yes&lt;br /&gt;
DPS               --with-dps=yes                no&lt;br /&gt;
FlashPIX          --with-fpx=no                 no&lt;br /&gt;
FontConfig        --with-fontconfig=yes         yes&lt;br /&gt;
FreeType          --with-freetype=yes           yes&lt;br /&gt;
GhostPCL          None                          pcl6 (unknown)&lt;br /&gt;
Ghostscript       None                          gs (8.15.3)&lt;br /&gt;
Ghostscript fonts --with-gs-font-dir=default    /usr/share/ghostscript/fonts/&lt;br /&gt;
Ghostscript lib   --with-gslib=yes              no (failed tests)&lt;br /&gt;
Graphviz          --with-gvc=yes                no&lt;br /&gt;
JBIG              --with-jbig=yes               no&lt;br /&gt;
JPEG v1           --with-jpeg=yes               yes&lt;br /&gt;
JPEG-2000         --with-jp2=yes                yes&lt;br /&gt;
LCMS              --with-lcms=yes               no&lt;br /&gt;
Magick++          --with-magick-plus-plus=yes   yes&lt;br /&gt;
PERL              --with-perl=yes               /usr/bin/perl&lt;br /&gt;
PNG               --with-png=yes                yes&lt;br /&gt;
RSVG              --with-rsvg=yes               yes&lt;br /&gt;
TIFF              --with-tiff=yes               yes&lt;br /&gt;
Windows fonts     --with-windows-font-dir=      none&lt;br /&gt;
WMF               --with-wmf=yes                        yes&lt;br /&gt;
X11               --with-x=                     yes&lt;br /&gt;
XML               --with-xml=yes                yes&lt;br /&gt;
ZLIB              --with-zlib=yes               yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
hier hat das Script entsprechend der Tools und Dateien, die es auf dem Rechner gefunden hat, die Konfiguration der optional-Features und optionalen Pakete zusammengefasst. Ist hier bei einer gewünschen Option ein '''no''' oder '''none''' eingetragen, sollten man mit dem Paketmanager die entsprechenden Devel-Pakete oder gar die entsprechenden Libray- oder Programmpakete nachinstallieren und ''configure'' noch einmal laufen lassen.&lt;br /&gt;
&lt;br /&gt;
== Schnittstellen zu anderen Programmen oder Programmiersprachen ==&lt;br /&gt;
&lt;br /&gt;
Zur Zeit sind folgende [http://www.imagemagick.org/script/api.php Interface für ImageMagick] bekannt.&lt;br /&gt;
&lt;br /&gt;
* [https://gna.org/projects/g2f/ G2F] ('''Ada''')&lt;br /&gt;
* [http://www.imagemagick.org/script/magick-core.php MagickCore] ('''C''')&lt;br /&gt;
* [http://www.imagemagick.org/script/magick-wand.php MagickWand] ('''C''')&lt;br /&gt;
* [http://www.imagemagick.org/ChMagick/ ChMagick] ('''Ch''')&lt;br /&gt;
* [http://www.imagemagick.org/script/ImageMagickObject.php ImageMagickObject] ('''COM+''')&lt;br /&gt;
* [http://www.imagemagick.org/Magick++/ Magick++] ('''C++''')&lt;br /&gt;
* [http://www.yeo.id.au/jmagick/ JMagick] ('''Java''')&lt;br /&gt;
* [http://common-lisp.net/project/cl-magick/ CL-Magick] ('''Lisp''')&lt;br /&gt;
* [http://code.google.com/p/nmagick/ nMagick] ('''Neko/haXe''')&lt;br /&gt;
* [http://midimick.com/magicknet/ MagickNet] ('''.NET''')&lt;br /&gt;
* [http://wiki.lazarus.freepascal.org/PascalMagick PascalMagick] ('''Pascal''')&lt;br /&gt;
* [http://www.imagemagick.org/script/perl-magick.php PerlMagick] ('''Perl''')&lt;br /&gt;
* [http://www.magickwand.org/ MagickWand for PHP] ('''PHP''')&lt;br /&gt;
* [http://www.imagemagick.org/download/python/ PythonMagick] ('''Python''')&lt;br /&gt;
* [http://rmagick.rubyforge.org/ RMagick] ('''Ruby''') &lt;br /&gt;
* [http://tclmagick.sourceforge.net/ TclMagick] ('''Tcl/TK''')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Befehle von ImageMagick ==&lt;br /&gt;
&lt;br /&gt;
=== convert ===&lt;br /&gt;
&lt;br /&gt;
'''convert''' ist das wohl wichtigste Kommando innerhalb ImageMagick. Die meisten Operationen können mit diesem Kommando gemacht werden.&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/convert Convert] kennt eine Unmenge an Operatoren, Settings und Kombinationen die auf ein oder mehrere Eingangsbilder sowohl einzeln oder in Kombinationen Anwendung finden können, um dann daraus ein oder mehrere Ausgangsbilder zu erstellen. Und damit noch lange nicht genug kann convert auch mit einer Befehlszeile ganze Sequenzen von Bilder verarbeiten, oder intern in fast beliebiger Schachtelungstiefe Zwischenbilder in eine Stack speichern, um sie von dort aus in eine der nächsten Teilschritte weiterzuverarbeiten. Eine Einführung in die Kommandostruktur und deren Möglichkeiten kann [http://www.imagemagick.org/script/command-line-processing.php hier] nachgelesen werden. &lt;br /&gt;
&lt;br /&gt;
Mit convert können unter anderem Kopien von Bilddateien in andere Bildformate oder Farbtiefen hergestellt werden, es können die Größe der Bilder verändert, Bilder gedrehen, gespiegeln oder verzerren werden, Bildteile herausgeschnitten, oder weggeblendet werden, Rahmen und Hintergrund  der Bilder kann gestaltet werden, es können Bilder beschriftet oder es kann mit den Zeichnenwerkzeugen oder nur durch pure Mathematik Zwischenbilder oder Bildmasken für die weitere Bildverarbeitung neu erstellt werden. Es konnen mehrere Bilder zu einen Bild montiert und dabei die Farbkanäle der einzelnen Bilder auf die unterschiedlichste Art beeinflußt werden. Es können animierte Bilder erzeugt und bearbeitet werden, und es können Fotos be- und überarbeitet werden mit so ziemlich allen Funktionen die grafische Bildbearbeitungsprogramme auch haben, und und und. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Das Wichtigste: die Ursprungsbilder werden mit convert nicht überschrieben und bleiben erhalten wie sie sind, und es werden dabei immer neu Bilddateien erzeugt.'''&lt;br /&gt;
&lt;br /&gt;
Die Möglichkeiten und Kombinationsmöglichkeiten dieses Kommandos sind schier unüberschaubar. Leider ist die Verständlichkeit und Übersichtlichkeit der einzelnen Kommandos dann manchmal auch nicht mehr überschaubar.&amp;lt;br&amp;gt;&lt;br /&gt;
Wer sich damit näher damit befassen möchte dem sei [http://www.imagemagick.org/Usage/ die Beispielseite] von Anthony Thyssen empfohlen. &lt;br /&gt;
Für alle anderen [[ImageMagick nützliche Beispiele| eine kleine Seite mit nützlichen Beispielaufrufen]] und Kommentaren zu den Befehlen.&lt;br /&gt;
&lt;br /&gt;
=== mogrify ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/mogrify mogrify] ist in vielerlei Hinsicht gleich dem Kommando convert. Die Optionen sind auch analog denen von convert. Mogrify arbeitet jedoch immer ein Bild nach dem anderen ab, und nicht alle Funktionen von convert sind somit damit machbar. Der Hauptunterschied besteht jedoch darin, dass mogrify, wenn wir es ihm nicht explizid anweisen wird, die Ursprungsdatei überschreibt. Die Änderungen werden also unter dem Namen der Ursprungsdatei abgespeichert. Aus diesem Grunde sollte man mit mogrify sehr bedacht umgehen, und von den Dateien Kopien vor der Bearbeitung erstellt haben. Der Befehl eignet sich also immer dort, wo Dateien gleich an Ort und Stelle bearbeitet werden sollen, ohne dabei extra neue Dateien anzulegen.&lt;br /&gt;
&lt;br /&gt;
{{Box Achtung||&lt;br /&gt;
der Umgang mit dem Befehl mogify ist gefährlich, da in der Vielzahl der Fälle das Ergebnisbild unter den selben Namen wie das Ursprungsbild abgelegt wird. Man sollte unbedingt vorher Sicherheitskopien der Bilder anfertigen}}&lt;br /&gt;
Einige [[ImageMagick nützliche Beispiele |einfache Beispiele]] für die Benutzung dieses Programmes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== montage ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/montage  Montage] ist ein weiteres Kommando zur Bildbearbeitung, das unter anderem auch eine Vielzahl Optionen von convert verarbeiten kann. Es wurde jedoch speziell für die Erzeugung von Thumbnails von Bildern und deren Gruppierung und Gruppenansicht entwickelt. Darüber hinaus wird montage vor allem dort verwendet, wo mehrere Bilder aneinander gereiht und so zu einem einzigem Bild zusammengesetzt werden sollen. Für einige Spezialanwendungen wie zB. Textgenerierung aus verschiedenen Fonts und ähnlichem, ist es sehr gut geeignet. &lt;br /&gt;
&lt;br /&gt;
{{Box Hinweis||&lt;br /&gt;
die Optionen und Möglichkeiten dieses Befehles sind in den Hauptversionen 5 und 6 sehr unterschiedlich.}}&lt;br /&gt;
Einige [[ImageMagick nützliche Beispiele |einfache Beispiele]] für die Benutzung dieses Programmes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== composite ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/composite composite] ist ein sehr spezielles Kommando, dessen Funktionen sich auch aus den anderen Programmen von ImageMagick aufrufen lassen. Es ermöglicht die verschiedensten Methoden des  mischens und überlagerns von 2 und mehreren Bildern. Die Funktionen gehen zT. hier weit über das Maß hinaus, dass man von einem normalem Grafikbearbeitungsprogramm erwarten würde. Die Anwendung dieses Befehles oder seiner Funktionen setzt ein grundlegendes Wissen über Bildformate, Farbräume, Farben und Techniken voraus, und/oder kostest sehr viel Zeit beim ausprobieren und testen. Mit diesem Befehl beginnt wohl die Zauberei in der Grafikbearbeitung. &lt;br /&gt;
&lt;br /&gt;
An dieser Stelle kann hier für Möglichkeiten und weiterreichende Informationen nur auf [http://www.imagemagick.org/Usage/compose/ Beispielseiten] verwiesen werden, auch wenn hier und da in den [[ImageMagick nützliche Beispiele |Befehlsbeispielen hier im Wiki]] die eine oder andere Funktion dieses Befehles genutzt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== display ===&lt;br /&gt;
&lt;br /&gt;
Das Tool [http://www.imagemagick.org/script/display.php display] dient wie es der Name vermuten lässt zum Anzeigen von Bildern auf der X11 Oberfläche. Darüberhinaus ist aber display ein komplettes Bildbearbeitungsprogramm mit einer, wenn auch dürftigen, grafischen Oberfläche. Ein großer Teil der Einzeloperationen von convert lassen sich über eine Menüführung oder über Tasten interaktiv aufrufen. Eine umfangreiche ausführliche Erklärung über alle Funktionen von display erhaltet ihr in [http://man.cx/display dieser Manpage] ( ''die mit den Paketen oder aus dem Quelltext derzeitig installierbaren Manpages sind bei weitem nicht so umfangreich'' )&lt;br /&gt;
&lt;br /&gt;
Man kann also durchaus mit display seine Bilder erstellen, bearbeiten, drucken und speichern, ebenso kann man die einzelnen Optionen erst einmal mit grafischer Unterstützung ausprobieren, die man zB. in Scripten zusammenfassen möchte. display kann auch von der Standarteingabe lesen, wenn ihm bekannt ist, welches Format er hierüber erhält. Damit lassen sich die Ausgabebilder der einzelnen Tools von ImageMagick durch eine Pipe zu display schicken und sich das Ergebnis anschauen, eh man jedesmal bei jedem Versuch das Ergebnisbild erst auf die Festplatte schreibt, um es dann von dort mit display anzeigen zu lassen.&lt;br /&gt;
&lt;br /&gt;
 convert bild.jpg -resize 50% gif:-  | display gif:-&lt;br /&gt;
&lt;br /&gt;
hier wird in diesem Befehlsbeispiel convert mitgeteilt, Ausgabefile: '''gif:-''' was nicht anderes bedeutet wie Format &amp;quot;gif&amp;quot; an die Standartausgabe.&lt;br /&gt;
display bekommt die selbe Information und interpretiert dieses dann anzuzeigendes Bild: Standarteingabe in Format &amp;quot;gif&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== animate ===&lt;br /&gt;
&lt;br /&gt;
Beim selbstgestalten oder bearbeiten von animierten Bildern hat man das Problem, wo kann man seine Zwischenergebnisse oder die gesammte Animation jetzt anschauen? display liefert hier auch nur ungenügende Ergebnisse, andere Programme eventuell nur das erste Bild der Animation, und die dafür vorgesehenen Plugins und Programme zur Wiedergabe, haben keine Möglichkeit des manuellen Eingreifens in den Ablauf. Hierfür ist bei ImageMagick das Progamm [http://man.cx/animate animate] gedacht. Mit animate lassen sich sowohl fertige Animationen, sowie auch Einzelbilder als Animation auf einer X-Oberfläche anzeigen. &amp;lt;br&amp;gt;&lt;br /&gt;
Mit ein paar Tasten '''&amp;lt; &amp;gt; 'SPACE' ? 'F1''''  lässt sich auch die Geschwindigkeit ändern oder auf Einzelbildmodus umschalten, Bildinformationen ansehen oder Hilfe holen. Die Rechte Maustaste öffnet ein Service-Menü, damit kann man dieses und noch einiges mehr, dann auch noch übersichtlich mit der Maus steuern. Mit einer Reihe von Optionen beim Start lassen sich dann noch einige Feineinstellungen oder Effekte erreichen.&amp;lt;br&amp;gt; &lt;br /&gt;
Das einfache Abspielen einer animierten GIF ist recht simpel:&lt;br /&gt;
unter KDE oder Gnome aus einem Terminal heraus einfach&lt;br /&gt;
 animate datei.gif&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen zu [http://www.imagemagick.org/script/animate.php animate]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== import ===&lt;br /&gt;
&lt;br /&gt;
Mit dem Befehl [http://man.cx/import import] können vom X-Server  [[Screenshots]] erstellt werden. Es können der gesamte Desktop einzelne Fenster oder frei definierte Bereiche als Bild abgespeichert werden, siehe dazu auch die [[Screenshots#Screenshots mit ImageMagik|Kurzbeschreibung]]. Ein ganze Reihe von Optionen ermöglicht es dabei auch gleich bestimmte Bearbeitungsschritte, die man sonst später noch machen müsste, gleich mit zu erledigen, zB eine transparente Farbe, die richtige Größe und Auflösung, Farbtiefe und vieles mehr. Dabei kann das automatisch, verzögert, auf Mausklick ausgelöst, oder gleich mehrfach als Serienbild aufgenommen werden, um dann daraus zB. einen Film zu machen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== identify ===&lt;br /&gt;
&lt;br /&gt;
Um mehr über ein Bild oder mehrere Bilder zu erfahren, dazu gibt es den Befehl [http://man.cx/identify identify]. mit diesem Befehl lassen sich Format und Eigenschaften eines Bildes anzeigen. Defekte oder unvollständige Bilder werden hier ebenso als solche erkannt. &amp;lt;br&amp;gt;&lt;br /&gt;
 identify BILDERNAME&lt;br /&gt;
gibt uns im wesentlichen einen kurzen Überlick über Bildtyp, Bild- und Datengröße, Farbe&lt;br /&gt;
 identify -verbose BILDERNAME&lt;br /&gt;
gibt uns die kompletten detailierten Daten die in diesem Bild gespeichert sind, einschließlich eventueller [http://de.wikipedia.org/wiki/EXIF EXIF]&amp;lt;br&amp;gt;&lt;br /&gt;
Durch eine Reihe von zusätzlichen Parametern lassen sich auch gezielt wichtige Paramerter direkt abrufen, ohne sie erst noch aus dieser Liste ausfiltern zu müssen.  Die wichtigsten Informationen kann man alle mit der Option [http://www.imagemagick.org/script/command-line-options.php#format -format] gezielt auslesen zB. um  nur die Größe eines Bildes zu ermitteln&lt;br /&gt;
 # identify -format &amp;quot;%wx%h&amp;quot; img_0002.jpg&lt;br /&gt;
 2560x1920&lt;br /&gt;
&lt;br /&gt;
und um die Druckgröße eines Bildes bei 96dpi ( 96 Pixel je [http://de.wikipedia.org/wiki/Inch Zoll] )zu errechnen&lt;br /&gt;
 # identify -format &amp;quot;%[fx:w/96*2.54] cm  X %[fx:h/96*2.54] cm&amp;quot; img_0002.jpg&lt;br /&gt;
 67.7333 cm  X 50.8 cm&lt;br /&gt;
&lt;br /&gt;
Für weiter Informationen zu allen Optionen kann diese [http://www.imagemagick.org/script/identify.php Startseite] genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== conjure ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/conjure(1) conjure] ist ein spezielles Tool von ImageMagick, mit dessen Hilfe Bildbearbeitung mittels Script möglich ist. Script bedeutet hier allerdings nicht Shellscript sondern eine auf XML basierende spezielle Script Sprache MSL ( '''M'''agick '''S'''cripting '''L'''anguage ). Eine kurze Beschreibung gibt es [http://www.imagemagick.org/script/conjure.php hier] nähere Informationen zu MSL sind auch im Internet auf die Schnelle nicht  zu finden, wer sich damit befassen möchte kann dieses [http://www.linux-nantes.org/~fmonnier/ImageMagick/improved-msl.php HOWTO] anschauen, inwieweit es kompatibel ist, ist nicht bekannt. Ansonsten sollen in der Datei '''coders/msl.c''' lt. ImageMagick nähere Informationen zu MSL sein.'' Aus der Dürftigkeit der Informationen muss man schließen, dass conjure weniger gebräuchlich ist.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== compare ===&lt;br /&gt;
&lt;br /&gt;
[http://man.cx/%20compare compare] ist ein Programm mit denen 2 Bilder mathematisch vergleichen werden können. Das macht nur Sinn zwischen gleichen Bildern, also Orginalbild und Bild nach Bearbeitung. Damit läßt sich zB. feststellen, wo bestimmte Filter oder Funktionen auf das Bild eingewirkt haben, wenn die rein optischen Veränderungen nur sehr gering sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mit diesem kleinem Beispiel &lt;br /&gt;
läßt sich nachweisen, dass bei jeder Bearbeitung von JPEG die Qualität ein klein wenig schlechter wird, weil ein komplettes decode und re-encode des Formates durchgeführt wird.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 convert logo: -quality 100 test.jpg&lt;br /&gt;
 cp test.jpg test1.jpg&lt;br /&gt;
 mogrify -set comment 'Das ist eine Testdatei' test1.jpg&lt;br /&gt;
 compare test1.jpg test.jpg png:- | display png:-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Erklärung: &lt;br /&gt;
* aus dem integrierten ImageMagick-Logo erstellen wir ein JPEG mit niedrigst möglicher Kompression&lt;br /&gt;
* wir kopieren diese Datei über das Betriebssystem (''damit sind beide absolut identisch'')&lt;br /&gt;
* in der Bildkopie schreiben wir nur einen Kommentar in die Bild-Eigenschaften&lt;br /&gt;
* danach überprüfen wir die beiden Bilder auf Unterschiede und lassen sie uns mit display anzeigen. &lt;br /&gt;
( ''Differenzen zwischen den Bildern sind als rote Punkte gekennzeichnet, zum Vergleich könnt ihr das gleiche noch einmal aber mit '''-quality 50''' testen'' )&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele für compare in der [http://www.imagemagick.org/script/compare.php Befehlsbeschreibung]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== xtp ===&lt;br /&gt;
&lt;br /&gt;
Mit ImageMagick installiert man sich gleichzeitig noch das Tool ''xtp''. Es handelt sich hier um ein Tool für Filetransfer mit ähnlichen Funktionen wie [http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/1/ftp-man-page.html ftp], &lt;br /&gt;
es kommt ohne Interaktivität mit dem User aus. Es ist vieleicht am ehesten vergleichbar mit [http://manpages.unixforum.co.uk/man-pages/linux/suse-linux-10.1/1/wget-man-page.html wget].&amp;lt;br&amp;gt;&lt;br /&gt;
Jetzt ist es zwar schön zu wissen, das man dieses Programm auf dem Rechner hat, doch wozu und warum wurde es mit ImageMagick installiert?&lt;br /&gt;
Die Funktionen dieses Programmes können die Tools von ImageMagick bei Bedarf automatisch aufrufen. Das bringt den Vorteil, wir können mit ImageMagick direkt auf die Bilder im Internet zugreifen. Es entfällt das manuelle lästige Downloaden und zwischenspeichern von Bilddateien.&lt;br /&gt;
Einfach im Browser die Bildadresse kopieren und in die Befehlszeile einsetzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiele:'''&lt;br /&gt;
* Bild aus dem Internet direkt mit convert bearbeiten und das Ergebnis ansehen&lt;br /&gt;
&amp;lt;pre&amp;gt;convert http://www.linux-club.de/images/konqui.gif -mattecolor tomato -frame 9x20+4+0 png:- | display png:-&amp;lt;/pre&amp;gt;&lt;br /&gt;
* man möchte wissen welche EXIF-Informationen man mit seinen Bildern im Internet veröffentlicht&lt;br /&gt;
&amp;lt;pre&amp;gt;identify -format &amp;quot;%[EXIF:*]&amp;quot; http://www.linux-club.de/wiki/images/Musterbild.jpg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.imagemagick.org/Usage/ Beispiele für die Benutzung von ImageMagick] {{englisch}}&lt;br /&gt;
* [http://www-128.ibm.com/developerworks/library/l-graf/?ca=dnt-428 Graphics from the Command Line] {{englisch}}&lt;br /&gt;
* [http://www-128.ibm.com/developerworks/library/l-graf2/?ca=dgr-lnxw15GraphicsLine More graphics from the command line] {{englisch}}&lt;br /&gt;
* Kleiner Tipp am Rande für alle die nicht immer online sein wollen, wenn ihr ImageMagick installiert habt, dann habt ihr einige der Hilfe- und Dokuseiten als HTML mit installiert (normalerweise unterhalb von '''/usr/share/doc/packages/ImageMagick/''' )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Grafik]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Farbe_in_der_Konsole&amp;diff=30868</id>
		<title>Farbe in der Konsole</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Farbe_in_der_Konsole&amp;diff=30868"/>
		<updated>2014-01-06T08:00:37Z</updated>

		<summary type="html">&lt;p&gt;Itu: ~tf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Farbe in der Konsole ==&lt;br /&gt;
&lt;br /&gt;
; Vorbemerkung :&lt;br /&gt;
hin und wieder möchte man auch auf einem Textterminal etwas Hervorheben oder farbig markieren. Das so etwas geht, hat wohl jeder schon einmal erlebt, nachdem man z.B. '''mc''' gestartet hat oder bei der Ausgabe von '''ls''' sich über die bunten Dateinamen gewundert hat.&lt;br /&gt;
&lt;br /&gt;
* Auf einem Textterminal ist eine farbige Anzeige mittels '''ANSI Escape Sequences''' möglich&lt;br /&gt;
* Nicht alle Terminals unterstützen dies &lt;br /&gt;
* Welchen Terminaltyp man derzeit benutzt, ist in der TERM-Umgebungsvariable hinterlegt. '''echo $TERM'''&lt;br /&gt;
* Eine Übersicht, welche Typen farbige Ausgaben unterstützen findet man in der Datei /etc/DIR_COLORS (es ist aber nicht die authoritative Quelle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Die ANSI Escape Sequence für Attribut- und Farbdarstellung ===&lt;br /&gt;
 &lt;br /&gt;
; das Prinzip der Escape-Sequenzen für farbige Ausgabe:&lt;br /&gt;
ist folgendes Format '''\033[''', gefolgt von einer beliebigen Anzahl von Codes, die durch ''';''' getrennt sind, und das letzte mit '''m''' abgeschlossen ist, z.B. '''\033[1;37;41m'''.&lt;br /&gt;
&lt;br /&gt;
dabei gilt im Einzelnen&lt;br /&gt;
* '''Eröffnung der Sequenz''' ist immer '''\033[''' oder etwas abgkürzt '''\e[''' &lt;br /&gt;
&lt;br /&gt;
* Codes für die Hintergrundfarbe:&lt;br /&gt;
:* 40=schwarz&lt;br /&gt;
:* 41=rot&lt;br /&gt;
:* 42=grün&lt;br /&gt;
:* 43=braun&lt;br /&gt;
:* 44=blau&lt;br /&gt;
:* 45=violett (&amp;quot;magenta&amp;quot;)&lt;br /&gt;
:* 46=cyan&lt;br /&gt;
:* 47=grau (&amp;quot;weiß&amp;quot;)&lt;br /&gt;
:* 49=Standard&lt;br /&gt;
: &amp;quot;Standard&amp;quot; bezieht sich auf die Voreinstellung des Terminals bzw. des Konsolenprogramms, und kann - insbesondere bei grafischen Terminalemulatoren - von allen (40 bis 47) in der Farbe abweichen.&lt;br /&gt;
&lt;br /&gt;
* Codes für Textattribute:&lt;br /&gt;
:* 0=alle Attribute und Farben zurücksetzen&lt;br /&gt;
:* 1=fett&lt;br /&gt;
:* 2=kursiv (wird oft nicht dargestellt oder durch eine Farbe ersetzt)&lt;br /&gt;
:* 4=unterstrichen&lt;br /&gt;
:* 5=blinken&lt;br /&gt;
:* 7=reverse&lt;br /&gt;
:* 22=fett ausschalten&lt;br /&gt;
:* 24=Unterstreichung ausschalten&lt;br /&gt;
:* 25=Blinken ausschalten&lt;br /&gt;
:* 27=reverse umkehren&lt;br /&gt;
&lt;br /&gt;
* Codes für die Vordergrundfarben&lt;br /&gt;
:* Wie bei Hintergrund, aber statt 40-47,49 jeweils 30-37,39&lt;br /&gt;
&lt;br /&gt;
* ''die einzelnen Codes werden mit Semikolon ohne zusätzliche Leerzeichen getrennt''&lt;br /&gt;
&lt;br /&gt;
* '''den Abschluss''' bildet ein '''m'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in Verbindung mit dem Attribut 0 oder 1 ergeben sich folgende Textfarben &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Black       0;30     Dark Gray     1;30&lt;br /&gt;
Blue        0;34     Light Blue    1;34&lt;br /&gt;
Green       0;32     Light Green   1;32&lt;br /&gt;
Cyan        0;36     Light Cyan    1;36&lt;br /&gt;
Red         0;31     Light Red     1;31&lt;br /&gt;
Purple      0;35     Light Purple  1;35&lt;br /&gt;
Brown       0;33     Yellow        1;33&lt;br /&gt;
Light Gray  0;37     White         1;37&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Beispiel für farbige Ausgaben ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo -e &amp;quot;\033[46;1;31m TESTAUSGABE \033[43;4;34m KUNTER \033[45;1;32m BUNT \033[44;1;33m ANGESTRICHEN \033[0m&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am Ende sollte möglichst immer '''\033[0m''' anbinden, damit die nachfolgende Ausgabe dann wieder &amp;quot;normal&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Script um eine Farbübersicht zu erhalten ====&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht welche Farben wie auf welcher Hintergrundfarbe wirkt, kann man mit diesem kleinem Script hier erzeugen&lt;br /&gt;
[[http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html Fundort]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
#   This file echoes a bunch of color codes to the &lt;br /&gt;
#   terminal to demonstrate what's available.  Each &lt;br /&gt;
#   line is the color code of one forground color,&lt;br /&gt;
#   out of 17 (default + 16 escapes), followed by a &lt;br /&gt;
#   test use of that color on all nine background &lt;br /&gt;
#   colors (default + 8 escapes).&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
T='gYw'   # The test text&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\n                 40m     41m     42m     43m\&lt;br /&gt;
     44m     45m     46m     47m&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \&lt;br /&gt;
           '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \&lt;br /&gt;
           '  36m' '1;36m' '  37m' '1;37m';&lt;br /&gt;
  do FG=${FGs// /}&lt;br /&gt;
  echo -en &amp;quot; $FGs \033[$FG  $T  &amp;quot;&lt;br /&gt;
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;&lt;br /&gt;
    do echo -en &amp;quot;$EINS \033[$FG\033[$BG  $T  \033[0m&amp;quot;;&lt;br /&gt;
  done&lt;br /&gt;
  echo;&lt;br /&gt;
done&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== der Befehl tput ===&lt;br /&gt;
&lt;br /&gt;
Wie wir es gewohnt sind, gibt es unter LINUX immer mehrere Möglichkeiten um ein und das selbe zu erreichen.&lt;br /&gt;
mit dem Befehl '''tput''' läßt sich ebenfalls Farbe auf die Konsole zaubern. Das ist aber nur ein Teilbereich dieses Befehls.&lt;br /&gt;
Für genauere Informationen bitte in die Manpages von  [http://www.die.net/doc/linux/man/man1/tput.1.html tput] und [http://www.die.net/doc/linux/man/man5/terminfo.5.html terminfo] schauen. Einen kleinen Vorgeschmack über die Möglichkeiten mittels&lt;br /&gt;
tput die Farben innerhalb des Terminals zu beeinflussen bekommt man auch [http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html hier]&lt;br /&gt;
&lt;br /&gt;
Neben der Wahl von Textfarbe, Hintergrundfarbe, Textattribute wie Fett und Unterstrichen (um nur mal einige der Wichtigsten zu nennen), kann man&lt;br /&gt;
mit tput auch den Cursor innerhalb des Terminals frei positionieren, einzelne Zeichen oder Zeilen löschen, oder neue Zeichen und Zeilen dazwischenschieben, den Bildschirm leer machen, oder das Terminal auf seine Einstellungen zurücksetzen, wenn man mal nur noch Sonderzeichen auf dem Bildschirm hat, die Eigenschaften des aktuellen Terminals abfragen und vieles mehr. Aber auch hier ist zu bemerken, dass die Möglichkeiten dieses Befehles schon durch die jeweiligen Terminaleinstellungen beschränkt werden. Man sollte also daran denken, wenn man innerhalb eines Scriptes mit tput arbeitet, dass es auf einem anderem Rechner oder den Einstellungen eines anderen Users durchaus auch ein furchtbares unansehnliches Bild ergeben kann. Auch sollte man unbedingt prüfen ob sich am Ende wirklich ein Terminal ( besser sogar noch welcher Terminaltyp ) befindet, oder die Ausgabe eventuell in eine Datei oder in eine Pipe geleitet ist. Anstelle von Erklärungen der einzelnen Funktionen und Optionen von tput hier ein kleines Script in dem einige Funktionen von tput eingebaut sind, zum Ausprobieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -t 1 ]&lt;br /&gt;
then&lt;br /&gt;
typeset -i ZEILE&lt;br /&gt;
&lt;br /&gt;
tput clear&lt;br /&gt;
for HINTERGRUND in 0 1 2 3 4 5 6 7 8&lt;br /&gt;
do&lt;br /&gt;
  tput sgr0&lt;br /&gt;
  tput setaf $HINTERGRUND&lt;br /&gt;
  ZEILE=5+$HINTERGRUND&lt;br /&gt;
&lt;br /&gt;
  for POSITION in 5 30 55&lt;br /&gt;
  do&lt;br /&gt;
    tput cup  $ZEILE $POSITION&lt;br /&gt;
    if [ $POSITION -eq 30 ]&lt;br /&gt;
     then tput smul&lt;br /&gt;
    fi&lt;br /&gt;
    if [ $POSITION -eq 55 ]&lt;br /&gt;
     then tput bold; tput rmul;&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    for FARBE in 0 1 2 3 4 5 6 7 8&lt;br /&gt;
    do&lt;br /&gt;
      tput setab $FARBE&lt;br /&gt;
      echo -n &amp;quot;X-&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
tput sgr0&lt;br /&gt;
tput home&lt;br /&gt;
for i in 1 2 3&lt;br /&gt;
do&lt;br /&gt;
 tput bel&lt;br /&gt;
 sleep 1&lt;br /&gt;
 tput flash&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
echo &amp;quot;Ausgabe geht nicht an ein Terminal&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Anwendung von tput innerhalb eines Scriptes ====&lt;br /&gt;
&lt;br /&gt;
oftmals wird man Farb- oder Testattribute öfter innerhalb eines Scriptes verwenden wollen.&lt;br /&gt;
Es ist deshalb oftmals von Vorteil, wenn man diese Attribute in Variable ablegt, und dann an Ort und Stelle in die&lt;br /&gt;
Ausgaben einbaut. Ein kleines Beispiel soll das verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BLACK=`tput setaf 0`&lt;br /&gt;
ROT=`tput setaf 1`&lt;br /&gt;
BLAU=`tput setaf 4`&lt;br /&gt;
GELB=`tput setaf 3`&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Das hier ist ein Text der durch ${ROT}rote${BLACK} durch ${BLAU}blaue ${BLACK}&amp;quot; &lt;br /&gt;
echo &amp;quot;und ${GELB}gelbe ${BLACK} Worte ${ROT}unterbrochen ${BLACK}ist.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anwendung im Shell Prompt ===&lt;br /&gt;
 &lt;br /&gt;
==== farbiges Prompt ====&lt;br /&gt;
&lt;br /&gt;
Die Shellvariable PS1 steuert das Verhalten des Prompts.&lt;br /&gt;
Du kannst folgendes in deine .bashrc (in deinem Homeverzeichnis) schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if test \( &amp;quot;$TERM&amp;quot; = &amp;quot;xterm&amp;quot; -o &amp;quot;${TERM#screen}&amp;quot; != &amp;quot;$TERM&amp;quot; \) -a -z &amp;quot;$EMACS&amp;quot;&lt;br /&gt;
then&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\[\e]2;\u@\h:\w\007\e]1;\h\007\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
        export PS1=&amp;quot;\[\033[31m\]\u@\h:\w&amp;gt; \[\033[0m\]&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann die Datei neu einlesen oder eine neue Bash eröffnen damit die Änderung wirkt&amp;lt;br/&amp;gt;&lt;br /&gt;
es genügt '''.bashrc''' im Homeverzeichnis abzusetzen&lt;br /&gt;
&lt;br /&gt;
Danach solltest du einen roten Prompt haben. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Farbiger Errorlevel im Prompt ====&lt;br /&gt;
&lt;br /&gt;
Errorlevel in rot anzeigen &lt;br /&gt;
Folgenden Code in der aktuellen Bash ausführen oder für dauerhaften Gebrauch in der ~/.bashrc ablegen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PROMPT_COMMAND='LASTERROR=&amp;quot;[$?]&amp;quot; ; test &amp;quot;$LASTERROR&amp;quot; = &amp;quot;[0]&amp;quot; || echo -ne &amp;quot;\033[93;41m${LASTERROR}\033[0m&amp;quot;'&lt;br /&gt;
export PROMPT_COMMAND &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt wird der Rückgabe Wert eines Befehles oder Scriptes insofern er nicht '''0''' ist, innerhalb des folgenden Prompt farbig angezeigt, das kann sehr hilfreich sein, z. B. für das Schreiben und Testen von Befehlsketten oder Scripte.&lt;br /&gt;
&lt;br /&gt;
==== Links zum Thema Prompt ====&lt;br /&gt;
* [http://www.tldp.org/linuxfocus/common/sart/index.html#2000-02-14%3A5 Colors in the command prompt]&lt;br /&gt;
* [http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/index.html Bash-Prompt]&lt;br /&gt;
&lt;br /&gt;
=== Anwendungen innerhalb des ls Befehles ===&lt;br /&gt;
&lt;br /&gt;
Der ls Befehl kann Dateientypen an Dateiattributen und Prefixen erkennen und farbig darstellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch [http://www.die.net/doc/linux/man/man1/ls.1.html man ls] &amp;lt;br/&amp;gt;&lt;br /&gt;
Verantwortlich für das Einschalten dieser Funktion ist die Option '''--color'''&lt;br /&gt;
&lt;br /&gt;
==== Zuordnung der Farben zu den Dateitypen ====&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung der Farben zu den Dateitypen wird global für alle in der '''/etc/DIR_COLORS''' vorgenommen.&lt;br /&gt;
Jedem User sollte es aber möglich sein diese Datei in sein Homeverzeichnis unter dem Namen '''.dir_colors''' zu kopieren, dann kann er seinen Bedürfnissen und Vorlieben entsprechend, selbst seine persönlichen Einstellungen durch ändern dieser Datei vornehmen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /etc/DIR_COLORS ~/.dir_colors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach einfach die bash neu starten, damit die Änderungen wirken.&lt;br /&gt;
&lt;br /&gt;
Mehr Infos mit '''man DIR_COLORS'''&lt;br /&gt;
&lt;br /&gt;
==== Links zum Thema ls und Color ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.linux-user.de/ausgabe/2001/12/092-zubefehl/ls-3.html ls Bitte in bunt]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Syntax Highlighting im [[Text editieren mit vi|vi]] ===&lt;br /&gt;
&lt;br /&gt;
Der [[Text editieren mit vi|Texteditor vi]] auf der Konsole, der in keinem LINUX/UNIX fehlt, ist in den modernen Linuxsystemen auf einen wesentlich leistungsfähigeren Nachfolger [http://www.vim.org/ '''vim'''] oder einen Klon davon, gelinkt. Dieser Editor kann unter Anderem auch '''Syntax Highlighting&amp;quot;''' für eine Vielzahl von Dateitypen.&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis ''/usr/share/vim/current/syntax/'' stehen die Syntaxkonfigurationsfiles. Anhand der Endung (prefix) der zu editierenden Datei erkennt vim welche Syntax für diesen Dateitype zu benutzen ist. Selbstverständlich kann man auch seine eigenen Syntax-Konfigurationsfiles entwerfen und einsetzen und auch die Farben anpassen. Siehe dazu http://vimdoc.sourceforge.net/htmldoc/usr_44.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ein- Ausschalten des Syntax highlighting im vim ====&lt;br /&gt;
&lt;br /&gt;
; permanent durch Eintrag in der Vim-Konfigurationsdatei ~/.vimrc :&lt;br /&gt;
anlegen der Datei bzw. erweitern dieser Datei und folgenden Eintrag vornehmen &lt;br /&gt;
 '''syntax on'''&lt;br /&gt;
&lt;br /&gt;
; bei Bedarf durch Zeilenoption beim Start von vi :&lt;br /&gt;
 # vi +'''&amp;quot;syn on&amp;quot;''' file.prefix&lt;br /&gt;
&lt;br /&gt;
; bei Bedarf während der Sitzung im Kommandomodus :&lt;br /&gt;
hier kann während der Sitzung dieser Modus nach Belieben Ein- und Ausgeschaltet werden&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:syntax on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Analog Ausschalten &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:syntax off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Orginal http://www.linux-club.de/viewtopic.php?t=15252--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Konsole]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=ImageMagick_n%C3%BCtzliche_Beispiele&amp;diff=29536</id>
		<title>ImageMagick nützliche Beispiele</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=ImageMagick_n%C3%BCtzliche_Beispiele&amp;diff=29536"/>
		<updated>2013-08-28T15:22:40Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Box Hinweis||&lt;br /&gt;
Bitte vor Änderungen an diesem Artikel die Hinweise auf den [[Diskussion:ImageMagick nützliche Beispiele|Diskussionsseite]] lesen .}}&lt;br /&gt;
&lt;br /&gt;
== Befehlsbeispiele mit convert ==&lt;br /&gt;
&lt;br /&gt;
=== einfaches Formatumwandlung und Scalierung ===&lt;br /&gt;
&lt;br /&gt;
Ein Ursprungsbild im Format JPEG soll umgewandelt und gespeichert werden als PNG.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Ursprungsbild (hier bild.jpg) soll dabei erhalten bleiben. Der entstehende Bildtype wird durch die Endung  des Ausgangsbildes (hier .png) vorgegeben.&lt;br /&gt;
 convert bild.jpg bild.png &lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu der Formatumwandlung möchten wir aber auch die Größe des Ausgangsbildes ändern. Wir möchten dabei das Seitenverhältniss des Orginalbildes jedoch beibehalten aber die Höhe und Breite auf jeweils 640 Pixel begrenzen. Hochkanntbilder haben dann 640 Pixel Höhe und normale Bilder haben 640 Pixel Breite, immer bei Beibehaltung der Seitenverhältnisse des Orginalbildes&lt;br /&gt;
 convert bild.jpg -resize 640x640 bild.png&lt;br /&gt;
&lt;br /&gt;
Um ein Bild unabhängig der Seitenverhältnisse auf eine ganz bestimmte Pixelgröße zu zwingen, benutzt man ein Ausrufezeichen hinter der Größenangabe.&lt;br /&gt;
 convert bild.jpg -resize 300x280! bild.png&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich das Bild prozentuel zu vergößern oder zu verkleinern.&lt;br /&gt;
 convert bild.jpg -resize 50% bild.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bilder beschneiden ===&lt;br /&gt;
&lt;br /&gt;
Um nun nur einen Teil eines Bildes zu verarbeien kann man diesen aus dem Gesamtbild ausschneiden mit der Option '''-crop'''&lt;br /&gt;
 convert logo: -crop 200x200+310+100 +repage x:&lt;br /&gt;
Dieser Befehl hat gleich einige Besonderheiten auf die wir eingehen wollen. &lt;br /&gt;
* Das Eingangsbild hier ist '''logo:''' Dieses ist das ImageMagick-Logo das in die Sortware eingebaut ist und das kann man hervorragend zum Testen benutzen. &lt;br /&gt;
* Das Ausgangsbild ist '''x:''' Hierbei handelt es sich um eine spezielle Ausgabe, und zwar wird das Bild gleich auf der X-Oberfläche angezeigt. Es hat die selbe Auswirkung wie das Beispiel unter [[ImageMagick#display|display]] nur hier viel kürzer zu schreiben und mit einem abgespecktem Display-Programm. Wenn der Befehl das gewünschte Ergebnis erbringt, braucht man es nur gegen einen Bilderdateinamen auszutauschen. Man kann also auf diese Art und Weise sehr einfach anschauen, was ein Befehl für ein Bild erzeugen würde, bevor man in irgendwelche Dateien schreibt. &lt;br /&gt;
* die Option hinter [http://www.imagemagick.org/script/command-line-options.php?#crop -crop] gibt an, was aus dem Bild ausgeschnitten werden soll und zwar&lt;br /&gt;
: '''200x200+310+100''' bedeutet 200x200 Bildpunkte ab der Position 310 Bildpunkte nach rechts und 100 Bildpunkte nach unten.&lt;br /&gt;
* '''[http://www.imagemagick.org/script/command-line-options.php?#repage +repage]''' mit dieser Option entfernen wir beim beschneiden mit -crop aus dem Header des Bildes die &amp;quot;canvas und offset&amp;quot; Werte, die würden sonst beim Beschneiden falsch stehen bleiben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 convert logo:  -gravity Center -crop 75%x+0+0  +repage x:&lt;br /&gt;
hier wird ebenfalls -crop verwendet. Wir schneiden vom Bild 75% aus, und zwar wurde mit der Option '''[http://www.imagemagick.org/script/command-line-options.php?#gravity -gravity]''' und dem Versatz von '''+0+0''' die Mitte des Bildes bestimmt. Dieser Befehl schneidet also an den Rändern des Bildes 25% ab, egal wie groß das Bild ist. So etwas würde sich zB anbieten als erste Bearbeitungsstufe für die Erstellung von vergrößerten Vorschaubildern uä.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
manchmal ist es erforderlich, das man sehr große Bilder in Einzelbilder aufteilt. hier ein Beispiel wie man ein Bild in 4 Teilbilder zerlegt und dann wieder zusammenbaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# convert logo: -depth 16 testa.png                          #TestBild testa.png erzeugen&lt;br /&gt;
# convert testa.png -crop 50% test_%d.png                    #Aufteilen des Bildes in 4 Teile&lt;br /&gt;
# montage -mode concatenate -tile 2x2 test_?.png testf.png   #Zusammenbau der 4 Teile zu einem Bild testf.png&lt;br /&gt;
#&lt;br /&gt;
# identify test*.png                                         #Bildinformationen der 6 Bilder anzeigen lassen&lt;br /&gt;
test_0.png PNG 320x240 640x480+0+0 DirectClass 16-bit 37.0449kb &lt;br /&gt;
test_1.png[1] PNG 320x240 640x480+320+0 DirectClass 16-bit 48.9062kb &lt;br /&gt;
test_2.png[2] PNG 320x240 640x480+0+240 DirectClass 16-bit 5.42773kb &lt;br /&gt;
test_3.png[3] PNG 320x240 640x480+320+240 DirectClass 16-bit 45.5645kb &lt;br /&gt;
testa.png[4] PNG 640x480 640x480+0+0 DirectClass 16-bit 141.48kb &lt;br /&gt;
testf.png[5] PNG 640x480 640x480+0+0 DirectClass 16-bit 141.459kb &lt;br /&gt;
# compare testf.png testa.png x:                             #nach Differenzen zwischen testf.png und testa.png suchen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  die Option '''-depth 16''' : damit legen wir die Farbtiefe genau fest.&lt;br /&gt;
* '''-crop 50%''' in dieser Kombination mit der Angabe der multiblen Ausgabedatei(en) erzeugt genau 4 Teilbilder vom Gesamtbild&lt;br /&gt;
* mit [[ImageMagick#montage|montage]] bauen wir die Bilder wieder zusammen Option  '''concatenate -tile 2x2''' bedeutet ohne Zwischenraum mit einer Geometrie 2x2 Bilder.&lt;br /&gt;
* Zur Information: mit [[ImageMagick#identify|identify]] lassen wir uns die Bildeigenschaften aller Bilder anzeigen &lt;br /&gt;
* Zur Kontrolle: [[ImageMagick#compare|compare]] führt hier einen mathematischen Vergleich von Endbild und Ausgangsbild durch und zeigt ihn uns grafisch an. (rote Bildpunkte sind Veränderungen zwischen beiden Bildern)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bilder beschneiden und skalieren ===&lt;br /&gt;
Manchmal möchte man in einer Fotogallerie verkleinerte Versionen (Thumbnails) als Vorschaubilder anzeigen. Die Bilder haben in der Regel unterschiedliche Höhe/Breite Dimensionen. Wir wollen gleichmäßig große Vorschaubilder erhalten. (hier am Beispiel: 75x75 px). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
convert original.jpg -resize 150x150 -gravity Center -crop 75x75+0+0  +repage mini_original.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird ebenfalls -crop verwendet. Wir verkleinern das Bild auf 150x150 Pixel (die verkleinerte Version soll 75x75 Pixel groß sein, daher verkleinert wir zunächst auf die doppelte Größe, also 150x150 Pixel). Danach wird das Zentrum in die Mitte des Bildes gelegt, und die Ränder werden gleichmäßig beschnitten, so dass die verkleinerte Version genau 75x75 Pixel groß ist, und keine Bildverzerrungen auftauchen, und das Bild voll ausgefüllt ist.&lt;br /&gt;
&lt;br /&gt;
=== Bilder spiegeln und drehen ===&lt;br /&gt;
&lt;br /&gt;
Es gibt in ImageMagick 4 einfache Möglichkeiten Bilder zu spiegelen&amp;lt;br&amp;gt;&lt;br /&gt;
* waagerecht '''-flip'''&lt;br /&gt;
* senkrecht '''-flop'''&lt;br /&gt;
* diagonal (linksoben-rechtsunten) '''-transpose'''&lt;br /&gt;
* diagonal (rechtsoben-linksunten) '''-transverse'''&lt;br /&gt;
&lt;br /&gt;
Beispiele mit dem Logo und Ausgabe anstatt in eine Datei gleich Anzeige mit display:&lt;br /&gt;
 convert logo: -flip x:&lt;br /&gt;
 convert logo: -flop x:&lt;br /&gt;
 convert logo: -transpose x:&lt;br /&gt;
 convert logo: -transverse x:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bilder drehen kann man mit dem Operator '''-rotate x''' (wobei x die Drehung in Grad bestimmt)&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiele mit dem Logo und Ausgabe anstatt in eine Datei gleich Anzeige mit display&lt;br /&gt;
 convert logo: -rotate 90 x:&lt;br /&gt;
 convert logo: -rotate -90 x:&lt;br /&gt;
 convert logo: -rotate -130 x:&lt;br /&gt;
Zu beachten ist, bei Drehungenswinkeln die nicht durch 90 teilbar sind, wird die Bildgröße verändert, warum zeigt das nächste Beispiel.&lt;br /&gt;
 convert logo: -background blue -rotate 45 x:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Drehen gibt es noch eine nette Erweiterung, wir können an Hand des Seitenverhältnisses bestimmen, ob das Bild gedeht werden soll oder nicht. Diese Option kann man gelegentlich bei der automatischen Bildbearbeitung in Scripten sehr gut gebrauchen.&lt;br /&gt;
* ein '''&amp;lt;''' direkt hinter der Winkelangabe bedeutet, das Bild wird nur gedeht wenn es höher als breit ist &lt;br /&gt;
* ein '''&amp;gt;''' direkt hinter der Winkelangabe bedeutet, das Bild wird nur gedeht wenn es breiter als hoch ist.&lt;br /&gt;
('' da es sich hierbei um Sonderzeichen handelt die die Shell anders interpretieren würde, müssen wir diese vor der Interpretation in der Shell schützen '')&lt;br /&gt;
 convert logo: -resize 200x150! -rotate &amp;quot;90&amp;lt;&amp;quot; x:&lt;br /&gt;
 convert logo: -resize 150x200! -rotate &amp;quot;90&amp;lt;&amp;quot; x:&lt;br /&gt;
 convert logo: -resize 150x200! -rotate 90\&amp;lt; x:&lt;br /&gt;
 convert logo: -resize 200x150! -rotate 90\&amp;lt; x:&lt;br /&gt;
&lt;br /&gt;
== Befehlsbeispiele mit mogrify ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Befehlsbeispiele mit montage ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tricks und Tips für spezielle Aufgaben ==&lt;br /&gt;
=== automatische Bildorientierung mit ImageMagick ===&lt;br /&gt;
&lt;br /&gt;
Wenn wir wild umeinander fotografieren machen wir nicht nur breitformatige Bilder sondern gelegentlich auch hochformatige Bilder (Porträtformat). Einge teure Kameras registrieren das auch, oder Bildbearbeitungssoftware trägt das so bei Bearbeitung der Bilder in den Bildheader ein. Wenn wir uns jetzt die so entstandenen Bilder zB im Konqueror ansehen, dann korrigiert der Konqueror die Ausrichtung der Bilder automatisch, auch die Bildervorschau und thumbnails im Konqueror ist richtig. Andere Bildanzeigeprogramme zB [http://man.cx/xv xv]  oder auch [[GIMP|GIMP]] zeigen die Bilder aber nach wie vor im Breitformat. Zuständig für diese Automatik der automatischen Ausrichtung in einigen Programmen ist die [http://de.wikipedia.org/wiki/EXIF EXIF]:Orientation diese können wir in den Bildern abfragen mit&lt;br /&gt;
 # identify -format '%[exif:orientation]' bildname.jpg&lt;br /&gt;
wird hier eine '''1''' (''TopLeft'') zurückgeliefert, dann ist dort eingetragen: das Bild ist richtig ausgerichtet. &lt;br /&gt;
In den neueren Versionen (ca. ab IM 6.2.8) kann man mit ImageMagick auch mit diesen Optionen arbeiten. Am Besten ihr testet mal ob eure Version das unterstützt.&lt;br /&gt;
 # convert -list Orientation&lt;br /&gt;
bringt entweder einen Fehler, das es nicht unterstützt wird, oder folgende Ausgabe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TopLeft&lt;br /&gt;
TopRight&lt;br /&gt;
BottomRight&lt;br /&gt;
BottomLeft&lt;br /&gt;
LeftTop&lt;br /&gt;
RightTop&lt;br /&gt;
RightBottom&lt;br /&gt;
LeftBottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ihr könnt den Eintrag der Orientation eurer Bilder ändern ohne die Bilder dabei selbst zu drehen. &lt;br /&gt;
 # mogrify -orient RightTop bildname.jpg       #für Bilder bei denen oben am linken Rand ist&lt;br /&gt;
 # mogrify -orient LeftBottom bildname.jpg     #für Bilder bei denen oben am rechten Rand ist&lt;br /&gt;
 # mogrify -orient TopLeft bildname.jpg        #für richtig gedrehte Bilder die aber jetzt falsch angezeigt werden&lt;br /&gt;
das alles unter der Bemerkung des [[ImageMagick#compare|Beispiels]] ,das die Bildqualität damit zumindestens nicht besser wird. (''Achtung: im Beispiel ist der Befehl [[ImageMagick#mogrify|mogrify]] verwendet.''] Wenn ihr sowas wirklich Qualitätsverlustfrei machen wollt, ist [http://www.sentex.net/~mwandel/jhead JHead] als Programm besser geeignet. &lt;br /&gt;
Zum Anzeigen und Verarbeiten der Bilder entsprechend der richtigen Orientation gibt es in ImageMagick die Option&lt;br /&gt;
[http://www.imagemagick.org/script/command-line-options.php?#auto-orient -auto-orient]&lt;br /&gt;
 # display -resize 800x800 -auto-orient bild.jpg &lt;br /&gt;
zeigt ein Bild entsprechend der EXIF Orientation richtig an, convert und die anderen Befehle zur Bildbearbeitung nutzen analog die selbe Option. &lt;br /&gt;
&lt;br /&gt;
Weiterführende Informationen zu diesem Thema gibts [http://www.imagemagick.org/Usage/photos/#orient hier]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Musterbilder erstellen ===&lt;br /&gt;
&lt;br /&gt;
Hin und wieder braucht jemand von seinen Fotos für irgendwelche Zwecke Musterbilder. Diese Bilder sollen für andere zwar ansehbar und auch in einer geminderten Qualität aber nicht weiterverwendbar sein. Hier reicht es nicht aus, die Bilder am Rand zu beschriften oder irgendwo in die Ecke ein kleines Logo zu setzen. Es soll am besten ein riesen Logo quer über das Bild, damit man es nicht wegschneiden kann. &lt;br /&gt;
Folgendes Script kann das erledigen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#/bin/bash&lt;br /&gt;
# Das Script sucht im aktuellem Verzeichnis nach &amp;quot;.jpg&amp;quot;-endenden Dateien und nimmt an es handelt sich um Bilder&lt;br /&gt;
# von den Bildern werden Kopien definierter Groesse gemacht und mit Text-Wasserzeichen versehen&lt;br /&gt;
# den so enstehenden Kopien wird die Vorsilbe &amp;quot;muster_&amp;quot; vor den Dateinamen gegeben.&lt;br /&gt;
# erforderlich ist das Paket ImageMagick (Version 6)&lt;br /&gt;
&lt;br /&gt;
FONT=&amp;quot;/usr/X11/lib/X11/fonts/truetype/VeraBd.ttf&amp;quot; # Die Schriftart die Verwendung finden soll&lt;br /&gt;
FONTSIZE=120                                      # Die Schriftgroesse in Pixel (Werte 32 bis 120)&lt;br /&gt;
COPYRIGHT=&amp;quot;* Muster *&amp;quot;                            # der Wasserzeichentext&lt;br /&gt;
SIZE=&amp;quot;800x800&amp;quot;                                    # die Bildergroesse die entstehen soll&lt;br /&gt;
POS=Center                                        # Position des Wasserzeichens (Mitte=Center Unten=South Oben=North)&lt;br /&gt;
KOMPR=98                                          # jpeg Kompressionsfaktor [ 85 (normal) bis 98 (sehr gut)] &lt;br /&gt;
&lt;br /&gt;
# Infos zu den einzelnen Befehlen und weiteren Moeglichkeiten unter http://www.imagemagick.org/Usage&lt;br /&gt;
&lt;br /&gt;
convert -font $FONT -pointsize $FONTSIZE -background black -fill white \&lt;br /&gt;
 label:&amp;quot;$COPYRIGHT&amp;quot; -trim +repage -bordercolor black -border 20x10 tmp_mask1.png&lt;br /&gt;
&lt;br /&gt;
convert tmp_mask1.png -blur 0x03 -shade 135x45 -normalize tmp_shade135.png&lt;br /&gt;
&lt;br /&gt;
convert tmp_mask1.png -font $FONT -pointsize $FONTSIZE -fill white -gravity center \&lt;br /&gt;
   -stroke white -strokewidth 3 -draw &amp;quot;text 0,0 \&amp;quot;$COPYRIGHT\&amp;quot;&amp;quot; tmp_mask2.png &lt;br /&gt;
&lt;br /&gt;
convert tmp_shade135.png tmp_mask2.png +matte -compose CopyOpacity -composite mask3d.png&lt;br /&gt;
rm tmp_mask1.png tmp_mask2.png tmp_shade135.png&lt;br /&gt;
&lt;br /&gt;
for BILD in *.jpg&lt;br /&gt;
do&lt;br /&gt;
 composite mask3d.png &amp;quot;${BILD}&amp;quot; -resize $SIZE -gravity $POS -compose HardLight -quality $KOMPR muster_&amp;quot;$BILD&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
rm mask3d.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der erste Teil des Scriptes ist dokumentiert. Hier werden die persönlichen Einstellungen gemacht. Aufgerufen wird das Script in dem Verzeichnis in dem die JPEG-Dateien liegen, von denen man die Muster braucht und zwar ohne irgend eine Option.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Musterbild.jpg|right|Musterbild erstellt mit Script]]&lt;br /&gt;
* der erste convert Befehl erstellt eine Bildmaske aus dem Schriftzug  Dateiname '''tmp_mask1.png'''&lt;br /&gt;
* der zweite convert Befehl macht durch weichzeichnen Schatten und normalisieren daraus ein graues 3D-Schatten Bild Namens '''tmp_shade135.png'''&lt;br /&gt;
* der dritte convert nimmt die erste Maske als Vorlage und schreibt die selbe Schrift nocheinmal aber etwas verbreitert darauf '''tmp_mask2.png'''&lt;br /&gt;
* der vierte convert nimmt jetzt die 2 Maske und schneidet mit ihrer Hilfe das 3D Schattenbild aus, indem es den Rest unsichtbar macht.'''mask3d.png'''&lt;br /&gt;
* die beiden Masken und das Schattenbild werden gelöscht, die brauchen wir nicht mehr.&lt;br /&gt;
* in einer Schleife werden jetzt alle JPEG-Bilder einzeln mit  mask3d.png überlagert und dabei ein verkleinertes Bild Namens '''muster_''ALTERDATEINAME''''' erstellt.&lt;br /&gt;
* nach Abschluss der Schleife wird auch mask3d.png gelöscht.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Achtung''': es ist nicht ganz sicher seit welcher Version von ImageMagick dieses Script funktioniert es wurde getestet SuSE 10.1 und neuer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Farb und Kontrastverbesserung bei Unterwasserbildern ===&lt;br /&gt;
&lt;br /&gt;
Obwohl diese Methode hier auch auf normale Bilder anwendbar ist, stellen wir sie unter der Überschrift Unterwasserbilder, da hier der Effekt sehr ausgeprägt auftritt. &amp;lt;br&amp;gt;&lt;br /&gt;
Unterwasserbilder zB. mit einer UW-Digitalkamera gemacht, sehen im Display der Kamera ja noch recht ansehlich aus. Sobald man sie aber über den Computer ansieht, erkennt man das ganze Übel. Jetzt kommen nicht nur Unschärfe und Bewegungsunschäfe und das [http://de.wikipedia.org/wiki/Plankton Plankton] im Blitzlicht so richtig zu Geltung, nein, je größer wir uns das Bild anschauen, je mehr fällt auf, dass auf sehr vielen Bildern die Farben in Richtung hellblau, hellgrün oder helllila verwaschen aussehen, der Farbkontrast fehlt und überhaupt alles trübe aussieht. Es ist überhaupt kein Vergleich mit dem was man gesehen hat und fotografieren wollte. Die Kamera ist hier oftmals unschuldig, es ist vielmehr das Auge und Hirn das viel diffenzierter und genauer für jeden Augenblick neu Weißabgleich und Farbkorrekturen vornimmt, und uns so Farben und Kontraste vorgaukelt, die derzeit keine Kamera der Welt genauso reproduzieren kann. Bei vielen dieser Fotos kann man das mit einer digitalen Farbkorrektur jedoch einigermaßen hinbiegen, und so doch noch sehr schöne Fotos zusammenzaubern die in etwa dem entsprechen was das Auge gesehen hat. Früher habe ich das mit Gimp gemacht, das war jedoch sehr mühsam. Seit IM v6.2.6 ist die richtige Option dafür auch in ImageMagick enthalten. &lt;br /&gt;
 &lt;br /&gt;
 convert img_0.jpg -channel 'RGBA' -contrast-stretch 1% -quality 98 korrektur_0.jpg&lt;br /&gt;
Mittels convert wird vom Bild  '''img_0.jpg''' mittels [http://www.imagemagick.org/Usage/color/#contrast-stretch contrast-stretch] eine Farbspreizung über RGB und den Alpha-Kanal vorgenommen. Das Ergebniss wird mit niedriger Komprimierung in '''korrektur_0.jpg''' abgelegt.&lt;br /&gt;
Nicht alle Bilder lassen sich so direkt bearbeiten. Sind im Ausgangsbild sehr wenig unterschiedliche Farbbereiche vorhanden, dann wird diese Methode zu  extrem. Es entstehen oftmals unnatürliche poppige Farben. Hier kann man folgendes versuchen, in dem mittels montage ein weiteres Bild mit breitem Farbbereich an das Bild angehängt wird und das so entstandene Doppelbild über contrast-stretch laufen läßt. Anschließend werden die Bilder wieder voneinander getrennt. Nach einigen Versuchen mit verschiedenen Bildern hat man oftmals dann doch noch ein einigermaßen brauchbares Bild. &amp;lt;br&amp;gt;&lt;br /&gt;
[[Bild:Contrast-stretch.jpg| links Orginalbild rechts nach Bearbeitung mit contrast-stretch]]&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Grafik|Zurück zur Grafikübersicht]]&lt;br /&gt;
[[Kategorie:Grafik]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Zeitstempel_von_Dateien&amp;diff=29419</id>
		<title>Zeitstempel von Dateien</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Zeitstempel_von_Dateien&amp;diff=29419"/>
		<updated>2013-05-19T22:18:45Z</updated>

		<summary type="html">&lt;p&gt;Itu: /* Befehle rund um Zeitstempeln */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zeitstempel von Dateien unter Linux ==&lt;br /&gt;
=== Welche Zeitstempel gibt es? ===&lt;br /&gt;
Die Zeitstempel der Dateien sind in Linux in den [[Inode]]s abgelegt.&lt;br /&gt;
Dort stehen jeweils 4 Zeitstempel, wovon jedoch einer für den Anwender nicht sichtbar und auch nicht von Interesse ist, den verwendet Linux im Filesystem zum Verwalten der gelöschten Inode, er enthält die Zeit, zu der die Datei gelöscht worden ist, und somit der Inode für eine neue Verwendung frei geworden ist. &lt;br /&gt;
&lt;br /&gt;
Derzeit kommt im ext3/4 Filesystem noch ein weiterer Zeitstempel hinzu, auf den wohl so mach ein ehemaliger Windowsuser schon lange gewartet hat, und der die wirkliche Entstehungszeit der Datei dokumentiert. Dazukommen bedeutet, in aktuellen Systemen ist er intern schon da, allerdings war dies das geringste Problem. Das Hauptproblem jetzt, es müssen sehr viele, zum Teil auch zentrale Librarys und Programme, auf eine mögliche Benutzung dieses Zeitstempels noch angepasst werden. Solche weitreichenden Änderungen könnten nur durch eine gezielte Koordinierung von zahlreichen Projekten schnell eingebracht werden. Es wird also durchaus noch einiges Wasser die Flüsse herunterfließen, bis Otto der Normalanwender letztlich diesen Zeitstempel irgendwann einmal zu Gesicht bekommt, bzw. bis er wirklich auch damit arbeiten kann. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''folgende Zeitstempel sind für den Anwender von Bedeutung'''&lt;br /&gt;
==== Access Time (atime) ====&lt;br /&gt;
Diese Zeit wird jedes mal neu gesetzt, wenn der Inhalt der Datei geöffnet worden ist. In ihm wird also der letzte Zugriff auf den Inhalt der Datei angezeigt. Dabei ist es für diesen Zeitstempel &amp;lt;!--nicht? --&amp;gt;von Bedeutung, ob die Datei vor einem schreiben erst gelesen wird oder nur an das Ende weitergeschrieben wird.  Ansonsten gilt, egal ob die Datei gelesen oder ausgeführt wird oder ob eine Kopie von dieser Datei gemacht wird, oder die Datei durchsucht wird, oder die Datei in ein Backuparchiv aufgenommen wird - immer wird dieser Zeitstempel neu auf die aktuelle Zeit gesetzt.&lt;br /&gt;
Durch die Auswertung dieses Zeitstempels könnten wir also z.B. feststellen, das wir eine Datei schon einen längeren Zeitraum nicht mehr angefasst haben. Das kann unter Anderem dabei helfen alte temporäre User- oder Systemdateien zu löschen. &lt;br /&gt;
Das ständige setzen der Access Time von Dateien und Verzeichnissen kann bei sehr vielen Zugriffen in einem Filesystem eine nicht unbedeutende Last verursachen, in bestimmten Situationen ist dieses aus Performancegründen nicht gewünscht, und kann deshalb z.B. mit Mountoptionen des Filesystems für alle Dateien oder alle Verzeichnisse abgeschaltet werden. Einige Filesysteme erlauben auch ein gezieltes Abschalten dieser ständigen atime Aktualisierungen für ausgewählte Dateien oder Verzeichnisse. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==== Modify Time (mtime) ====&lt;br /&gt;
Diese Zeit wird gesetzt, wenn der Inhalt der Datei verändert wird. In diesem Zeitstempel steht also die Zeit der letzten Veränderung der Dateidaten. Es ist der Zeitstempel der für uns die meiste Bedeutung hat. Können wir doch damit feststellen, wie aktuell die Dateidaten sind. Diese Zeit wird z.B. bei '''ls -l ''' in der default Einstellung angezeigt. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==== Change Time (ctime) ====&lt;br /&gt;
Fälschlicher Weise wird ctime oftmals mit Create Time übersetzt und somit herrscht über diesen Zeitstempel oftmals eine ganz falsche Vorstellung. Mit diesem Zeitstempel wird die Zeit gespeichert, zu welcher das letzte Mal die Daten innerhalb des Inodes geändert worden sind. Wenn man sich anschaut, welche Daten im [[Inode]] enthalten sind, kann man schon erahnen, wann diese Zeit neu gesetzt wird. Bei einem Ändern des Dateiinhaltes werden die Dateigröße sowie die Datenblöcke neu gesetzt, beim Ändern der Zugriffsrechte, der UserID oder GruppenID, beim Anlegen eines neuen Hardlinks immer wird auch der Inhalt des Inodes geändert und damit auch die ctime neu gesetzt. Aber auch bei einem Umbenennen der Datei, wird die ctime neu gesetzt, (man muss sich dabei vorstellen, das beim Umbenennen die Anzahl der &amp;quot;Links&amp;quot; zuerst um 1 erhöht wird, dann wird der neue Name angelegt, und dann anschließend der alte Name gelöscht und die &amp;quot;Links&amp;quot; wieder um 1 verringert). Es gibt eine einzige Ausnahme bei der die ctime nicht gesetzt wird: wenn durch das Auslesen der Datei nur die Access Time im Inode neu gesetzt wird, also die Datei z.B. ausgelesen wird, dann wird die Change Time nicht neu gesetzt. Dieser Zeitstempel hat z.B. eine große Bedeutung fürs Backup, da damit nicht nur festgestellt werden kann, ob sich der Inhalt der Datei sondern z.B. auch der Name oder die Eigentums- oder Zugriffsrechte einer Datei seit dem letzten Backup geändert haben. Während sich die anderen beiden Zeitstempel durch Befehle auf eine bestimmte Zeit manipulieren lassen, ist es nicht möglich die ctime auf diese Art zu setzen.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede bei Dateitypen ===&lt;br /&gt;
Bei der Interpretation der Zeitstempel müssen wir weiterhin unterscheiden, ob es sich um eine '''&amp;quot;normale&amp;quot; Datei''' oder z.B. um ein [[Directory|Verzeichnis]] handelt. Die Funktion der Zeitstempel ist bei allen Dateitypen prinzipiell gleich, allerdings durch den speziellen Aufbau und die Funktion einzelner Dateitypen ergibt sich eine etwas andere Betrachtungsweise. Bei den '''Verzeichnissen''' bedeutet die atime, das Verzeichnis wurde gelesen z.B. mit '''ls''', die mtime bedeutet es wurde in diesem Verzeichnis an den Namen der Dateien etwas geändert, oder Dateien sind in diesem Verzeichnis dazu gekommen oder entfernt worden. '''Pipes''' und '''Geräteknoten''' zeigen prinzipiell analoges Verhalten wie normale Dateien, es gibt jedoch einige Besonderheiten bei '''Symbolischen Links'''. Die atime wird hier immer dann gesetzt, wenn über diesen Weg auf die verlinkte Datei zugegriffen wird. Die ctime wird gesetzt bei Eigentumswechsel oder Umbenennen der Datei. Da der eigentliche Inhalt des Softlinks, der Verweis auf die Datei nicht geändert werden kann, wird die mtime nur bei der Erstellung des Softlinks gesetzt. Beim Versuch mittels '''chmod'''  oder '''touch''' auf den Inode des Softlinks zuzugreifen, wird statt dessen dem Link gefolgt und der Zugriff erfolgt dort auf den Inode der verlinkten Datei. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Welche Zeit wird mit welcher Operation neu gesetzt ===&lt;br /&gt;
Die folgende Tabelle zeigt einige häufige Befehle und ihre Auswirkungen auf die Zeitstempel von Verzeichnissen, normalen Dateien und Softlinks. Dabei entspricht: &lt;br /&gt;
* '''( X )''' dieser Zeitstempel wird neu gesetzt&lt;br /&gt;
* '''( .  )''' dieses Zeitstempels bleibt unverändert&lt;br /&gt;
* '''( - )''' auf Softlinks wurden nicht alle Befehle getestet oder sind wirkungslos&lt;br /&gt;
{|style=&amp;quot;height:50px&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ '''Änderung der Zeitstempel verschiedener Dateitypen bei Befehlen''' &lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:200px&amp;quot; | Befehl&lt;br /&gt;
! style=&amp;quot;width:200px&amp;quot; colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot;| aktuelles Directory &lt;br /&gt;
! style=&amp;quot;width:200px&amp;quot; colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot;| Datei &lt;br /&gt;
! style=&amp;quot;width:200px&amp;quot; colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot;| Sym. Link auf Datei&lt;br /&gt;
|-style=&amp;quot;background:silver&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
| atime || mtime || ctime || atime || mtime || ctime || atime || mtime || ctime&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | ls *&lt;br /&gt;
| X || .|| . || . || . || . || X || . || . &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | cat *&lt;br /&gt;
| X || . || . || X || . || . || X || . || . &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | find .&lt;br /&gt;
| X || . || . || . || . || . || . || . || . &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | grep Begriff *&lt;br /&gt;
| X || . || . || X || . || . || X || . || .&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | echo &amp;quot;neue Zeile&amp;quot; &amp;gt;&amp;gt; Datei &lt;br /&gt;
| . || . || . || . || X || X || - || - || -  &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | echo &amp;quot;neue Zeile&amp;quot; &amp;gt;&amp;gt; SymLink &lt;br /&gt;
| X || . || . || . || X || X || X || . || . &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | mv  Datei Datei_1&lt;br /&gt;
| . || X || X || . || . || X || . || . || X &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | ln  Datei Datei_1&lt;br /&gt;
| . || X || X || . || . || X || - || - || - &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | chmod 777 Datei&lt;br /&gt;
| . || . || . || . || . || X || - || - || - &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | chown user1 Datei&lt;br /&gt;
| . || . || . || . || . || X || . || . || X &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | tar -cf ../Archiv.tar ./ &lt;br /&gt;
| X || . || . || X || . || . || X || . ||.  &lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot; | tar -xf ../Archiv.tar  &lt;br /&gt;
| X || . || X || X || . || X || X || X || X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Befehle rund um Zeitstempel ==&lt;br /&gt;
=== Zeitstempel der Dateien anzeigen mit stat ===&lt;br /&gt;
Der Befehl '''stat''' ohne Optionen kann alle Zeitstempel und alle anderen Informationen einer Datei auflisten. Siehe dazu auch das dokumentierte Beispiel unter [[Inode]]. Es ist aber auch möglich die Ausgabe von '''stat''' nach seinen eigenen Vorstellungen zu formatieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Folgender Befehl listet die Dateinamen und die Zeitstempel aller Dateien im Verzeichnis auf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
stat -c &amp;quot;Filename : %n&lt;br /&gt;
atime    : %x&lt;br /&gt;
mtime    : %y&lt;br /&gt;
ctime    : %z&lt;br /&gt;
&lt;br /&gt;
&amp;quot; * &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Format der Ausgabe dieses Befehles für jede Datei &lt;br /&gt;
 Filename : test&lt;br /&gt;
 atime    : 2006-11-03 18:17:42.764670001 +0100&lt;br /&gt;
 mtime    : 2006-10-25 20:42:55.000000000 +0200&lt;br /&gt;
 ctime    : 2006-10-25 20:42:55.000000000 +0200&lt;br /&gt;
 &lt;br /&gt;
genaue Beschreibungen aller Optionen und weitere Möglichkeiten zeigt die [http://man.splitbrain.org/stat Manpage von stat]&lt;br /&gt;
&lt;br /&gt;
=== Zeitstempel der Dateien anzeigen mit ls ===&lt;br /&gt;
Der Befehl [http://man.splitbrain.org/ls '''ls'''] ( Verzeichnisinhalte anzeigen ) zeigt in der default Einstellung in Verbindung mit der Option '''-l''' immer die mtime der Dateien an. Aber der ls-Befehl kann noch viel mehr. Die Option '''-t''' sortiert die Verzeichnisseinträge nach der Zeit und in Verbindung mit der Option '''-r''' kann die Sortierreihenfolge auch jeweils umgekehrt werden.&lt;br /&gt;
Neben der mtime kann der ls-Befehl aber auch die anderen beiden Zeitstempel anzeigen und auch die Verzeichniseinträge nach diesen Zeiten sortieren. Dafür zuständig sind die Optionen '''-u''' bei der die atime der Dateien verwendet wird, und die Option '''-c''' bei der die ctime zur Geltung kommt. In neueren Versionen des ls-Befehls können auch die Ausgaben der Zeiten analog dem Formatierungsmöglichkeiten von [http://man.splitbrain.org/date '''date'''] mittels der Option '''--time-style=''' formatiert werden. Überblick über die gesamten Optionen und Möglichkeiten gibt die [http://man.splitbrain.org/ls ManPage von ls]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zeitstempel ändern mit touch ===&lt;br /&gt;
Der Befehl [http://man.splitbrain.org/touch touch] bietet die Möglichkeit die atime und die mtime der Dateien zu manipulieren. Per default (ohne andere Optionen) setzt touch für alle Zeitstempel die aktuelle Zeit, ist eine Datei nicht vorhanden wird eine leere normale Datei angelegt. Über die Optionen '''-t''' oder '''-d''' können beliebige Zeiten bestimmt werden, auf die die Zeitstempel gesetzt werden sollen. Auch ist es über die Option '''-r''' möglich eine Referenzzeit einer anderen Datei auszuwählen. Mittels der Optionen '''-a''' und  '''-m''' ist es möglich nur die atime oder nur die mtime mit touch neu zu setzen. &lt;br /&gt;
'''In allen Fällen wird die ctime immer auf das aktuelle Datum gesetzt.''' &lt;br /&gt;
Überblick über die gesamten Optionen und Möglichkeiten git die [http://man.splitbrain.org/touch Manpage von touch].  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateien anhand der Zeitstempel suchen mit find ===&lt;br /&gt;
Der Befehl '''find''' hat eine Vielzahl von Optionen mit deren Hilfe man Dateien finden kann, darunter auch einige mit denen Dateien nach den 3 Zeitstempeln gesucht werden können. Im folgenden ein Auszug aus der [http://man.splitbrain.org/find ManPage von find] der diese Optionen beschreibt.&lt;br /&gt;
{|&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width:200px&amp;quot;|'''-amin''' ''N''&lt;br /&gt;
|auf die Datei ist vor '''''N''''' Minuten zugegriffen worden &lt;br /&gt;
|-&lt;br /&gt;
|'''-anewer''' ''Referenzdatei''&lt;br /&gt;
|auf die Datei ist vor weniger Zeit zugegriffen worden, als seit der letzten Veränderung der '''''Referenzdatei''''' vergangen ist&lt;br /&gt;
|-&lt;br /&gt;
|'''-atime''' ''N''&lt;br /&gt;
|auf die Datei ist vor '''''N*24''''' Stunden zugegriffen worden &lt;br /&gt;
|-&lt;br /&gt;
|'''-cmin''' ''N''&lt;br /&gt;
|der Status der Datei wurde vor '''''N''''' Minuten geändert &lt;br /&gt;
|-&lt;br /&gt;
|'''-cnewer''' ''Referenzdatei''&lt;br /&gt;
|    der Status der Datei wurde vor weniger Zeit verändert, als seit der letzten Veränderung der '''''Referenzdatei''''' vergangen ist&lt;br /&gt;
|-&lt;br /&gt;
|'''-ctime''' ''N''&lt;br /&gt;
|der Dateistatus wurde vor '''''N*24''''' Stunden geändert&lt;br /&gt;
|-&lt;br /&gt;
|'''-mmin''' ''N''&lt;br /&gt;
|der Inhalt der Datei wurde vor '''''N''''' Minuten verändert &lt;br /&gt;
|-&lt;br /&gt;
|'''-mtime''' ''N''&lt;br /&gt;
|der Inhalt der Datei wurde vor '''''N*24''''' Stunden verändert &lt;br /&gt;
|-&lt;br /&gt;
|'''-newer''' ''Referenzdatei''&lt;br /&gt;
|die Datei ist später verändert worden als die '''''Referenzdatei'''''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dabei können die numerischen  Argumente '''N'''  auf drei Arten angegeben werden:&lt;br /&gt;
{|&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|style=&amp;quot;width:80px&amp;quot;  align=&amp;quot;center&amp;quot; | '''+ N'''&lt;br /&gt;
|wird interpretiert &amp;quot;alle Zahlen größer als N&amp;quot; &lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|align=&amp;quot;center&amp;quot; | '''- N'''&lt;br /&gt;
|wird interpretiert &amp;quot;alle Zahlen kleiner als N&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; &lt;br /&gt;
|align=&amp;quot;center&amp;quot; | '''N'''&lt;br /&gt;
|wird interpretiert &amp;quot;genau N&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Hier einige praktische Beispiele:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;find /tmp ! -type d -atime +20 -user USER1 2&amp;gt;/dev/null &amp;lt;/pre&amp;gt;&lt;br /&gt;
findet unterhalb /tmp alle Dateien die kein Verzeichnis sind und seit über 20 Tagen nicht mehr angefasst wurden und dem Benutzer USER1 gehören&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;find /home/USER1  -type f -mmin -20 -user USER1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
findet alle normalen Dateien unterhalb vom Homeverzeichnis von USER1 die innerhalb der letzten 20 Minuten geändert wurden und dem User USER1 gehören&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;find /etc -cnewer /etc/fstab 2&amp;gt;/dev/null&amp;lt;/pre&amp;gt;&lt;br /&gt;
findet alle Dateien unterhalb /etc deren ctime nach der letzten Änderung (mtime) der /etc/fstab  geändert wurde&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== tar und Zeitstempel ===&lt;br /&gt;
Der Befehl '''[http://man.splitbrain.org/tar tar]''' ('''T'''ape '''AR'''chiver) bezeichnet ein Programm mit dessen Hilfe einfache Backup-, Archivierungs und ähnliche -Arbeiten am System gemacht werden können. Wenn wir unter LINUX von '''tar''' sprechen, meinen wir damit eigentlich eine '''GNU implementierung''' eines unter UNIX als tar bezeichneten Befehls. Man bezeichnet das Programm deshalb auch auf anderen Systemen '''GNUtar oder gtar'''. Die beiden Programme (UNIX tar und GNU tar) sind nur bedingt kompatibel. Daneben existieren noch mehrere mit TAR verwandte Implementationen die mehr oder weniger viele Erweiterungen und Verbesserungen beinhalten, und oft noch weniger kompatibel zu ihren Urprogrammen sind.&lt;br /&gt;
&lt;br /&gt;
Die Stärke von tar liegt in der einfachen und universellen Benutzung, eine der historisch gewachsenen Schwächen von tar, ist der Umgang mit Zeitstempeln. Mit tar läßt sich nur die mtime wieder herstellen. Die atime und die ctime werden zerstört und durch die aktuelle Zeit beim Restore ersetzt. Moderne Versionen von tar haben eine Option, um mittels der mtime inkrementelle Backups machen zu können. Eine weitere Option von tar ermöglicht es beim Erstellen des Archives die atime, (welche durch das Lesen der Dateien beim Erstellen des Archives verändert würde,) vor Veränderung zu schützen, allerdings mit der Nebenwirkung, dass damit analog zum touch-Befehl, die ctime der oginalen Dateien zerstört wird.&lt;br /&gt;
&lt;br /&gt;
Damit ist tar durchaus noch geeignet um einfache Backupaufgaben zu übernehmen, und ein Linuxsystem aus einem Tar-Archiv wird sicherlich ohne Probleme funktionieren, allerdings die gehobenen Anspüche die heute an ein modernes Backupprogramm gestellt werden, kann tar damit nicht erfüllen. Die Hauptbedeutung und der Haupteinsatz von GNUtar ist heute deshalb auch mehr im Bereich der Verteilung und Verbreitung von Softwarepaketen zu finden. Den Umfang und die Funktionen können der [http://man.splitbrain.org/tar ManPage von tar] entnommen werden.&lt;br /&gt;
&lt;br /&gt;
== Backup und Zeitstempel ==&lt;br /&gt;
Zeitstempel spielen beim Backup eine besondere Rolle, zum Einem möchte man bei vielen Backupaufgaben bei der Wiederherstellung der Dateien aus dem Backuparchiv die alten Zeitstempel wieder haben, zum anderen benötigt man z.B. bei [[inkrementelles Backup|inkrementellen Backups]] die Zeitstempel der Dateien, um herauszufinden, ob sich die Datei seit dem letztem Backup geändert hat und somit jetzt in das inkrementelle Backup mit aufgenommen werden muss. Und nicht zu guter Letzt, gibt es auch Backup Methoden bei denen einzelne Dateien innerhalb eines Backuparchives gezielt ausgetauscht werden, wenn sie sich seit dem Erstellen des Backups geändert haben, oder in der Zwischenzeit neu hinzu gekommen sind, müssen sie natürlich jetzt in das Archiv aufgenommen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Anlegen eines Backups werden die Dateien ausgelesen, durch dieses Auslesen wird im Normalfall die atime dieser Dateien neu gesetzt. Dieses hätte jedoch zur Folge, dass in einem so gesicherten Verzeichnis nicht nach den Dateien gesucht werden könnte, auf die schon länger nicht mehr zugegriffen worden ist, um sie z.B. zu löschen. Aus diesem Grund haben die meisten Backupprogramme spezielle Optionen, die das setzen der atime beim Backup verhindern. Dieses kann aber nur dadurch erreicht werden, dass nach dem die Datei ausgelesen wurde, die alte atime wieder neu gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
Der touch-Befehl und viele andere Programme (auch tar) mit denen die Zeitstempel in den [[Inode]] manipuliert werden können, nutzen den Systembefehl [http://man.splitbrain.org/utime(2) utime] dafür. Bei diesen Befehlen wird beim zurücksetzen der atime auf den alten Wert, die ctime zerstört und auf die aktuelle Zeit gesetzt. Das hat dann die Konsequenz, das nach einem Backup dann in diesem Verzeichnis zwar nach Dateien gesucht werden kann, auf die lange nicht zugegriffen wurde, aber nicht mehr nach Dateien gesucht werden kann, bei denen in der letzten Zeit die ctime verändert wurde. Auch kann mit solchen Backupprogrammen nur die atime und die mtime der Dateien wieder hergestellt werden, die ctime wird auf eine Zeit des Zurückspielens der Sicherung gesetzt.  &lt;br /&gt;
&lt;br /&gt;
Bei inkrementellen Backups stellt sich die Frage, sollen die Dateien nach der mtime oder der ctime beurteilt werden. Wird die Datei nach der Änderung der mtime beurteilt, dann sind dort sämtliche Änderungen am Inhalt dieser Datei für das Backup berücksichtigt, jedoch nicht, z.B. eventuelle vorgenommene Änderungen an den Besitz- oder Zugriffsrechten. Einige Backupkonzepte ermöglichen  die Wahl zwischen beiden Varianten, einige Programme unterstützen jedoch nur die Suche nach dem geänderten mtime Zeitstempel.&lt;br /&gt;
&lt;br /&gt;
Gelegentlich ein kleines Problem sind die Zeitstempel der [[Directory|Verzeichnisse]]. Wird z.B. zuerst das Verzeichnis aus dem Backup gewonnen, dann können die gespeicherten Zeitstempel aus dem Backup zwar gesetzt werden, wenn jedoch anschließend noch die Dateien aus diesem Verzeichnis hineingepackt werden, dann sind die Zeitstempel der Verzeichnisse wieder auf dem Zeitpunkt des Auspackens der letzten Datei in diesem Directory gesetzt und nicht wie gewünscht, die vom gesicherten Verzeichnis.      &lt;br /&gt;
&lt;br /&gt;
Von Bedeutung für manche Anwendungen ist auch die Genauigkeit mit der die Zeitstempel in den Headerdateien des Backups abgelegt werden können, während für einige Anwendungen durchaus eine Genauigkeit von 1 Sekunde ausreicht, benötigen andere Backupkonzepte eventuell eine Genauigkeit von 1/1000 Sekunde. &lt;br /&gt;
&lt;br /&gt;
Aus diesen Ausführungen sollte jetzt erkennbar sein dass es zwischen Backup und Zeitstempel eine doch recht vielschichtige Wechselwirkung gibt, die sich oftmals nur mit der Wahl des für diesen Zweck geeigneten Backupprogramms und den richtigen Einstellungen und Optionen lösen lässt. Wem die Möglichkeiten z.B. von  tar in Bezug auf die Zeitstempel nicht ausreichen und wer eventuell auch noch weitere Features wie z.B. [[Zugriffsrechte#Access Control Lists unter Linux|ACL-Unterstützung]] benötigt, dem sei an dieser Stelle ein Blick in die [http://man.splitbrain.org/star ManPage von star] empfohlen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Robi|Robi]] 13:25, 4. Nov 2006 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux-intern]]&lt;br /&gt;
[[Category:Konsole]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Benutzer_Diskussion:TomcatMJ&amp;diff=28992</id>
		<title>Benutzer Diskussion:TomcatMJ</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Benutzer_Diskussion:TomcatMJ&amp;diff=28992"/>
		<updated>2013-03-26T15:28:48Z</updated>

		<summary type="html">&lt;p&gt;Itu: Neuer Abschnitt /* Redir */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo Tom,&lt;br /&gt;
&lt;br /&gt;
Ich habe gesehen, dass Du vor kurzem angefangen hast, Dich an dem Linux-Club Wiki zu beteiligen. Weil deine Diskussionsseite aber noch leer ist, möchte ich Dich kurz begrüßen.&lt;br /&gt;
&lt;br /&gt;
Für den Einstieg empfehle ich dir das '''[[LinuxClub:Hilfe|Hilfe]]''' und '''[http://de.wikipedia.org/wiki/Wikipedia:Wie_schreibe_ich_gute_Artikel Wie schreibe ich gute Artikel]'''. Wenn Du neue Artikel anlegen willst, kannst Du Dich an anderen des selben Themenbereichs orientieren. Ganz wichtig sind dabei stets [[LinuxClubWiki:Quellenangaben|Quellenangaben]], welche deine Bearbeitung belegen.&lt;br /&gt;
Wenn Du erstmal etwas ausprobieren willst, ist [[LinuxClubWiki:Spielwiese|hier]] Platz dafür. Bitte beachte, dass das Linux-Club Wiki [[LinuxClubWiki:Was LinuxClubWiki nicht ist|ausschließlich der Erstellung einer Wissensdatenbank um Linux]] dient und zur Zusammenarbeit ein [[LinuxClubWiki:Wikiquette|freundlicher Umgangston]] notwendig ist. &lt;br /&gt;
&lt;br /&gt;
Fragen stellst Du am besten [[LinuxClubWiki:Fragen zur LinuxClubWiki|hier]], aber die meisten [[LinuxClubWiki:Die LinuxClubWikinger|Linux-Club Wikinger]] und auch ich helfen dir gerne. Solltest Du bestimmte Wörter oder Abkürzungen nicht auf Anhieb verstehen, schaue mal ins [[Hilfe:Glossar|Glossar]]. &lt;br /&gt;
&lt;br /&gt;
Wenn Du Bilder hochladen möchtest, achte bitte auf die korrekte Lizenzierung.&lt;br /&gt;
&lt;br /&gt;
Wikimitglieder, die sich besonders am Geschehen des Linux-Club Wikis beteiligen können sich im [http://www.linux-club.de/groupcp.php?g=31922&amp;amp;sid=5cdc726bb314ccaf7735b5c2e25d2be1 WikiTeam] anmelden. Vorraussetzung sind mindestens 5 sinnvolle Beiträge ins Wiki eingestellt zu haben.&lt;br /&gt;
&lt;br /&gt;
Ein Tipp für Deinen Einstieg in die Linux-Club Wiki: [[LinuxClubWiki:Sei mutig|Sei mutig]] und respektiere die Leistungen anderer User! Herzlich willkommen!&lt;br /&gt;
&lt;br /&gt;
Siehe hier: [[Vorlage:Hallo]]&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Yehudi|Yehudi]] 16:01, 18. Okt 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Montag ist Spiegeltag :o) ==&lt;br /&gt;
&lt;br /&gt;
Ne, ich hatte Griffin drum gebeten, das mal zu machen, um mal zu sehen, ob das so funktioniert, wie ich mir das vorgestellt habe. - Joop läuft.--[[Benutzer:Yehudi|Yehudi]] 15:50, 19. Okt 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Die neue Vorlage findet ja auch schon Verwendung ==&lt;br /&gt;
&lt;br /&gt;
Das ist ja klasse. Jetzt können bald alle ihr eigenes Profil nach Herzenslust einrichten. Und niemand mehr kann sage: &amp;quot;Ich habe es nicht gewußt.&amp;quot; :o) --[[Benutzer:Yehudi|Yehudi]] 17:40, 19. Okt 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
Klasse das hat ja doch noch mit einem kleinen Trick geklappt, so wie ich es mir eigentlich vorgestellt hatte. Danke --[[Benutzer:Yehudi|Yehudi]] 23:23, 20. Okt 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Eintrag löschen ? ==&lt;br /&gt;
&lt;br /&gt;
Unter http://www.linux-club.de/faq/Sources.list_OpenSUSE10.1.64 ,der erste oberer Beitrag kann doch gelöscht werden oder (Tomcat) ? Ist ja meines erachtens nicht mehr aktuell. Wenn doch belehrt mich eines Besseren ;)&lt;br /&gt;
:Naja,aktuell ist es in soweit noch, als daß es die Verzeichnisse da noch gibt auf dem gwdg-Server. Ob sie mitterweile repo-Metadaten enthaten weiss ich jedoch magels Apt-Nutzung nicht :-)...Aber da ja Yehudi schon eine wohl aktuellere Liste gebastelt hatte die ich dann reingepackt hatte ohne die vorrangegangene zu entfernen(hab die neue ja nicht selbst getestet) kann man sie durchaus löschen(steht ja dran daß da mal jemand was neueres getestetes reinpacken soll).....&lt;br /&gt;
&lt;br /&gt;
== Neue Kategorien ==&lt;br /&gt;
&lt;br /&gt;
Du hattest wohl heute einen Kater, deswegen die neuen Kategorien. Gefällt mir. Eventuell, kann man das sogar noch weiter aubauen. --[[Benutzer:Yehudi|Yehudi]] 23:05, 11. Mär 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Bei dem Wust an unkategorisierten Kategorien wards mal langsam Zeit...ich wollte das ja schon was länger mal angehen, aber hab halt heute auch den Nerv dazu gehabt das dann auch endich mal zu tun*g*. Siehe dazu auch  [http://www.linux-club.de/ftopic78171.html im Wiki-Team Forum]...--[[Benutzer:TomcatMJ|TomcatMJ]] 23:11, 11. Mär 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::Mittlerweile gibts hier ja nun auch den [[Kategorienbaum]] als eines der Ergebnisse des Kategoriesierungsarbeitsbergs.... --[[Benutzer:TomcatMJ|TomcatMJ]] 10:55, 4. Apr 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:::Ich habe das jetzt erst mal so im [[Kategorienbaum]] eingefügt, vermutlich meinst Du aber einer Unterteilung wie Hinweisbausteine --&amp;gt; Vorlagenboxen. So genau hatte ich mir keine Gedanken darüber gemacht, ich war halt der Meinung die ganzen Boxen zusammenzufassen, um sie leichter wiederzufinden. --[[Benutzer:Yehudi|Yehudi]] 11:08, 4. Apr 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Hinweise auf Fragen/Antworten/Diskussionen auf anderen Diskussionsseiten ==&lt;br /&gt;
&lt;br /&gt;
== Under Construction Baustein ==&lt;br /&gt;
Hall TomcatMJ,&lt;br /&gt;
&lt;br /&gt;
neulich hattest Du Dich bei einem anderen User zwecks dessen beschwert, dann solltest Du auch mit gutem Beispiel vorrangehen.&lt;br /&gt;
Leider ist der Sinn jetzt in dem Satz komplett weg, bzw liest sich der Satz in Klammern sehr merkwürdig. Hier wäre eigentlich eine Anmerkung auf der Diskussionsseite sinnvoller gewesen.&lt;br /&gt;
Der Memory Limit muss nur durch die Verwendung aller PlugIns so hoch sein. Hier wäre vielleicht noch mal zu kontrollieren, ob Du alle Plug Ins drin hast. &lt;br /&gt;
Hier läuft ein Joomla, typo3, mediawiki, Wordpress, serendipity, phpbb2. Das hatte vorher 16MB MemoryLimit, und kam dann nicht mit der Verdoppelung, und verdreifachung aus.&lt;br /&gt;
Ich passe das ganze mal etwas an.&lt;br /&gt;
--[[Benutzer:Yehudi|Yehudi]] 08:25, 5. Jun 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:Jap, mea Culpa....sorry, ich war wohl letzte Nacht doch etwas arg voreilig mit der Ergänzung nach dem Kickerspielfinanziertem Barbesuch*g*...allerdings hab ich da mit einem 64 MB Limit und allen Modulen von [[Gallery2]] in aktiviertem Zustand keinerlei Probleme im Zusammenspiel mit [[phpBB|phpBB2]], [[MediaWiki]], [[Drupal]], [http://www.k5n.us/webcalendar.php WebCalendar v1.0.4] und  [http://www.pjirc.com/main.php PJIRC] was ja auf meiner Community-Website so läuft....&lt;br /&gt;
:Bis denne, --[[Benutzer:TomcatMJ|TomcatMJ]] 14:57, 5. Jun 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::Bei der Installation/Konfiguration von [[Gallery2]] meckert der bei der Installation aller Module. Ich war auch ziemlich verwundert. --[[Benutzer:Yehudi|Yehudi]] 17:20, 5. Jun 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WikiSysop ==&lt;br /&gt;
&lt;br /&gt;
Der [[Benutzer:WikiSysop|WikiSysop]] entstand mehrere Male bei meiner Unterschrift( z.B. http://wiki.linux-club.de/wiki/index.php?title=Pdf&amp;amp;oldid=21191 ) . Aus dem Grunde habe ich eine Weiterleitung gemacht, und nicht aus irgendeinem anderen Grund. Alles andere wäre unangemessen. ;-) --[[Benutzer:Yehudi|Yehudi]] 00:00, 21. Aug. 2007 (CEST)&lt;br /&gt;
:siehe [[Benutzer Diskussion:Yehudi]] --[[Benutzer:Yehudi|Yehudi]] 04:49, 21. Aug. 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Was soll bitte das Wiedereinfügen von nicht zutreffender Info bei NVidia 3D-Desktops? ==&lt;br /&gt;
Für openSUSE 10.1 gibt es die angegeben Quellen bzw. Links nicht mehr. Es bringt nichts die wieder einzufügen. Das macht den Beitrag auch nicht besser. &lt;br /&gt;
--[[Benutzer:Wizzzard|Wizzzard]] 18:45, 22. Mai 2008 (CEST)&lt;br /&gt;
:Sorry, da war mir wohl vor dem Sync mit der Developmentversion des Wikibooks unter http://wiki.mosnis.dyndns.org/NVIDIA wohl die Änderung durch die Lappen gegangen die ich normalerweise erstmal dort auch noch integriert hätte durch entsprechenden export hier aus diesem Wiki bevor das Ganze mit der Dev. Version komplett gesynct wurde. Von dahr wars keine Absichtiche Änderung sondern die Übernahme der hiesigen änderung ist mir schlichtweg aus Versehen durch die Lappen gegangen. Die von dir gemachte Änderung wird natürlich im Laufe des Freitags spätestens (wieder) eingebaut werden in beiden Wikibook-Versionen. --[[Benutzer:TomcatMJ|TomcatMJ]] 22:29, 22. Mai 2008 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Redir ==&lt;br /&gt;
&lt;br /&gt;
[http://www.linupedia.org/opensuse/Mount Das] funktioniert nicht, sondern nur wikiintern. --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 16:28, 26. Mär. 2013 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Rsync&amp;diff=28985</id>
		<title>Rsync</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Rsync&amp;diff=28985"/>
		<updated>2013-03-23T21:49:48Z</updated>

		<summary type="html">&lt;p&gt;Itu: Beleg dass diese Aussage gerechtfertigt ist?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Software|&lt;br /&gt;
 Name= rsync&amp;lt;br /&amp;gt;[[Bild:rsync.png|240px]]&lt;br /&gt;
|Screenshot= &lt;br /&gt;
|Beschreibung= &lt;br /&gt;
|Hersteller= Samba Team&lt;br /&gt;
|AktuelleVersion= 2.6.3&lt;br /&gt;
|AktuelleVersionFreigabeDatum= &lt;br /&gt;
|Betriebssystem= Linux, Unix, OS X &lt;br /&gt;
|Kategorie= [[Backup]]&lt;br /&gt;
|Lizenz= [[GPL]]&lt;br /&gt;
|Deutsch = ja&lt;br /&gt;
|Website= http://samba.anu.edu.au/rsync/&lt;br /&gt;
}}&lt;br /&gt;
Autor: [http://www.linux-club.de/faq/Benutzer:Yehudi Yehudi]&lt;br /&gt;
{{Box Test||&lt;br /&gt;
* [[openSUSE]] 10.3&lt;br /&gt;
* [[openSUSE]] 10.2&lt;br /&gt;
* SUSE Linux 10.0&lt;br /&gt;
* [[Ubuntu]] 6.10&lt;br /&gt;
* [[Fedora]] 6, 7, 8&lt;br /&gt;
}}&lt;br /&gt;
{{Box Wissen||&lt;br /&gt;
* Unterschied zwischen [[Paketmanager]]n&lt;br /&gt;
* Umgang mit [[YaST]], [[APT]] oder [[smart]]&lt;br /&gt;
* Umgang mit der [[shell]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einführung ==&lt;br /&gt;
&lt;br /&gt;
''rsync'' ist ein Netzwerkprotokoll, welches unter [[GPL]] steht. Das Programm ist für [[Backup]]s bestens geeignet (Kopien von A nach B). Werden auf B Daten geändert, so können diese nicht abgegeglichen werden. Sind bei einem [[Backup]] Daten mit der selben Zeitangabe vorhanden, werden diese nicht überschrieben, was Zeit spart. Das Backup-Programm wurde von Entwicklern des [[Samba]]-Team, u.a. von '''Paul Mackeras''' und '''Andrew Tridgell''', programmiert.&lt;br /&gt;
&lt;br /&gt;
Das Tool kann auch mit [[SSH]] kombiniert werden.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu [[cp]], welches man zum Kopieren auf der [[Konsole]]n nutzen kann, bietet rsync zahlreiche Steuerungsmöglichkeiten, die unter [[cp]] nicht vorhanden sind. [[cp]] würde z.B. bereits vorhandene Dateien erneut kopieren.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Ich setze einfach eine Installation mit [[APT]] oder [[smart]] vorraus. Dann muss sich nur noch als [[root]] in der [[Konsole]] angemeldet werden und&lt;br /&gt;
&lt;br /&gt;
 apt-get install rsync&lt;br /&gt;
&lt;br /&gt;
oder &lt;br /&gt;
&lt;br /&gt;
 smart install rsync&lt;br /&gt;
&lt;br /&gt;
eingetippt werden.&lt;br /&gt;
&lt;br /&gt;
== Funktionen über die Konsole ==&lt;br /&gt;
&lt;br /&gt;
=== Optionen ===&lt;br /&gt;
&lt;br /&gt;
*''-a'' umfasst folgende Optionen (Die Option zu verwenden ist sinnvoll, da die Rechte im Ziel übereinstimmen sollten):&lt;br /&gt;
**''-r''    kopiert Unterverzeichnisse, lässt rsync rekursiv arbeiten&lt;br /&gt;
**''-l''    kopiert symbolische Links&lt;br /&gt;
**''-p''    behält Rechte bei&lt;br /&gt;
**''-t''    behält Zeiten bei,&lt;br /&gt;
**''-g''    behält Gruppenrechte bei&lt;br /&gt;
**''-D''    behält Gerätedateien bei; nur root &lt;br /&gt;
*''-A''     ACLs erhalten&lt;br /&gt;
*''-H''     Hardlinks erhalten&lt;br /&gt;
*''-S''     Dateien &amp;quot;mit Löchern&amp;quot; effizient handhaben&lt;br /&gt;
*''-X''     Xattrs erhalten&lt;br /&gt;
*''-v''     zeigt beim Kopieren alle Schritte, die gerade ausgeführt werden, an&lt;br /&gt;
*''-n''     simuliert den Kopierauftrag, trocke''n'' - ein Testlauf, der nichts wirklich kopiert&lt;br /&gt;
*''-z''     komprimiert den Datentransfer&lt;br /&gt;
*''-e''     hiermit lässt sich die Remote-Shell wählen, welche per Default SSH ist; andere lassen sich per &amp;lt;code&amp;gt;-e programm&amp;lt;/code&amp;gt; angeben&lt;br /&gt;
*''-b''     Backups werden erstellt&lt;br /&gt;
*''-u''     update - Dateien, die im Backup schon vorhanden und neuer als auf der Quelle sind, werden ausgelassen&lt;br /&gt;
*''-v''     verbose - Gibt einen genauen Verlauf, insbesondere wenn Fehler auftauchen&lt;br /&gt;
*''--backup-dir=Verzeichnis'' ;kann ein Verzeichnis angeben werden&lt;br /&gt;
*''--progress'' Hier wird der Fortschritt während der Übertragung angezeigt&lt;br /&gt;
*''--delete''  Dateien, die auf der Quelle nicht mehr existieren, werden auch auf dem Ziel gelöscht.&lt;br /&gt;
*''--exclude=Verzeichnis''  Damit werden Verzeichnisse von dem Kopiervorgang ausgeschlossen&lt;br /&gt;
*''--size-only'' Hiermit kontrolliert rsync beim &amp;quot;Synchronisieren&amp;quot; nur die Dateigröße, was hilfreich ist, wenn der Zeitstempel der Zieldateien nicht mit den Quellstempeln übereinstimmen.&lt;br /&gt;
&lt;br /&gt;
Alle Optionen und eine Erläuterung ist mit man rsync oder rsync -h aufzurufen.&lt;br /&gt;
&lt;br /&gt;
=== Verwendung ===&lt;br /&gt;
&lt;br /&gt;
Vereinfacht:&lt;br /&gt;
 rsync quelle ziel&lt;br /&gt;
&lt;br /&gt;
Die Befehlsformel für rsync sieht wie folgt aus:&lt;br /&gt;
 rsync -OPTIONEN QUELLE ZIEL&lt;br /&gt;
&lt;br /&gt;
Ziel und Quelle sind dabei unabhängig vom Rechner, so dass das BackUp im Rechner auf der gleichen, auf einer anderen Festplatte, im eigenen Netzwerk oder im Internet vorgenommen werden kann. &lt;br /&gt;
&lt;br /&gt;
 rsync -OPTIONEN foo:/home/secureme baa:/home/backup&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Box Hinweis||Wird bei einem Quellordner mit einem &amp;quot;/&amp;quot; beendet, wird lediglich der Inhalt des Ordners kopiert, nicht aber der Quellordner selbst}}&lt;br /&gt;
&lt;br /&gt;
'''Spiegeln von Ordnern'''&lt;br /&gt;
&lt;br /&gt;
 rsync -abuv --delete --progress /home/yehudi/  /data1/home/yehudi&lt;br /&gt;
oder &lt;br /&gt;
 rsync -arbuv --delete --progress /home/yehudi/  /data1/home/yehudi&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;data1&amp;lt;/code&amp;gt; ist die 2. Festplatte eingebunden, auf der bei mir auch ein SUSE Linux 10.0 wie auf der ersten Festplatte installiert ist.&lt;br /&gt;
&lt;br /&gt;
== Syntaxen zum Übertragen == &lt;br /&gt;
&lt;br /&gt;
=== Allgemeine Syntax ===&lt;br /&gt;
&lt;br /&gt;
 rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST                # lokale Quelle --&amp;gt; remote Ziel&lt;br /&gt;
 rsync [OPTION]... [USER@]HOST:SRC DEST                         # remote Quelle --&amp;gt; lokales Ziel&lt;br /&gt;
 rsync [OPTION]... SRC [SRC]... DEST                            # nur lokal&lt;br /&gt;
 rsync [OPTION]... [USER@]HOST::SRC [DEST]                      &lt;br /&gt;
 rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST&lt;br /&gt;
 rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]&lt;br /&gt;
 rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST&lt;br /&gt;
&lt;br /&gt;
=== Auflistung von Dateien ===&lt;br /&gt;
&lt;br /&gt;
Hiermit wird der Inhalt des Verzeichnisses dem Host aufgeführt:&lt;br /&gt;
&lt;br /&gt;
 rsync irgend.ein.host:/daten&lt;br /&gt;
&lt;br /&gt;
=== Anwendung im Netzwerk ===&lt;br /&gt;
&lt;br /&gt;
Mit folgender Befehlssyntax werden alle Files des aktuellen Verzeichnisses, die mit &amp;lt;code&amp;gt;.c&amp;lt;/code&amp;gt; enden auf die Remote-Maschine nach &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; übertragen:&lt;br /&gt;
&lt;br /&gt;
 rsync *.c irgend.ein.host:src/&lt;br /&gt;
&lt;br /&gt;
Hier wird der letzte Ordner übertragen (im Ziel ist das dann &amp;lt;code&amp;gt;/daten/dir&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 rsync -azv /src/dir irgend.ein.host:/daten&lt;br /&gt;
&lt;br /&gt;
So wird nur der Inhalt des Ordner &amp;lt;code&amp;gt;dir&amp;lt;/code&amp;gt; übertragen, aber der Ordner selbst nicht.&lt;br /&gt;
&lt;br /&gt;
 rsync -azv /src/dir/ irgend.ein.host:/daten&lt;br /&gt;
&lt;br /&gt;
Übertragung mit User und Port:&lt;br /&gt;
&lt;br /&gt;
 rsync -azv /src/dir/ user@irgend.ein.host:9999/daten&lt;br /&gt;
&lt;br /&gt;
Klassisches Beispiel für das Sichern des eigenen Home-Verzeichnisses auf einem Server im Netz.&lt;br /&gt;
&lt;br /&gt;
 rsync -abuvz --delete --progress /home/me foobar.com:/backup/home/me&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 rsync -abuvz --delete --progress -e ssh /home/me foobar.com:/backup/home/me--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lokales Übertragen von Dateien ===&lt;br /&gt;
&lt;br /&gt;
 rsync -azv /src/dir /daten     # überträgt das Verzeichnis /src/dir komplett nach /daten&lt;br /&gt;
 rsync -azv /src/dir/ /daten    # überträgt nur den Inhalt&lt;br /&gt;
 rsync *.jpg /daten/bilder      # überträgt nur .jpg Dateien nach /daten/bilder&lt;br /&gt;
&lt;br /&gt;
= Backups automatisieren =&lt;br /&gt;
&lt;br /&gt;
Das Backup jedesmal von Hand auszuführen macht natürlich wenig Sinn, wer vergisst das nicht schon mal. Hier werden ein paar Wege davon beschrieben, wie man es am einfachsten lösen könnte.&lt;br /&gt;
&lt;br /&gt;
== halt.local ==&lt;br /&gt;
&lt;br /&gt;
Viele privat genutzte Maschinen werden abends ausgeschaltet. Hier bietet es sich an, rsync durch das Skript &amp;lt;code&amp;gt;/etc/init.d/halt.local&amp;lt;/code&amp;gt; aufzurufen. &amp;lt;code&amp;gt;halt.local&amp;lt;/code&amp;gt; wird jedesmal aufgerufen, wenn die Maschine heruntergefahren wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel Eintrag wenn man es in die Datei integriert:&lt;br /&gt;
&lt;br /&gt;
 #! /bin/sh&lt;br /&gt;
 #&lt;br /&gt;
 # Copyright (c) 2002 SuSE Linux AG Nuernberg, Germany.  All rights reserved.&lt;br /&gt;
 #&lt;br /&gt;
 # Author: Werner Fink &amp;lt;werner@suse.de&amp;gt;, 1998&lt;br /&gt;
 #         Burchard Steinbild, 1998&lt;br /&gt;
 #&lt;br /&gt;
 # /etc/init.d/halt.local&lt;br /&gt;
 #&lt;br /&gt;
 # script with local commands to be executed from init on system shutdown&lt;br /&gt;
 #&lt;br /&gt;
 # Here you should add things, that should happen directly before shutting&lt;br /&gt;
 # down.&lt;br /&gt;
 #&lt;br /&gt;
 rsync -abuv --delete --progress /opt/lampp /sicherung&lt;br /&gt;
 rsync -abuv --delete --progress /home /sicherung&lt;br /&gt;
&lt;br /&gt;
== Script ==&lt;br /&gt;
&lt;br /&gt;
Dieses Script ist regelmäßig über einen CronJob auszuführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
#   Scriptname         backup.sh (Backup mit rsync und KDE Dialogen)&lt;br /&gt;
#   Funktion         Backup auf USB, PCMCIA oder 2. Festplatte erstellen&lt;br /&gt;
#                     oder einfach von Verzeichnis X nach Verzeichnis Y&lt;br /&gt;
#   benötigt            bash, KDE &amp;amp; rsync&lt;br /&gt;
#&lt;br /&gt;
#   Autor            Hermann Friedhoff&lt;br /&gt;
#                     Ungelsheimerstr. 81&lt;br /&gt;
#                     47259 Duisburg&lt;br /&gt;
#&lt;br /&gt;
#   Programm-Status      noch in Arbeit ( wer wird schon fertig??? )&lt;br /&gt;
#   Bekannte Fehler      keine, oder??? ( Naubadi is pörfekt )&lt;br /&gt;
#   Start               25.07.2003&lt;br /&gt;
#   Stand               25.05.2005&lt;br /&gt;
#&lt;br /&gt;
#   Variablen:      $HOME      das Home Verzeichnis (vom System)&lt;br /&gt;
#                  $USER      der angemeldete Benutzer (vom System)&lt;br /&gt;
#                  para      Parameter für rsync, für Details &amp;quot;man rsync&amp;quot; in eine Shell eintippen&lt;br /&gt;
#                  log_datei   Textdatei mit einer Auflistung der gesicherten Dateien&lt;br /&gt;
#                  idzb      Verzeichnis um zu testen ob das Zielverzeichnis beschreibbar ist&lt;br /&gt;
#                  quelle      das Verzeichnis das gesichert werden soll&lt;br /&gt;
#                  ziel      der Pfad für das zu sichernde Verzeichnis&lt;br /&gt;
#                  fehler      0 alles O.K und 1 ein Fehler ist aufgetreten&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
# bei folgenden 3 Variablen kann der Inhalt geändert werden&lt;br /&gt;
&lt;br /&gt;
log_datei=&amp;quot;Backup vom `date +'%d.%m.%y - %H:%M:%S'`.txt&amp;quot;&lt;br /&gt;
para=&amp;quot;-av&amp;quot;&lt;br /&gt;
idzb=&amp;quot;.test_idzb.tmp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ab hier sind keine Änderungen mehr erforderlich&lt;br /&gt;
&lt;br /&gt;
quelle=&amp;quot;&amp;quot;&lt;br /&gt;
ziel=&amp;quot;&amp;quot;&lt;br /&gt;
fehler=&amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if quelle=`kdialog --title &amp;quot;Zu sicherndes Verzeichnis auswählen&amp;quot; --getexistingdirectory &amp;quot;$HOME&amp;quot; &amp;quot;*&amp;quot;`&lt;br /&gt;
  then&lt;br /&gt;
  if ziel=`kdialog --title &amp;quot;Verzeichnis zum sichern auswählen&amp;quot; --getexistingdirectory &amp;quot;$HOME&amp;quot; &amp;quot;*&amp;quot;`&lt;br /&gt;
    then&lt;br /&gt;
    if [ -f /usr/bin/rsync ]&lt;br /&gt;
      then&lt;br /&gt;
      rmdir`date +'%d.%m.%y - %H:%M:%S'` &amp;quot;$ziel/$idzb&amp;quot; &amp;gt;/dev/null&lt;br /&gt;
      if mkdir &amp;quot;$ziel/$idzb&amp;quot; &amp;gt;/dev/null&lt;br /&gt;
        then&lt;br /&gt;
        rmdir &amp;quot;$ziel/$idzb&amp;quot; &amp;gt;/dev/null&lt;br /&gt;
        fehler=0&lt;br /&gt;
        echo &amp;quot;Backup von $quelle&amp;quot; &amp;gt; &amp;quot;$ziel/$log_datei&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; &amp;quot;$ziel/$log_datei&amp;quot;&lt;br /&gt;
        if ! rsync $para &amp;quot;$quelle&amp;quot; &amp;quot;$ziel&amp;quot; &amp;gt;&amp;gt; &amp;quot;$ziel/$log_datei&amp;quot;&lt;br /&gt;
        then&lt;br /&gt;
          kdialog --error &amp;quot;Beim Backup von $quelle nach $ziel ist ein Fehler aufgetreten.&amp;quot;&lt;br /&gt;
          fehler=1&lt;br /&gt;
        fi&lt;br /&gt;
        if [ &amp;quot;$fehler&amp;quot; = &amp;quot;0&amp;quot; ]&lt;br /&gt;
        then&lt;br /&gt;
          kdialog --msgbox &amp;quot;Fertig, Backup von $quelle nach $ziel wurde erstellt.&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
          kdialog --error &amp;quot;Fehler, Backup konnte nicht korrekt erstellt werden.&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
      else&lt;br /&gt;
        kdialog --error &amp;quot;Abbruch, schreiben auf $ziel nicht möglich.&amp;quot;&lt;br /&gt;
      fi&lt;br /&gt;
    else&lt;br /&gt;
      kdialog --error &amp;quot;Abbruch, das Programm /usr/bin/rsync fehlt.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
    kdialog --error &amp;quot;Abbruch, durch Benutzer $USER.&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
else&lt;br /&gt;
  kdialog --error &amp;quot;Abbruch, durch Benutzer $USER.&amp;quot;&lt;br /&gt;
fi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grafische Oberflächen zu rsync ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Bild:Grsync.png|[http://www.opbyte.it/grsync/ Grsync]&lt;br /&gt;
Bild:Grsync1.png|[http://www.opbyte.it/grsync/ Grsync]&lt;br /&gt;
Bild:Qsync.png|[http://transamrit.net/projects/qsync/ qsync]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unison ===&lt;br /&gt;
Eine weitere Möglichkeit, die sich unabhängig von dem Betriebssystem nutzen lässt wäre [[Unison]], welches eine &amp;quot;Syncronisation&amp;quot; über die Plattform hinweg ausführen.&lt;br /&gt;
&lt;br /&gt;
Das Programm ist hier näher beschrieben:&lt;br /&gt;
* http://wiki.ubuntuusers.de/Unison&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* Michael Kofler, Linux (7. Auflage)  S. 212&lt;br /&gt;
* [[l:Rsync]] {{Deutsch}}&lt;br /&gt;
* [[s:Backups]] {{Deutsch}}&lt;br /&gt;
* [[u:rsync]] {{Deutsch}}&lt;br /&gt;
* http://www.linux-club.de/viewtopic.php?t=31524 {{Deutsch}}&lt;br /&gt;
* [http://www.linux-magazin.de/Artikel/ausgabe/2004/09/backups/backups.html Snapshot-Backups mit Rsync] {{Deutsch}}&lt;br /&gt;
* [http://www.linux-magazin.de/Artikel/ausgabe/2002/04/rsync/rsync.html Server schnell und kostengünstig spiegeln] {{Deutsch}}&lt;br /&gt;
* http://www.linux-magazin.de/Service/Listings/2004/09/Rsyc-Backup/backup-rsync {{Deutsch}}&lt;br /&gt;
* http://www.linux-magazin.de/Service/Listings/2004/09/Rsyc-Backup/backup-rsync-konv {{Deutsch}}&lt;br /&gt;
* http://www.heinlein-support.de/web/wissen/rsync-backup/{{Deutsch}}&lt;br /&gt;
* [http://www.jdmz.net/ssh/ Using Rsync and SSH] {{Englisch}}&lt;br /&gt;
* [[w:Rsync]] {{Deutsch}}&lt;br /&gt;
* [http://rsync.samba.org/ Homepage von rsync] {{Englisch}}&lt;br /&gt;
* http://www.debianadmin.com/rsync-backup-web-interfacefrontend-or-gui-tools.html#more-144 {{Englisch}}&lt;br /&gt;
* [http://archive.macosxlabs.org/rsyncx/rsyncx.html rsync mit OSX] {{Englisch}}&lt;br /&gt;
* [http://www.andre-aulich.de/perm/backups-mit-rsyncx rsync mit OSX] {{Deutsch}}&lt;br /&gt;
* [http://www.cis.upenn.edu/~bcpierce/unison/ Webpräsenz von Unison] {{Englisch}}&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Rsync:en:Rsync Mehr Informationen zu rsync unter Windows in der englischen Wikipedia] {{Englisch}}&lt;br /&gt;
* http://www.debianhelp.co.uk/rsyncweb.htm {{Englisch}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Backup|Back To Backup]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File-Server|zurück zu File-Server]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Konsole|zurück zur Konsole]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[LAMP|zurück zum LAMP]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Category:File Server]][[Category:Security]][[Category:Konsole]][[Category:LAMP]][[Category:Backup]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Welche_Ports_sind_an_meinem_Server_offen&amp;diff=28975</id>
		<title>Welche Ports sind an meinem Server offen</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Welche_Ports_sind_an_meinem_Server_offen&amp;diff=28975"/>
		<updated>2013-02-28T16:35:36Z</updated>

		<summary type="html">&lt;p&gt;Itu: ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: [[Benutzer:framp|framp]], [[Benutzer:stka|stka]]&lt;br /&gt;
&lt;br /&gt;
Das flexibelste und universellste Tool zum Pruefen ist nmap ( http://www.insecure.org/nmap/ )&lt;br /&gt;
&lt;br /&gt;
Gibt es sowohl fuer Linux als auch Windows.&lt;br /&gt;
&lt;br /&gt;
Achtung: Dieser Test muss von einem anderen Rechner als dem zu testenden Server gemacht werden!&lt;br /&gt;
&lt;br /&gt;
*Test aller TCP Ports: nmap -v ipAdressesDesServers&lt;br /&gt;
&lt;br /&gt;
*Test eines TCP Ports: nmap -v -z ipAddresseDesServers portDesServers oder telnet ipAddresseDesServers portDesServers&lt;br /&gt;
&lt;br /&gt;
*Test aller [[UDP]] Ports (aus technischen Gruenden langsam): nmap -v -sU ipAddresseDesServers&lt;br /&gt;
&lt;br /&gt;
*Test eines UDP Ports: nmap -v -z -u ipAddresseDesServers portDesServers&lt;br /&gt;
&lt;br /&gt;
Weitere info mit man nmap, denn es kann noch wesentlich mehr wie Portrangescannen, OS-Detection, und was das Herz sonst noch beliebt.&lt;br /&gt;
&lt;br /&gt;
Portcheckprogramme im Netz:&lt;br /&gt;
&lt;br /&gt;
*Heise: http://www.heise.de/security/dienste/portscan/&lt;br /&gt;
&lt;br /&gt;
*ShieldsUp: https://www.grc.com/&lt;br /&gt;
&lt;br /&gt;
*PortScan: http://www.port-scan.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
&lt;br /&gt;
[[Top 100 Network Security Tools]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
zu nmap gibt es auch ein schönes KDE Frontend, das die Arbeit erheblich erleichtert. Einfach mit &amp;quot;apt install knmap&amp;quot; installieren und ab gehts&lt;br /&gt;
&lt;br /&gt;
[[Category:Security]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Ddclient&amp;diff=28974</id>
		<title>Ddclient</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Ddclient&amp;diff=28974"/>
		<updated>2013-02-15T06:22:26Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autoren: [http://www.yehudi.de Yehudi] &amp;amp;  [http://www.linux-club.de/faq/Benutzer:TomcatMJ TomcatMJ]&lt;br /&gt;
&lt;br /&gt;
{{Box Test||&lt;br /&gt;
* [[openSUSE]] 10.3&lt;br /&gt;
* [[openSUSE]] 10.2&lt;br /&gt;
* SUSE Linux 10.0&lt;br /&gt;
* SUSE Linux 9.3&lt;br /&gt;
}}&lt;br /&gt;
Wer die SuFu&amp;lt;!-- was? --&amp;gt; verwendet hat, der wird wahrscheinlich festgestellt haben, dass er sich durch zig Einträge kämpfen muss, und seine Konfiguration trotzdem nicht funktioniert. Also werde ich hier ein recht kurzes HOWTO anlegen, welches gerne erweitert werden kann, da es immer Einzelfälle gibt, die nicht berücksichtigt worden sind.&lt;br /&gt;
&lt;br /&gt;
=Über ddclient selbst=&lt;br /&gt;
&lt;br /&gt;
Das im Titel aus technischen Gründen nicht komplett kleingeschriebene Perl-Programm ddclient dient als Daemon im Hintergrund gestartet dazu, einem DynDNS Serviceanbieter die Änderung der eigenen IP mitzuteilen, damit der dortige [[DHCP und DNS|DNS]]-Servereintrag entsprechend automatisch aktualisiert werden kann. Dieses kleine Hilfsprogramm wird heute von den meisten [[Linux Distributionen]] mitgeliefert, ist jedoch dort nicht immer auf dem aktuellsten Stand. Daher kann man es auch oft in alternativen Software-[[Paketmanager|Repositories für diverse Paketmanager]] in aktuelleren Versionen finden, z.B. für openSUSE im Guru-Repository oder sich bei den meisten DynDNS-Anbietern auch über die dortige Liste der unterstützten IP-Abgleich-Clients als Tarball herunterladen um es dann manuell zu installieren.&lt;br /&gt;
== Installation von ddclient ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Woher nun ddclient nehmen? Wenn man [[openSUSE]] hat, gibt es den Weg dieses Programm über [[YaST]] von der DVD/CD zu installieren, oder die schnellere Möglichkeit, über apt/Synaptic das Programm recht schnell zu installieren. Bei [[Debian]] oder damit verwandten [[Linux Distributionen]] sollte das auch über apt gehen.&lt;br /&gt;
&lt;br /&gt;
Über die grafischen Oberflächen braucht einfach nur &amp;quot;ddclient&amp;quot; eingegeben werden oder in der [[Konsole]] als [[root]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 apt-get install ddclient&lt;br /&gt;
oder&lt;br /&gt;
 smart install ddclient&lt;br /&gt;
&lt;br /&gt;
eingeben und auf Enter drücken.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man sich auch den tarball von http://ddclient.sourceforge.net herunterladen und gemäß dem beiliegenden Readme-File in den beannten Pfad des Systems kopieren und konfigurieren und dann ebenso nutzen wie die per DPKG/RPM/APT/smart/YaST instalierte von dritten Personen fertig gepackte Version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Webadresse ==&lt;br /&gt;
&lt;br /&gt;
[[Bild:DynDNS.jpg|thumb|300px|right|Alle Angaben sind nur Beispiele, um einen eigenen Acount anzulegen!]]&lt;br /&gt;
Man braucht eine Adresse für seine Webseite, die auf dem eigenen Rechner im Apache liegt, und die zugewiesene IP ändert sich ständig, weil der genutzte  Provider in regelmäßigen Abständen, z. B. alle 24 Stunden, die Verbindung vom Netz trennt. Ein Script zur Wiedereinwahl und einen Cron-Job dafür ist vorhanden oder ddclient wird als daemon genutzt. Als Beispiel wird hier der DNS-Serviceprovider DynDNS.org aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Also geht man auf https://www.dyndns.com/ und legt einen Benutzernamen mit Passwort an.&lt;br /&gt;
Unter &amp;quot;Add Host Services&amp;quot; &amp;gt; &amp;quot;Add Dynamic DNS Host&amp;quot; wählt man sich einen Namen für die Webadresse aus. &lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;My Services&amp;quot; &amp;gt; runter scrollen &amp;gt; &amp;quot;Host Level Services&amp;quot; ist jetzt die gewählte Adresse zu finden. Dort klickt man auf den Link &amp;quot;Dynamic DNS&amp;quot; Und dort ist die derzeitige IP des Rechners und die IP, mit welcher die Webadresse zur Zeit verbunden ist. Mit Modify Host&amp;quot; kann man die IP aktualisieren. Wenn man nun in einem neuen Browserfenster die vorhin gewählte Adresse eingibt, zeigt der Browser die auf dem lokalen Webserver liegende index.html Datei an. Da man aber nicht immer um 4:00Uhr Nachts aufstehen will um per Hand die Ip zu aktualisieren, gibt es z.B. ddclient.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration von ddclient ==&lt;br /&gt;
&lt;br /&gt;
Ein Umsteiger mag nun erwarten, dass er über die Taskleiste ein Programm findet, welches &amp;quot;ddclient&amp;quot; heißt. Um möglichen Enttäuschungen vorzubeugen, weise ich darauf hin, dass wir uns hier mit einer steril aussehenden Konfigurationsdatei &lt;br /&gt;
 /etc/ddclient.conf &lt;br /&gt;
oder&lt;br /&gt;
 /etc/ddclient/ddclient.conf&lt;br /&gt;
befassen müssen, die in diesem Fall bis zum oberen Rande mit Beispiel-Konfigurationen und ausreichend enthaltenen Komentaren so gefüllt ist, dass man erst mal gar nicht weiss, wo man anfangen soll.&lt;br /&gt;
Mein Tipp wäre erst mal die Datei in einen Ordner im z.B. homeverzeichnis zu sichern. Nun öffnet man das gute Stück indem man in der Konsole als&lt;br /&gt;
[[root]] mit dem Befehl &amp;quot;mc&amp;quot;, oder aber wie ich das momentan gerne mache, den [[Konqueror]] auch als [[root]] mit dem Befehl &amp;quot;konqueror&amp;quot; öffnen. In beiden Fällen muss man erst mal in das Verzeichnis /etc/ browsen. In erstem Fall öffnet man die Datei ddclient.conf mit &amp;quot;bearbeiten&amp;quot;. Im zweiten Fall klickt mit der rechten Maustaste drauf und öffnet sie mit [[Kate]]. Den Inhalt kann man einfach mal komplett löschen und dann folgendes einsetzen:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ######################################################################&lt;br /&gt;
 ##&lt;br /&gt;
 ## Define default global variables with lines like:&lt;br /&gt;
 ##    var=value [, var=value]*&lt;br /&gt;
 ## These values will be used for each following host unless overridden&lt;br /&gt;
 ## with a local variable definition.&lt;br /&gt;
 ##&lt;br /&gt;
 ## Define local variables for one or more hosts with:&lt;br /&gt;
 ##    var=value [, var=value]* host.and.domain[,host2.and.domain...]&lt;br /&gt;
 ##&lt;br /&gt;
 ## Lines can be continued on the following line by ending the line&lt;br /&gt;
 ## with a \&lt;br /&gt;
 ##&lt;br /&gt;
 ######################################################################&lt;br /&gt;
 daemon=300            # check every 300 seconds&lt;br /&gt;
 syslog=yes              # log update msgs to syslog&lt;br /&gt;
 #mail=root                # mail all msgs to root&lt;br /&gt;
 #mail-failure=root         # mail failed update msgs to root&lt;br /&gt;
 pid=/var/run/ddclient.pid      # record PID in file.&lt;br /&gt;
 #&lt;br /&gt;
 #use=watchguard-soho,        fw=192.168.111.1:80   # via Watchguard's SOHO FW&lt;br /&gt;
 #use=netopia-r910,           fw=192.168.111.1:80   # via Netopia R910 FW&lt;br /&gt;
 #use=smc-barricade,          fw=192.168.123.254:80   # via SMC's Barricade FW&lt;br /&gt;
 #use=netgear-rt3xx,          fw=192.168.0.1:80      # via Netgear's internet FW&lt;br /&gt;
 #use=linksys,                fw=192.168.1.1:80      # via Linksys's internet FW&lt;br /&gt;
 #use=maxgate-ugate3x00,      fw=192.168.0.1:80      # via MaxGate's UGATE-3x00  FW&lt;br /&gt;
 #use=elsa-lancom-dsl10,      fw=10.0.0.254:80      # via ELSA LanCom DSL/10 DSL Router&lt;br /&gt;
 #use=elsa-lancom-dsl10-ch01, fw=10.0.0.254:80      # via ELSA LanCom DSL/10 DSL Router&lt;br /&gt;
 #use=elsa-lancom-dsl10-ch02, fw=10.0.0.254:80      # via ELSA LanCom DSL/10 DSL Router&lt;br /&gt;
 #use=alcatel-stp,            fw=10.0.0.138:80           # via Alcatel Speed Touch Pro&lt;br /&gt;
 #use=xsense-aero,            fw=192.168.1.1:80          # via Xsense Aero Router&lt;br /&gt;
 #use=allnet-1298,            fw=192.168.1.1:80          # via AllNet 1298 DSL Router&lt;br /&gt;
 #use=3com-oc-remote812,        fw=192.168.0.254:80   # via 3com OfficeConnect Remote 812&lt;br /&gt;
 #use=e-tech,                 fw=192.168.1.1:80          # via E-tech Router&lt;br /&gt;
 #use=cayman-3220h,           fw=192.168.0.1:1080        # via Cayman 3220-H DSL Router&lt;br /&gt;
 #&lt;br /&gt;
 #fw-login=admin,             fw-password=XXXXXX      # FW login and password&lt;br /&gt;
 #&lt;br /&gt;
 ## To obtain an IP address from FW status page (using fw-login, fw-password)&lt;br /&gt;
 #use=fw, fw=192.168.1.254/status.htm, fw-skip='IP Address' # found after IP Address&lt;br /&gt;
 #&lt;br /&gt;
 ## To obtain an IP address from Web status page (using the proxy if defined)&lt;br /&gt;
 #use=web, web=checkip.dyndns.org/, web-skip='IP Address' # found after IP Address&lt;br /&gt;
 #&lt;br /&gt;
 #use=ip,                     ip=127.0.0.1   # via static IP's&lt;br /&gt;
 #use=if,                      if=eth1      # via interfaces&lt;br /&gt;
 ##Funktioniert nicht mit dem ip Update&lt;br /&gt;
 #use=if,                     if=ppp0            # für DSL&lt;br /&gt;
 use=web               # via web&lt;br /&gt;
 &lt;br /&gt;
 protocol=dyndns2                      # Standardprotokoll&lt;br /&gt;
 server=members.dyndns.org   # Standardserver&lt;br /&gt;
 login=Dein Login                   # Standard-Login für den DynDNS-Account&lt;br /&gt;
 password=Dein Passwort        # Standard-Passwort&lt;br /&gt;
 wildcard=yes                            # add wildcard CNAME? &lt;br /&gt;
 &lt;br /&gt;
 server=members.dyndns.org,        \&lt;br /&gt;
 protocol=dyndns2,                  \&lt;br /&gt;
 Deine dyndns Adresse&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Im Prinzip brauchen hier nur Drei Einträge vollzogen werden, den Login-Namen, das Passwort und die DynDNS Adresse (alles aus der Anlage des Accounts auf dyndns.com, was im übrigen mit dyndns.org identisch ist). Das wars dann auch schon.&lt;br /&gt;
&lt;br /&gt;
Der Eintrag&lt;br /&gt;
&lt;br /&gt;
 use=web, web=checkip.dyndns.org/, web-skip='IP Address' # found after IP Address&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 use=web # via web&lt;br /&gt;
dient dazu, um von aussen zu gucken, welche &amp;quot;Hausnummer&amp;quot; also IP der Rechner von außen hat. Alle anderen Einträge würden nachgucken, welche &amp;quot;Hausnummer&amp;quot; - IP der Rechner von innen hat.&lt;br /&gt;
&lt;br /&gt;
Diese Konfiguration funktioniert wenn der Rechner per Ethernet über ein DSL Modem im Netz hängt.&lt;br /&gt;
&lt;br /&gt;
Andere Konfigurationen können gerne an dieser Stelle eingefügt werden. z.B. über einen Router. Nutzt der Provider über den man ins Netz geht einen solchen Router so kann es auch Probleme geben, denn da würde eventuell immer die Homepage-Adresse auf den ggf. zum Zuge ommenden Proxyserver des Providers laufen statt auf den eigenen mit der Funktion ja anvisierten Rechner.&lt;br /&gt;
&lt;br /&gt;
Um http://yehudi.de auch unter http://www.yehudi.de erreichbar zu machen müssen zwei Punkte beachtet werden.&lt;br /&gt;
Einmal oben in der Grafik bei &amp;quot;Enable Wildcard&amp;quot; ein Häkchen, und die Option&lt;br /&gt;
&lt;br /&gt;
 wildcard=yes                       # add wildcard CNAME?&lt;br /&gt;
&lt;br /&gt;
dabei muss diese Zeile&lt;br /&gt;
&lt;br /&gt;
 use=web               # via web&lt;br /&gt;
verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die Datei sollte zwecks des Passwortes nur rootrechte haben, dazu geben wir in der Konsole&lt;br /&gt;
&lt;br /&gt;
 chmod -Rc a-rwx /etc/ddclient.conf&lt;br /&gt;
als root ein.&lt;br /&gt;
&lt;br /&gt;
== Starten von ddclient ==&lt;br /&gt;
&lt;br /&gt;
Unter root in der Konsole geben wir&lt;br /&gt;
&lt;br /&gt;
 ddclient start&lt;br /&gt;
ein. Damit startet ddclient.&lt;br /&gt;
&lt;br /&gt;
Weitere Befehle sind:&lt;br /&gt;
&lt;br /&gt;
 ddclient stop&lt;br /&gt;
 killall -9 ddclient&lt;br /&gt;
&lt;br /&gt;
== Starten von ddclient bei Systemstart ==&lt;br /&gt;
Normalerweise wird in den gängigen [[Linux Distributionen]] bereits ein entsprechendes Startscript mitgeliefert, ebenso wie in den Versionen aus den diversen Drittanbieter-Repositories.&lt;br /&gt;
Für [[openSUSE]] (oder nach entsprechender Anpassung auch anderen [[Linux Distributionen]]) kann man auch folgendes Startscript nutzen, dazu folgen wir oc2pus seinen Anweisungen:&lt;br /&gt;
&lt;br /&gt;
1.) dieses script nach /etc/init.d/ddclient kopieren&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 #&lt;br /&gt;
 # init.d/ddclient&lt;br /&gt;
 #&lt;br /&gt;
 ### BEGIN INIT INFO&lt;br /&gt;
 # Provides:       ddclient&lt;br /&gt;
 # Required-Start: $named $network&lt;br /&gt;
 # Required-Stop:&lt;br /&gt;
 # Default-Start:  3 5&lt;br /&gt;
 # Default-Stop:&lt;br /&gt;
 # Description:    ddclient provides support for updating dynamic DNS services.&lt;br /&gt;
 ### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
 . /etc/rc.status&lt;br /&gt;
 rc_reset&lt;br /&gt;
&lt;br /&gt;
 [ -f /etc/ddclient.conf ] || exit 0&lt;br /&gt;
 &lt;br /&gt;
 PATH=/usr/sbin:${PATH}&lt;br /&gt;
 COLUMNS=9999&lt;br /&gt;
 export PATH COLUMNS&lt;br /&gt;
 program=ddclient &lt;br /&gt;
 &lt;br /&gt;
 case &amp;quot;$1&amp;quot; in&lt;br /&gt;
         start)&lt;br /&gt;
                 echo -n &amp;quot;Starting ddclient: &amp;quot;&lt;br /&gt;
 #               ddclient -daemon 300&lt;br /&gt;
                 ddclient -v&lt;br /&gt;
                 rc_status -v&lt;br /&gt;
                 ;;&lt;br /&gt;
         stop)&lt;br /&gt;
                 echo -n &amp;quot;Shutting down ddclient: &amp;quot;&lt;br /&gt;
                 kill `ps -aef | awk '/[ \/]perl.*ddclient/ { print $2}'`&lt;br /&gt;
                 rc_status -v&lt;br /&gt;
                 ;;&lt;br /&gt;
         restart)&lt;br /&gt;
                 $0 stop&lt;br /&gt;
                 $0 start&lt;br /&gt;
                 rc_status&lt;br /&gt;
                 ;;&lt;br /&gt;
         status)&lt;br /&gt;
                 pids=`ps -aef | awk '/[ \/]perl.*ddclient/ { print $2}'`&lt;br /&gt;
                 if test &amp;quot;$pids&amp;quot;&lt;br /&gt;
                  then&lt;br /&gt;
                          for p in $pids&lt;br /&gt;
                         do&lt;br /&gt;
                                  echo &amp;quot;$program (pid $p) is running&amp;quot;&lt;br /&gt;
                         done&lt;br /&gt;
                 else&lt;br /&gt;
                          echo &amp;quot;$program is stopped&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
                  rc_status -v1&lt;br /&gt;
                 ;;&lt;br /&gt;
         *)&lt;br /&gt;
                 echo &amp;quot;Usage: ddclient {start|stop|restart|status}&amp;quot;&lt;br /&gt;
                 exit 1&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
 exit 0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
2.)&lt;br /&gt;
 cd /etc/init.d&lt;br /&gt;
 insserv ddclient&lt;br /&gt;
&lt;br /&gt;
3.)&lt;br /&gt;
 cd /sbin&lt;br /&gt;
 ln -s ../etc/init.d/ddclient rcddclient&lt;br /&gt;
 &lt;br /&gt;
jetzt wird der ddclient in runlevel 3 und 5 gestartet&lt;br /&gt;
oder mit rcddclient start&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt stammt von oc2pus aus diesem Thread:&lt;br /&gt;
http://www.linux-club.de/viewtopic.php?p=90597&lt;br /&gt;
&lt;br /&gt;
== Suche von Fehlerquellen ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hierzu können zwei Befehle genutzt werden:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cat /etc/ddclient.cache&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
und&lt;br /&gt;
&lt;br /&gt;
 tail -20 /var/log/messages&lt;br /&gt;
&lt;br /&gt;
=Weitere Quellen und Links=&lt;br /&gt;
* [http://ddclient.sourceforge.net Offizielle ddclient Projekthomepage] {{Englisch}}&lt;br /&gt;
* [[Startscript für ddclient unter SUSE/openSUSE]] - Modifikation des obigen Scriptes falls die Neu- oder Wiedereinwahl per smpppd Probleme mit der Aktualisierung macht.&lt;br /&gt;
==Einige unterstützte DynDNS Serviceanbieter==&lt;br /&gt;
Die Liste stammt aus der Dokumentation von ddclient, den tests nach ist die Aktualität aber nicht  wirklich gegeben:&lt;br /&gt;
* [http://www.dyndns.org DynDNS.org] (bis zu 5 kostenlose DynDNS Domains,auch statische, wer mehr Domains braucht muss zahlen){{Englisch}}&lt;br /&gt;
* [http://www.dnspark.com DNSPark.com] {{Englisch}}&lt;br /&gt;
* [http://www.orgdns.org OrgDNS.org] (offenbar nicht mehr aktiv, hat nun wohl andere Inhalte als DynDNS betreffende) {{Deutsch}}&lt;br /&gt;
* [http://www.dslreports.com DSLReports] (scheint auch nicht mehr mit den ursprünglichen Diensten aktiv zu sein, zumindest war DynDNS dort nicht direkt zu finden) {{Englisch}}&lt;br /&gt;
* [http://www.hn.org Hammernode] (offenbar nicht mehr aktiv)&lt;br /&gt;
* [http://www.easydns.com EasyDNS] {{Englisch}}&lt;br /&gt;
* [http://www.zoneedit.com ZoneEdit] (bietet ebenso kostenlose DynDNS Domains) {{Englisch}}&lt;br /&gt;
&lt;br /&gt;
==Weiter DynDNS Dienstanbieter die eigene Software statt ddclient nutzen==&lt;br /&gt;
* [http://www.selfhost.de SelfHost.de] (bietet kostenpflichtig auch .de Domains an, nutzt dazu jedoch ein eigenes Updatetool, welches für Linux, Windows und MacOS erhältlich ist) {{Deutsch}}&lt;br /&gt;
 &lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[DHCP und DNS|zurück zu DHCP und DNS]]&lt;br /&gt;
&lt;br /&gt;
[[Category:DHCP und DNS]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Bootverz%C3%B6gerungen_durch_fsck&amp;diff=28968</id>
		<title>Bootverzögerungen durch fsck</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Bootverz%C3%B6gerungen_durch_fsck&amp;diff=28968"/>
		<updated>2013-02-09T00:49:13Z</updated>

		<summary type="html">&lt;p&gt;Itu: Itu verschob Seite BootverzÃ¶gerungen durch fsck nach Bootverzögerungen durch fsck&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;; Das Problem :&lt;br /&gt;
Gelegentlich wird man besonders bei Verwendung von sehr großen Filesystemen auf das Problem stoßen, dass der [[Bootvorgang]] hin und wieder einmal sehr lange dauert. ( manchmal 5 und mehr Minuten länger als normal ) Das liegt daran, das Filesysteme hin und wieder einmal während des Bootvorganges überprüft werden. &lt;br /&gt;
&lt;br /&gt;
Hier soll das Problem an Hand des [http://de.wikipedia.org/wiki/Ext3 ext3-Filesystems] erklärt und aufgezeigt werden, sowie die Möglichkeit der optimalen Einstellungen für solche Filesysteme vorgestellt werden.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== kompletter Filesystemcheck bei ext3 ==&lt;br /&gt;
=== Das ext3 Filesystem ===&lt;br /&gt;
&lt;br /&gt;
Beim ext3-Filesystem handelt es sich um eine Erweiterung des ext2-Filesystem, genauer um die Erweiterung eines '''Filesystem-Journals''' im ext2-Filesystemen sowie kleine weitere Änderungen von Eigenschaften und Möglichkeiten. Der grundsätzliche Aufbau beider Filesysteme ist absolut gleich. Aus diesem Grunde lassen sich ext2-Filesysteme auch problemlos ohne aufwendige Konvertierung in ext3-Filesysteme umwandeln und umgekehrt. Auch die Befehle und Tools sind für beide Filesysteme die selben, wie man hier an Hand der gleichen [[Inode]] schnell erkennen kann.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX:/ #  ls -il /sbin/fsck.ext? /sbin/mkfs.ext?&lt;br /&gt;
442822 -rwxr-xr-x  3 root root 131344 Apr  6  2004 /sbin/fsck.ext2&lt;br /&gt;
442822 -rwxr-xr-x  3 root root 131344 Apr  6  2004 /sbin/fsck.ext3&lt;br /&gt;
442757 -rwxr-xr-x  3 root root  31080 Apr  6  2004 /sbin/mkfs.ext2&lt;br /&gt;
442757 -rwxr-xr-x  3 root root  31080 Apr  6  2004 /sbin/mkfs.ext3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Das Filesystem-Journal ====&lt;br /&gt;
 &lt;br /&gt;
Ein [http://de.wikipedia.org/wiki/Journaling-Dateisystem Journal] kann man sich vorstellen wie ein Aufgabenbuch. Hier wird zuerst einmal festgehalten was gemacht werden soll, erst dann werden die einzelnen Arbeiten ausgeführt und der Aufgabeneintrag danach wieder entfernt. Es werden also zuerst alle anstehenden Änderungen am Filesystem in eine spezielle Datei, dem Journal, vermerkt und auf die Festplatte geschrieben, bevor sie wirklich am Filesystem ausgeführt werden. Auf dem ersten Blick ist das doppelte Arbeit, die auch wirklich etwas Rechenzeit bei Änderungen an den Dateien verbraucht, hat aber den Vorteil, die Daten im Filesystem bleiben auch zB. bei einem plötzlichen Rechnerabsturz konsistent auf der Festplatte stehen. Der Rechner kann dann an Hand des Journals erkennen was die letzte Operation am Filesystem war, oder hätte sein sollen, und kann diese wiederholen und noch im Journal ausstehende Änderungen am Filesystem durchführen. Der Vorteil macht sich nach einem solchem Systemabsturz dann beim Mounten bemerkbar. &lt;br /&gt;
Ein Filesystem kann nur eingehängt werden wenn es ''clean'' ist, also entweder sauber ausgehängt wurde oder dieses Flag mit Hilfe eines [http://linux.die.net/man/8/fsck '''fsck'''] gesetzt worden ist. Ein ext2-Filesystem muss also nach einem Systemabsturz erst einmal komplett überprüft werden. Das kann je nach Größe des Filesystems einige Minuten, in extrem großen Filesystemen aber auch Stunden dauern, Der Bootvorgang wird hier solange verzögert bis das Filesystem eingehängt werden kann. Beim Journalfilesystem braucht fsck nur das Journal abzuarbeiten und ist innerhalb von wenigen Sekunden fertig und kann das Cleanflag setzen und der Bootvorgang geht sofort weiter.&lt;br /&gt;
&lt;br /&gt;
Neben dem oben beschrieben kompletten Journaling ( die Änderungen werden wirklich 2 Mal auf die Festplatte geschrieben, einmal ins Journal und dann noch einmal ins Filesystem ) wie es in frühen Versionen von ext3 Standard war, gibt es noch 2 weitere Methoden das Journal zu benutzen, den Modus '''ordered''' und den Modus '''writeback'''. Diese stellen einen Kompromiss zwischen Geschwindigkeit und Datensicherheit dar. Welcher Modus für das Journal verwendet wird, wird mit dem '''mount'''-Optionen festgelegt. Default ist '''ordered''' als akzeptabler Kompromiss zwischen Zuverlässigkeit und Geschwindigkeit eingestellt. &lt;br /&gt;
&lt;br /&gt;
Weitere Informationen dazu in [http://linux.die.net/man/8/mount Manpage mount] Aus den CHANGES-files alter Distributionen stammt diese Beschreibung der einzelnen Optionen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;quot;mount -o data=journal&amp;quot;&lt;br /&gt;
        Journals all data and metadata, so data is written twice. This&lt;br /&gt;
        is the mode which all prior versions of ext3 used.&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;mount -o data=ordered&amp;quot;&lt;br /&gt;
        Only journals metadata changes, but data updates are flushed to&lt;br /&gt;
        disk before any transactions commit. Data writes are not atomic&lt;br /&gt;
        but this mode still guarantees that after a crash, files will&lt;br /&gt;
        never contain stale data blocks from old files.&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;mount -o data=writeback&amp;quot;&lt;br /&gt;
        Only journals metadata changes, and data updates are entirely&lt;br /&gt;
        left to the normal &amp;quot;sync&amp;quot; process. After a crash, files will&lt;br /&gt;
        may contain stale data blocks from old files: this mode is&lt;br /&gt;
        exactly equivalent to running ext2 with a very fast fsck on reboot.&lt;br /&gt;
&amp;lt;/pre&amp;gt;	   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Optionen für einen kompletten Filesystemcheck ===&lt;br /&gt;
&lt;br /&gt;
==== Werte beim Anlegen des Filesystems ==== &lt;br /&gt;
&lt;br /&gt;
Beim Anlegen eines ext2 oder ext3 Filesystems wird per Zufallsgenerator innerhalb eines bestimmten Bereiches festgelegt, nach wieviel Mounts dieses Filesystem beim mounten komplett überprüft werden soll, auch wenn das Filesystem der Meinung ist, ich bin '''clean'''. Bei sehr großen Filesystemen dauert ein solcher Filesystemcheck dann Minuten oder auch Stunden. Das ist bei einem Journal-Filesystem aber wichtig, das es hin und wieder einmal komplett geprüft wird, denn nach einem Crash zB. wird ja nur das Journal abgearbeitet und nicht wirklich das gesamte Filesystem nach eventuellen Fehlern überprüft. Es können also hier durchaus kleinere Fehler dennoch im Filesystem sein, obwohl der Filesystem der Meinung ist, es ist sauber. &lt;br /&gt;
Es werden dort also Zufallswerte für Anzahl der Mounts und 180 Tage für Anzahl der Tage festgelegt. Nach dem Ablauf eines dieser Werte, wird das Filesystem beim automatischen mount beim booten automatisch komplett überprüft. Zufallszahlen deshalb, damit wenn mehrere Filesysteme gleichzeitig anlegt werden, diese dann nicht alle auf einmal geprüft werden müssen, was sonst dann viel zu lange dauern würde und es auch nicht notwendig ist, alle Filesysteme gleichzeitig zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Ausgabe beim Anlegen eines ext3 Filesystemes könnte zB so hier aussehen&lt;br /&gt;
Code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This filesystem will be automatically checked every 33 mounts or&lt;br /&gt;
180 days, whichever comes first.  Use tune2fs -c or -i to override.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Werte auslesen ====&lt;br /&gt;
&lt;br /&gt;
Anzeigen lassen kann man sich die Werte eines ext2/ext3 Filesystems mit [http://linux.die.net/man/8/dumpe2fs dumpe2fs].&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX:/ # dumpe2fs -h /dev/sdb3&lt;br /&gt;
dumpe2fs 1.34 (25-Jul-2003)&lt;br /&gt;
Filesystem volume name:   &amp;lt;none&amp;gt;&lt;br /&gt;
Last mounted on:          &amp;lt;not available&amp;gt;&lt;br /&gt;
Filesystem UUID:          655d8084-3830-4006-9c9b-c70fe223bac8&lt;br /&gt;
Filesystem magic number:  0xEF53&lt;br /&gt;
Filesystem revision #:    1 (dynamic)&lt;br /&gt;
Filesystem features:      has_journal filetype needs_recovery sparse_super&lt;br /&gt;
Default mount options:    (none)&lt;br /&gt;
Filesystem state:         clean&lt;br /&gt;
Errors behavior:          Continue&lt;br /&gt;
Filesystem OS type:       Linux&lt;br /&gt;
Inode count:              1144640&lt;br /&gt;
Block count:              2285246&lt;br /&gt;
Reserved block count:     114262&lt;br /&gt;
Free blocks:              1177002&lt;br /&gt;
Free inodes:              1144593&lt;br /&gt;
First block:              0&lt;br /&gt;
Block size:               4096&lt;br /&gt;
Fragment size:            4096&lt;br /&gt;
Blocks per group:         32768&lt;br /&gt;
Fragments per group:      32768&lt;br /&gt;
Inodes per group:         16352&lt;br /&gt;
Inode blocks per group:   511&lt;br /&gt;
Filesystem created:       Sun Jun  4 18:00:03 2006&lt;br /&gt;
Last mount time:          Mon Dec 25 14:22:14 2006&lt;br /&gt;
Last write time:          Mon Dec 25 14:22:14 2006&lt;br /&gt;
Mount count:              3&lt;br /&gt;
Maximum mount count:      20&lt;br /&gt;
Last checked:             Mon Dec 25 11:41:31 2006&lt;br /&gt;
Check interval:           15552000 (6 months)&lt;br /&gt;
Next check after:         Sat Jun 23 12:41:31 2007&lt;br /&gt;
Reserved blocks uid:      0 (user root)&lt;br /&gt;
Reserved blocks gid:      0 (group root)&lt;br /&gt;
First inode:              11&lt;br /&gt;
Inode size:               128&lt;br /&gt;
Journal inode:            8&lt;br /&gt;
Default directory hash:   tea&lt;br /&gt;
Directory Hash Seed:      0d2f6350-84ae-4784-b3e9-db6437d3395e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus folgenden Abschnitt kann man erkennen, wann das Filesystem das letzte mal geprüft wurde und wann es wieder geprüft werden muss.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Mount count:              3&lt;br /&gt;
Maximum mount count:      20&lt;br /&gt;
Last checked:             Mon Dec 25 11:41:31 2006&lt;br /&gt;
Check interval:           15552000 (6 months)&lt;br /&gt;
Next check after:         Sat Jun 23 12:41:31 2007&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In diesem Beispiel hier also entweder nach dem 23. Juni Mittags oder nach 17 weiteren Mounts je nach dem was eher eintritt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Werte manuell neu setzen ====&lt;br /&gt;
&lt;br /&gt;
Den Wert maximale Anzahl der mounts kann man zB. ändern mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX:/ # tune2fs -c 50 /dev/sdb3&lt;br /&gt;
tune2fs 1.34 (25-Jul-2003)&lt;br /&gt;
Setting maximal mount count to 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ebenso kann man auch die maximale Anzahl der Tage änderen, nach deren Ablauf beim nächsten Mount wieder geprüft werden soll. (360d sind hier 360 Tage )&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LINUX:/ # tune2fs -i 360d  /dev/sdb3&lt;br /&gt;
tune2fs 1.34 (25-Jul-2003)&lt;br /&gt;
Setting interval between check 31104000 seconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komplettes ausschalten beider Optionen dann analog&lt;br /&gt;
 tune2fs -i 0 -c 0 /dev/PARTITION&lt;br /&gt;
&lt;br /&gt;
es lassen sich auch noch andere Parameter eines ext2/ext3-Filesystems mit '''tune2fs''' ändern. Die [http://linux.die.net/man/8/tune2fs Manpage von tune2fs] ist hierfür der erste Anlaufpunkt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Welche Werte sind nun für mich optimal ? ===&lt;br /&gt;
&lt;br /&gt;
Kommt ganz darauf an, ist es auch gleichzeitig das Rootfilesystem oder ein anderes Systemfilesystem oder ist ein Home oder ein anderes Datenfilesystem, wird der Rechner jetzt täglich gebootet, oder läuft er monatelang durch und vor allem wie groß ist das Filesystem damit man eine ungefähre Vorstellung davon hat, wie lange es dann dauert?&lt;br /&gt;
&lt;br /&gt;
Bei einem Rootfilesystem sollte man es auf gar keinen Fall komplett abschalten, da dort ''fsck'' nur schlecht per Hand angestoßen werden kann. Ein reines Datenfilesystem, hier könnte man es auch durchaus komplett ausschalten, (ist aber ausdrücklich nicht empfohlen) dann sollte aber dennoch hin und wieder mal ein komplettes ''fsck'' per Hand darüber laufen, spätestens so nach 3 bis 5 Systemcrash oder harten Ausschalten des Systems.&lt;br /&gt;
 fsck -f /dev/PARTITION&lt;br /&gt;
Ansonsten den Wert so einstellen, dass ca. nach einem halben Jahr spätestens einmal überprüft wird. Also bei täglichem Booten oder sogar mehrfachen bootens pro Tag, dann kann man den Maxboot-Count hochschrauben oder mit '''-c 0''' auch gleich ganz ausschalten. Der Tageszähler auf 120-180 Tage einstellen.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich um einen Server, der normalerweise selten rebootet wird, dann die Zeit mit ''' -i 0''' ausschalten und Maxboot auf zB. 10 stellen. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Server der normalerweise überhaupt nicht rebootet wird, so eingestellt wird, dass er bei jedem booten dann den Filesystemcheck durchführt, ist das zwar erstmal optimal eingestellt, man sollte sich aber dann auch darüber klar sein, gibt es irgendwelche Probleme mit diesem Rechner und dieser muss zB. bei einer Reparatur 10 Mal hintereinander gebootet werden, dann werden dann auch 10 Mal die Filesysteme überprüft. Auch solche Unvorhersehbarkeiten sollte man durchaus mit in seine Überlegungen einfließen lassen.  &lt;br /&gt;
&lt;br /&gt;
Wenn man sowieso mal gerade Wartungsarbeiten an seinem System ausführt und das Filesystem gerade nicht gemountet ist, dann kann man sich bei sehr großen Filesystemen auch hier mal unabhängig der eingestellten Werte zu einem manuell angestoßenen Filesystemcheck entschließen und so den Zeitpunkt für einen lange dauernden Filesystemcheck in eine günstigere Zeit verschieben.  &lt;br /&gt;
&lt;br /&gt;
Ein ext3 sollte aber eben hin und wieder einmal komplett gescannt werden, ob man das jetzt per Hand machen will, und es dann doch wieder vergisst, oder automatisch mit der Gefahr, dass es gerade dann passiert wenn man es überhaupt nicht gebrauchen kann, ist das Problem eines jeden Administrators selbst. Jedenfalls sollte man sich bei größeren Filesystemen (20 GB und größer) diese Werte mal anschauen und dann entscheiden ob sie entsprechend ihrer Verwendung nicht doch optimiert werden müssten.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Weitere Links ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.linux-club.de/viewtopic.php?t=72370 Suse bootet manchmal langsam!?] &lt;br /&gt;
&lt;br /&gt;
[[Category:Bootmanager]]&lt;br /&gt;
[[Category:Systemverwaltung]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=HP_Multifunktionsger%C3%A4te_Installationsanleitung&amp;diff=28917</id>
		<title>HP Multifunktionsgeräte Installationsanleitung</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=HP_Multifunktionsger%C3%A4te_Installationsanleitung&amp;diff=28917"/>
		<updated>2013-01-28T00:33:22Z</updated>

		<summary type="html">&lt;p&gt;Itu: annehmlich formatiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine '''Installationsanleitung für HP-Multifunktionsgeräte''' (Stand: Januar 2013)&lt;br /&gt;
&lt;br /&gt;
=== Voraussetzung: ===&lt;br /&gt;
* HPLIP und HPIJS müssen installiert sein (automatisch bei Opensuse)&lt;br /&gt;
* CUPS ist installiert und läuft&lt;br /&gt;
* Python ist installiert&lt;br /&gt;
* Sane ist installiert&lt;br /&gt;
* In der Datei /etc/sane.d/dll.conf darf der Eintrag &amp;quot;hpiao&amp;quot; nicht auskommentiert sein&lt;br /&gt;
&lt;br /&gt;
=== Vorgehen für Druckbetrieb per Netzwerk (Drucker hängt direkt im lokalen Netz) ===&lt;br /&gt;
&lt;br /&gt;
1. Gehe an den Drucker und rufe das Einstellungsmenü auf. Suche die Einstellung für das Netzwerk und richte den Drucker mit einer festen IP-Adresse ein. Merk Dir die Adresse.&lt;br /&gt;
&lt;br /&gt;
2. Prüfe, ob am Rechner, der auf diesen Drucker zugreifen soll, eine Firewall läuft. Wenn ja, dann rufe per Yast die Firewall-Einstellungen auf, gehe zu &amp;quot;erlaubte Dienste&amp;quot; und suche in &amp;quot;zu erlaubende Dienste den &amp;quot;Zeroconf/Bonjour Multicast DNS&amp;quot;-Dienst. Füge ihn hinzu und beende die Firewall-Einstellungen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vorgehen für Drucker am USB-Anschluss: ===&lt;br /&gt;
&lt;br /&gt;
* Verbinde den Drucker per USB-Kabel mit dem zuständigen Rechner&lt;br /&gt;
&lt;br /&gt;
=== Vorgehen für alle ===&lt;br /&gt;
&lt;br /&gt;
1. Läuft der Drucker? Wenn nicht, dann jetzt!&lt;br /&gt;
&lt;br /&gt;
2. Starte am Rechner eine Konsole und gib ein: &amp;quot;hp-check -r&amp;quot; (kein root nötig)&lt;br /&gt;
&lt;br /&gt;
3. Das Skript wird wahrscheinlich Fehler ausgeben. Vergiss alle Fehler mit dem Ausdruck &amp;quot;devel&amp;quot;, ebenso diese Fehler: builttool, gcc und reportlab Überprüfe den Rest. Falls irgendwelche libs fehlen, dann hat das Tool wahrscheinlich nicht die Version gefunden, die es gern finden möchte. Und das ist egal.&lt;br /&gt;
&lt;br /&gt;
4. Starte jetzt als root das Script &amp;quot;hp-setup&amp;quot; und antworte jeweils richtig. Für Netzwerkdrucker kann es jetzt wichtig sein, manuell zu suchen und dafür die IP-Nummer einzugeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Falls das erfolgreich durchläuft, siehst Du Deinen Drucker und er ist eingerichtet. Wenn Du im Browser &amp;quot;http://localhost:601&amp;quot; eingibst (oder CUPS anderweitig aufrufst), dann kannst Du dort den eingerichteten Drucker sehen. Vielleicht wäre eine Testseite jetzt angesagt?&lt;br /&gt;
&lt;br /&gt;
Den Scanner kannst Du für schnelle Scans wahrscheinlich im Browser ansprechen: &amp;quot;die-ip-deines-druckers&amp;quot;. Dann erscheint die Weboberfläche des Scanners. &lt;br /&gt;
&lt;br /&gt;
Für gute und detaillierte Scans starte XSane, dort ist der Scanner bereits eingetragen.&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Zentrales_Update_f%C3%BCr_verschiedene_PCs_mit_apt&amp;diff=28914</id>
		<title>Zentrales Update für verschiedene PCs mit apt</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Zentrales_Update_f%C3%BCr_verschiedene_PCs_mit_apt&amp;diff=28914"/>
		<updated>2013-01-27T02:04:46Z</updated>

		<summary type="html">&lt;p&gt;Itu: Itu verschob Seite Zentrales Update fÃ¼r verschiedene PCs mit apt nach Zentrales Update für verschiedene PCs mit apt: fix/utf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn man mehrere Linux-PCs im Einsatz hat, möchte man natürlich die Updates nur einmal aus dem Internet laden  &lt;br /&gt;
&lt;br /&gt;
Um das zu erreichen, wird einer der PCs das apt-Repository und den Cache verwalten. Die anderen PCs nutzen dann diesen Cache ebenfalls mit. Dieser PC exportiert das apt-Verzeichnis als NFS-Server. Die anderen importieren dieses Verzeichnis dann. &lt;br /&gt;
Wie man den NFS-Server und die -Clients aufsetzt setze ich hier mal als bekannt voraus.&lt;br /&gt;
&lt;br /&gt;
Eventuell richtet man sich noch eine eigene Gruppe apt und einen speziellen apt-user ein. Das rundet die Sache ab, ist aber nicht zwingend erforderlich. Diesem apt-user gewährt man dann root-Zugriff via sudo. Auch das setze ich als bekannt voraus. &lt;br /&gt;
&lt;br /&gt;
Mein apt-cache und die apt-Verwaltungsdaten liegen in /local/packages &lt;br /&gt;
Dieses Verzeichnisse wird dann via NFS exportiert. Die anderen PCs mounten dieses Verzeichnis (NFS-Clients) und können dann von dort die Pakete holen und gegebenfalls auch neue Pakete dort einfügen. Die Clients müssen ja nicht zwingend die gleichen Pakete installiert haben  &lt;br /&gt;
&lt;br /&gt;
Damit apt mit dem Verzeichnis /local/packages arbeitet und nicht per default mit /var/cache/apt und /var/state/apt ist eine kleine Änderung an der /etc/apt/apt.conf.d/apt.conf erforderlich:&lt;br /&gt;
&lt;br /&gt;
 // Directory layout &lt;br /&gt;
 Dir &amp;quot;/&amp;quot; &lt;br /&gt;
 { &lt;br /&gt;
   // Location of the state dir &lt;br /&gt;
   State &amp;quot;local/packages/state/apt&amp;quot; &lt;br /&gt;
   { &lt;br /&gt;
      lists &amp;quot;lists-9.1/&amp;quot;; &lt;br /&gt;
      xstatus &amp;quot;xstatus&amp;quot;; &lt;br /&gt;
      userstatus &amp;quot;status.user&amp;quot;; &lt;br /&gt;
      status &amp;quot;/local/packages/status&amp;quot;; &lt;br /&gt;
   }; &lt;br /&gt;
 &lt;br /&gt;
   // Location of the cache dir &lt;br /&gt;
   Cache &amp;quot;local/packages/cache/apt/&amp;quot; { &lt;br /&gt;
      archives &amp;quot;archives-9.1/&amp;quot;; &lt;br /&gt;
      srcpkgcache &amp;quot;srcpkgcache-9.1.bin&amp;quot;; &lt;br /&gt;
      pkgcache &amp;quot;pkgcache-9.1.bin&amp;quot;; &lt;br /&gt;
   }; &lt;br /&gt;
 &lt;br /&gt;
    ... &lt;br /&gt;
 }; &lt;br /&gt;
&lt;br /&gt;
In der Sektion Dir &amp;quot;/&amp;quot; legt man die Verzeichnisstruktur für apt fest. &lt;br /&gt;
in diesem Beispiel also /local/packages als Wurzel. &lt;br /&gt;
&lt;br /&gt;
Diese Verzeichnisstruktur erzeugt man mit &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /local/packages/cache/apt/archives-9.1/partial &lt;br /&gt;
 mkdir -p /local/packages/state/apt/lists-9.1/partial &lt;br /&gt;
 touch /local/packages/cache/apt/archives-9.1/lock &lt;br /&gt;
 touch /local/packages/state/apt/lists-9.1/lock &lt;br /&gt;
&lt;br /&gt;
Wer mehrere SuSE Versionen hat, erzeugt dann eben noch weitere &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /local/packages/cache/apt/archives-9.0/partial &lt;br /&gt;
 mkdir -p /local/packages/state/apt/lists-9.0/partial &lt;br /&gt;
&lt;br /&gt;
Auf den einzelnen Clients befindet sich dann nur noch die apt Konfiguration in /etc/apt. Und diese Konfiguration ist dann auf das jeweilige apt-Verzeichnis anzupassen, also die 9.0 SuSE-Rechner zeigen auf archives-9.0 und lists-9.0, die 9.1er SuSE-Rechner zeigen entsprechend dann auf archives-9.1 und lists-9.1. &lt;br /&gt;
&lt;br /&gt;
Damit der parallele Zugriff auf das apt-NFS-Verzeichnis funktioniert ist natürlich auf allen Rechnern der nfs-lock-daemon zu starten!! &lt;br /&gt;
&lt;br /&gt;
Wer nur eine SuSE Version auf allen PCs hat, der könnte sogar die apt-Konfiguration ebenfalls auf dem /local/packages Verzeichnis aufsetzen und in ein /local/packages/etc/apt kopieren. Dazu ist dieser Block entsprechend anzupassen:&lt;br /&gt;
&lt;br /&gt;
   // Config files &lt;br /&gt;
   Etc &amp;quot;local/etc/apt/&amp;quot; { &lt;br /&gt;
      sourcelist &amp;quot;sources.list&amp;quot;; &lt;br /&gt;
      main &amp;quot;apt.conf&amp;quot;; &lt;br /&gt;
      preferences &amp;quot;preferences&amp;quot;; &lt;br /&gt;
   }; &lt;br /&gt;
&lt;br /&gt;
Die zentrale Konfiguration wird dann dem apt-get -c /local/packages/apt/etc/apt.conf mitgegeben&lt;br /&gt;
&lt;br /&gt;
Zur Klarheit hier noch eine komplette apt.conf:&lt;br /&gt;
&lt;br /&gt;
 // with &amp;quot;apt-config dump&amp;quot; all settings can be viewed &lt;br /&gt;
 &lt;br /&gt;
 Acquire::CDROM::Copy &amp;quot;true&amp;quot;; &lt;br /&gt;
 &lt;br /&gt;
 Debug &lt;br /&gt;
 { &lt;br /&gt;
     pkgRPMPM &amp;quot;false&amp;quot;; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 RPM &lt;br /&gt;
 { &lt;br /&gt;
     // Hold (do not update) a list with pkgs: &lt;br /&gt;
     // Hold { &amp;quot;k_deflt&amp;quot;; &amp;quot;sane&amp;quot;; }; &lt;br /&gt;
     // Leave list empty to disable &lt;br /&gt;
     Hold { &amp;quot;kernel-default&amp;quot;; &amp;quot;kernel-source&amp;quot;; }; &lt;br /&gt;
     Ignore {&amp;quot;gpg-pubkey&amp;quot;; }; &lt;br /&gt;
 &lt;br /&gt;
     Options { }; &lt;br /&gt;
     Install-Options &amp;quot;&amp;quot;; &lt;br /&gt;
     Erase-Options &amp;quot;&amp;quot;; &lt;br /&gt;
     Source { &lt;br /&gt;
         Build-Command &amp;quot;rpmbuild --rebuild&amp;quot;; &lt;br /&gt;
     }; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Directory layout &lt;br /&gt;
 Dir &amp;quot;/&amp;quot; &lt;br /&gt;
 { &lt;br /&gt;
     // Location of the state dir &lt;br /&gt;
     State &amp;quot;local/state/apt/&amp;quot; &lt;br /&gt;
     { &lt;br /&gt;
         lists &amp;quot;lists/&amp;quot;; &lt;br /&gt;
         xstatus &amp;quot;xstatus&amp;quot;; &lt;br /&gt;
         userstatus &amp;quot;status.user&amp;quot;; &lt;br /&gt;
         status &amp;quot;/local/status&amp;quot;; &lt;br /&gt;
     }; &lt;br /&gt;
 &lt;br /&gt;
     // Location of the cache dir &lt;br /&gt;
     Cache &amp;quot;local/cache/apt/&amp;quot; &lt;br /&gt;
     { &lt;br /&gt;
         archives &amp;quot;archives/&amp;quot;; &lt;br /&gt;
         srcpkgcache &amp;quot;rcpkgcache.bin&amp;quot;; &lt;br /&gt;
         pkgcache &amp;quot;pkgcache.bin&amp;quot;; &lt;br /&gt;
     }; &lt;br /&gt;
 &lt;br /&gt;
     // Config files &lt;br /&gt;
     Etc &amp;quot;local/etc/apt/&amp;quot; &lt;br /&gt;
     { &lt;br /&gt;
         sourcelist &amp;quot;sources.list&amp;quot;; &lt;br /&gt;
         main &amp;quot;apt.conf&amp;quot;; &lt;br /&gt;
         preferences &amp;quot;preferences&amp;quot;; &lt;br /&gt;
     }; &lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
und als zusätzlichen kleinen Tip für die &amp;quot;schreibfaulen&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
In meiner .bashrc habe noch folgende Aliase erstellt, vielleicht erleichtert das jemand die Arbeit mit der neuen Konfiguration:&lt;br /&gt;
&lt;br /&gt;
 alias apt-get='sudo apt-get -c /local/etc/apt/apt.conf.d/apt.conf' &lt;br /&gt;
 alias apt-cache='sudo apt-cache -c /local/etc/apt/apt.conf.d/apt.conf'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
oc2pus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Paketmanager|Zurück zum Paketmanager]]&amp;lt;br/&amp;gt; &lt;br /&gt;
[[Category:APT]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Faxen&amp;diff=28913</id>
		<title>Diskussion:Faxen</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Faxen&amp;diff=28913"/>
		<updated>2013-01-26T13:40:18Z</updated>

		<summary type="html">&lt;p&gt;Itu: &amp;gt;&amp;gt; autorkommentar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Vergessener Artikel?=&lt;br /&gt;
Ist dieser Artikel einfach nur vergessen worden oder ist er mittlerweile völig überholt? Jedenfalls hab ich mir deshalb nun das Anbringen von Navigationslinks erstmal bis zur Fragenklärung gespart....--[[Benutzer:TomcatMJ|TomcatMJ]] 02:16, 12. Mär 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autorkommentar==&lt;br /&gt;
:&amp;lt;small&amp;gt;''Aus dem Artikel hierherverlegt:''  --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 14:40, 26. Jan. 2013 (CET) &amp;lt;/small&amp;gt;&lt;br /&gt;
Unter Microsft Word hab ich leider keine Einstellung gefunden wie man einzelne Druckjobs erzeugen kann, vielleicht kann ja noch jemand einen Hinweis geben.&lt;br /&gt;
&lt;br /&gt;
Ich hab vieles bewusst so erklärt, dass auch Linuxneulinge was damit anfangen können.&lt;br /&gt;
&lt;br /&gt;
Ich hoffe damit dem ein oder anderen geholfen zu haben. [-- Yehudi]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Faxen&amp;diff=28912</id>
		<title>Faxen</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Faxen&amp;diff=28912"/>
		<updated>2013-01-26T13:37:18Z</updated>

		<summary type="html">&lt;p&gt;Itu: autorkommentar &amp;gt;&amp;gt; disk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von jedem beliebigen Client im lokalen Netz, auf dem wir den Faxegate Drucker eingerichtet haben, können wir jetzt aus jedem Textverarbeitungsprogramm heraus faxen indem wir die Faxnummer des Empfängers einfach wie folgt eingeben, und über unseren Faxgate Drucker ausdrucken.&lt;br /&gt;
&lt;br /&gt;
Fax-Nr.: 0123-456789&lt;br /&gt;
&lt;br /&gt;
Es dürfen keine / Zeichen oder andere Sonderzeichen vorkommen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ein + dagegen wird automatisch durch 00 ersetzt.&lt;br /&gt;
&lt;br /&gt;
Auf jedem beliebigen Client des lokalen Netzes, an dem wir einen Mailaccount eingerichtet haben, können wir jetzt die Benachrichtigungsmail über das erfolgreiche Senden des Faxes, oder über eingegangene Faxe abholen.&lt;br /&gt;
&lt;br /&gt;
Von Faxgate gibt es auch noch einen javabasierten Clienten, der aber leider IP- und damit hostgebunden ist.&lt;br /&gt;
Das heißt der gleiche User kann immer nur auf dem voreingestellten gleichen Host benachrichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Mehr dazu auf http://home.arcor.de/ingo.goeppert/faxgate/&lt;br /&gt;
&lt;br /&gt;
edit: Zum versenden von Serienfaxen aus OpenOffice.org bei -&amp;gt; Extras -&amp;gt; Optionen -&amp;gt; OpenOffice.org Writer -&amp;gt; Drucken -&amp;gt; Einzelne Druckjobs erzeugen aktivieren, sonst kriegt nur die erste Nummer das Fax.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Faxen und Telefonieren|zurück zu Faxen und Telefonieren]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Faxen und Telefonieren]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Faxen&amp;diff=28911</id>
		<title>Faxen</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Faxen&amp;diff=28911"/>
		<updated>2013-01-26T13:36:19Z</updated>

		<summary type="html">&lt;p&gt;Itu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Von jedem beliebigen Client im lokalen Netz, auf dem wir den Faxegate Drucker eingerichtet haben, können wir jetzt aus jedem Textverarbeitungsprogramm heraus faxen indem wir die Faxnummer des Empfängers einfach wie folgt eingeben, und über unseren Faxgate Drucker ausdrucken.&lt;br /&gt;
&lt;br /&gt;
Fax-Nr.: 0123-456789&lt;br /&gt;
&lt;br /&gt;
Es dürfen keine / Zeichen oder andere Sonderzeichen vorkommen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ein + dagegen wird automatisch durch 00 ersetzt.&lt;br /&gt;
&lt;br /&gt;
Auf jedem beliebigen Client des lokalen Netzes, an dem wir einen Mailaccount eingerichtet haben, können wir jetzt die Benachrichtigungsmail über das erfolgreiche Senden des Faxes, oder über eingegangene Faxe abholen.&lt;br /&gt;
&lt;br /&gt;
Von Faxgate gibt es auch noch einen javabasierten Clienten, der aber leider IP- und damit hostgebunden ist.&lt;br /&gt;
Das heißt der gleiche User kann immer nur auf dem voreingestellten gleichen Host benachrichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Mehr dazu auf http://home.arcor.de/ingo.goeppert/faxgate/&lt;br /&gt;
&lt;br /&gt;
edit: Zum versenden von Serienfaxen aus OpenOffice.org bei -&amp;gt; Extras -&amp;gt; Optionen -&amp;gt; OpenOffice.org Writer -&amp;gt; Drucken -&amp;gt; Einzelne Druckjobs erzeugen aktivieren, sonst kriegt nur die erste Nummer das Fax.&lt;br /&gt;
&lt;br /&gt;
Unter Microsft Word hab ich leider keine Einstellung gefunden wie man einzelne Druckjobs erzeugen kann, vielleicht kann ja noch jemand einen Hinweis geben.&lt;br /&gt;
&lt;br /&gt;
Ich hab vieles bewusst so erklärt, dass auch Linuxneulinge was damit anfangen können.&lt;br /&gt;
&lt;br /&gt;
Ich hoffe damit dem ein oder anderen geholfen zu haben.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Faxen und Telefonieren|zurück zu Faxen und Telefonieren]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Faxen und Telefonieren]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Inode&amp;diff=28910</id>
		<title>Inode</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Inode&amp;diff=28910"/>
		<updated>2013-01-26T13:21:47Z</updated>

		<summary type="html">&lt;p&gt;Itu: ~tippos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Inode ==&lt;br /&gt;
=== kurze Erklärung von Inode ===&lt;br /&gt;
Die Inode sind der Dreh- und Angelpunkt sämtlicher Dateizugriffe. Ein Großteil der Arbeit des Betriebssystems ist die Umsetzung von Dateinamen in die dazugehörige Inodes. Um die Funktion einiger Befehle zu verstehen, sollte man einen groben Eindruck davon haben, wie Inodes aufgebaut sind, und welche Informationen sie beinhalten.&amp;lt;br&amp;gt;&lt;br /&gt;
Inodes werden innerhalb der Filesysteme in Inode-Listen geführt. Inodes sind definierte Datenstrukturen, die eine Datei eindeutig beschreiben und verwalten können. Die restlichen Blöcke im Filesystem, die nicht von den Inodes belegt werden, sind die Blöcke für die Daten. In den einzelnen Filesystemen gibt es kleine Unterschiede im Aufbau der Inodestruktur. Auch ist die Verwaltung der Inode in den einzelnen Filesystemen zum Teil sehr verschieden. In einem ext2/ext3 Filesystem zum Beispiel wird bei der Erstellung die Struktur für alle Inodes im Filesystem erzeugt und im Filesystemkopf ist die genaue Anzahl der Inodes im Filesystem festgehalten. In einem Reiserfs werden die Inodes erst erzeugt wenn sie wirklich benötigt werden. Auch besteht ein Unterschied zwischen den Inodes die sich in den Filesystemen auf der Festplatte befinden (Disk Inode), und den Inodes die bei der Bearbeitung im Speicher von Linux (in-core inode) benutzt werden. Auf diese Unterschiede wird hier nicht näher eingegangen. Als Beispiel wird hier etwas vereinfacht die Disk Inode eines ext2-Filesystems beschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aufbau der Inode in ext2 Filesystemen ==&lt;br /&gt;
Der Prinzipielle Aufbau eines Inode im ext2 Filesystem besteht in folgender Liste&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ '''schematischer Aufbau der ext2 Inode'''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:250px&amp;quot; | '''Strukturelement''' &lt;br /&gt;
| '''Erklärung'''&lt;br /&gt;
|-&lt;br /&gt;
| Dateimodus || definiert Dateitype und [[Zugriffsrechte]]&lt;br /&gt;
|-&lt;br /&gt;
| UID || userID des Besitzers der Datei&lt;br /&gt;
|-&lt;br /&gt;
| Dateigröße || in Byte&lt;br /&gt;
|-&lt;br /&gt;
| 4 Zeitstempel || letzter Zugriff, letzte Änderung, Inode Erstellung, letzte Löschung Inode&lt;br /&gt;
|-&lt;br /&gt;
| GUI || GruppenID der die Datei angehört&lt;br /&gt;
|-&lt;br /&gt;
| Links || Anzahl der Links (also Anzahl der Namen) dieser Datei&lt;br /&gt;
|-&lt;br /&gt;
| Flags || Wahlschalter für zusätzliche ext2 Eigenschaften&lt;br /&gt;
|-&lt;br /&gt;
| Datenblockadressen || Tabelle mit deren Inhalt die Addresse der Datenblöcke der Datei verwaltet werden&lt;br /&gt;
|-&lt;br /&gt;
| Versionsnummer || wird nur beim Anhängen über NFS verwendet&lt;br /&gt;
|-&lt;br /&gt;
| ACL || Verweise auf Zugriffskontrollisten&lt;br /&gt;
|- &lt;br /&gt;
| letztes Fragment || Adresse des letzten allokierten Teilblocks&lt;br /&gt;
|-&lt;br /&gt;
| Zusätzliche Teilblocke || Anzahl und Größe der zusätzliche benutzten Teilblöcke&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aufbau und Funktion der Datenblockadressen ===&lt;br /&gt;
Die Tabelle der Datenblockadressen hat fünfzehn Einträge, jeder Eintrag zeigt auf einen Datenblock der die eigentlichen Daten der Datei enthält. &lt;br /&gt;
* Die ersten 12 Einträge verweisen direkt auf die Datenblöcke&lt;br /&gt;
* Der dreizehnte ist ein indirekter Verweis, er verweist zwar auch nur auf einen einzigen Datenblock, doch in diesem kann wiederum auf 256 Datenblöcke verlinkt werden.&lt;br /&gt;
* Der vierzehnte Eintrag ist ein doppelt indirekter Verweis, mit seiner Hilfe könnten bis zu 256*256 Datenblöcke adressiert werden.&lt;br /&gt;
* Der fünfzehnte Eintrag ist ein dreifach indirekter Verweis, mit seiner Hilfe könnte bis zu 256*256*256 Datenblöcke adressiert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Bild soll die Struktur der Verknüpfung der Inode in einem ext2 Filesystem mit den Datenblöcken verdeutlichen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Inode.gif]]&lt;br /&gt;
&lt;br /&gt;
== Inode bei der täglichen Arbeit mit Filesystemen ==&lt;br /&gt;
&lt;br /&gt;
* Bei '''ls''' wird mittels der Option '''-i''' zu den Dateinamen die Inodenummer mit ausgegeben.&lt;br /&gt;
* Die für den Benutzer wichtigen Informationen einer Inode und damit Datei, kann man mit dem Befehl '''stat DATEINAME''' ausgeben.&lt;br /&gt;
* Die Gesamtanzahl der Inode in den Filesystemen und die belegten- und freien Inode kann man sich mit dem Befehl '''df -i''' anzeigen lassen.&lt;br /&gt;
* Sind in einem Filesystem keine Inode mehr frei, können keine Dateien mehr angelegt werden, auch wenn das Filesystem noch längst nicht voll ist. Dieses Problem könnte mit einigen Filesystemtypen in einem Filesystem mit sehr vielen sehr kleinen Dateien auftreten, wenn nicht schon bei der Erstellung des Filesystems extra eine hohe Anzahl von Inodes in Form von Optionen angegeben wurde. Bei einem ext2/ext3 Filesystem kann man das '''bytes-per-inode ratio''' mittels der Opition '''-i''' von '''mkfs.ext2''' bestimmen. Siehe dazu auch die Manpages der '''mkfs''' Befehle.&lt;br /&gt;
* die Anzahl der Inode, die einzelne User oder Gruppen in Filesystemen belegen dürfen, kann mit [[Disk Quota]] beschränkt werden.&lt;br /&gt;
&lt;br /&gt;
Die Informationen die der Befehl '''stat''' liefert:&lt;br /&gt;
&lt;br /&gt;
[[Image:F-stat.png]]&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Informationen und Links ==&lt;br /&gt;
&lt;br /&gt;
http://www.nongnu.org/ext2-doc/ext2.html#INODE-BITMAP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Benutzer:Robi|Robi]] 22:18, 23. Okt 2006 (CEST)&lt;br /&gt;
[[Category:Partitionen]]&lt;br /&gt;
[[Category:Linux-intern]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28909</id>
		<title>Diskussion:Verlorene Dateien wiederherstellen ext3 ext4</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Diskussion:Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28909"/>
		<updated>2013-01-24T09:40:46Z</updated>

		<summary type="html">&lt;p&gt;Itu: Die Seite wurde neu angelegt: „ Toller Artikel! --~~~~   ==foremost== Was ist mit dem tool foremost? Könnte man das auch noch beschreiben? --~~~~“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Toller Artikel! --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 10:40, 24. Jan. 2013 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==foremost==&lt;br /&gt;
Was ist mit dem tool foremost? Könnte man das auch noch beschreiben? --[[Benutzer:Itu|Itu]] ([[Benutzer Diskussion:Itu|Diskussion]]) 10:40, 24. Jan. 2013 (CET)&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28908</id>
		<title>Verlorene Dateien wiederherstellen ext3 ext4</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28908"/>
		<updated>2013-01-24T08:25:37Z</updated>

		<summary type="html">&lt;p&gt;Itu: hm, durch, so wie's aussieht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wird eine Datei gelöscht, dann bleiben die Datenblöcke dieser Datei von der Löschung unberührt. Die Löschung der Datei erfolgt in den Verwaltungsdaten ([[Inode]]) der Datei, sowie in den Verzeichnissen, wo die Inodenummer mit dem Dateinamen verknüpft wird. In einem ext3/4 Filesystem werden die Daten in der Inode soweit gelöscht, das es schwierig wird eine versehentliche Löschung wieder rückgängig zu machen. Lange Zeit war das etwas für Spezialisten und dem Filesystem Debugger. [http://linux.die.net/man/8/debugfs debugfs]&lt;br /&gt;
&lt;br /&gt;
Da es trotz größter Vorsicht hin und wieder mal jedem passieren kann, an dieser Stelle ein paar Hinweise und Links was heute auf ext3/4 möglich und machbar ist. Was man wissen sollte, und wie man vorgehen kann. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gelöschte Dateien auf einem ext3 oder ext4 Filesystem wiederherstellen ==&lt;br /&gt;
&lt;br /&gt;
=== Ein paar Einleitende Hintergrundinformationen ===&lt;br /&gt;
&lt;br /&gt;
Um die Probleme und Möglichkeiten die beim Herstellen von gelöschten Dateien bestehen einigermaßen zu verstehen, sollte man folgendes ansatzweise wissen.&lt;br /&gt;
Die Gesamtheit einer normalen Dateien bestehen im ext2/3/4 Filesystem aus mehreren Einzelkomponenten&lt;br /&gt;
; '''die Datenblöcken''' :&lt;br /&gt;
* dieses sind einzelne Blöcke die den Inhalt der Datei, also die reinen Daten, aufnehmen müssen. Je größer die Datei, umso mehr solche Datenblöcke gehören zu dieser Datei.&lt;br /&gt;
&lt;br /&gt;
; '''die [[Inode]]''' :&lt;br /&gt;
* hier stehen die Eigenschaften der Datei, wie Dateityp, Zugriffsrechte, User und Gruppe, Dateigröße usw. Die Inode adressiert aber auch über eine Art Zeigersystem die Datenblöcke. Das bedeutet, über die Inode sind alle Datenblöcke die zur Datei gehören erst auffindbar. Bei großen Dateien reicht die direkte Adressierungsmöglichkeit der Inode nicht aus und es werden zwischen die Datenblöcke weitere Adressblöcke geschrieben, die die Adressierung der Inode durch indirekter Adressierung erweitern. Die Daten von großen Dateien werden so sequentiell auf der Festplatte dann durch gelegentliche zusätzlich eingeschobene Verwaltungsblöcke unterbrochen. Große Dateien stehen also nicht in einem Stück auf der Festplatte, da Verwaltungsdaten dazwischen eingeschoben sind.&lt;br /&gt;
&lt;br /&gt;
; '''der Verzeichnisseintrag''' :&lt;br /&gt;
* das ist ein Eintrag in einer Verzeichnisdatei. In diesen Verzeichnissdateien wird eine Zuordnung von genau einem Dateinamen zu genau einer Inode gemacht. Hier bekommt eine Datei ihren Namen. Die einzelnen Einträge für die Dateien bilden innerhalb der Verzeichnissdateidaten eine verkettete Liste, mit deren Hilfe alle Dateien dieses Verzeichnisses aufgelistet/angesprochen werden können.&lt;br /&gt;
&lt;br /&gt;
; '''die Kette der Verzeichnisse''' :&lt;br /&gt;
* Auch die einzelnen Unterverzeichnisse sind in den Direktories mit einem Namen und der Inode der jeweils eingetragen. So bilden sie eine Art verketter Liste von der Wurzel des Dateisystems bis zum Verzeichnis in dem dann die Dateinamen enthalten sind. Aus den Verzeichnisnamen in dieser Kette wird der Path für diese Datei im Filesystem gebildet, und dieser zusammen mit dem Mountpoint ergibt dann die absolute Adresse einer Datei im gemounteten Filesystem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Änderungen am Filesystem werden in aller Regel nicht momentan ausgeführt. Das System nimmt den Filesystem Cache und buffert die Daten temporär. Automatisch wird ein &amp;quot;sync&amp;quot; alle paar Sekunden dann die Daten wirklich auf die Platte schreiben. Wird zB eine Datei verändert und unmittelbar danach sofort die ganze Datei gelöscht, dann wird die Änderung der Datei eventuell gar nicht erst auf die Platte geschrieben, sondern nur die Löschung. Wiederherstellen können wir nur das, was auf der Platte steht und nicht das was niemals auf die Platte geschrieben wurde.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Löschen von Dateien in ext3/4 passiert nun vereinfacht folgendes:&amp;lt;br&amp;gt;&lt;br /&gt;
es werden in der Inode die Zeiger auf die Datenblöcke gelöscht. Die Inode bekommt einen Zeitstempel als Lösch-Markierung, die Datenblöcke werden als &amp;quot;Frei verfügbar&amp;quot; markiert, und in den Verzeichnisdateien werden die Einträge mit dem Dateinamen und der dazugehörigen Inode ausgekettet (nicht gelöscht). Somit sind diese Dateinamen dann im Dateisystem bei normalen Zugriffen nicht mehr sichtbar. Es werden also nicht alle Spuren einer Datei beim Löschen endgültig beseitigt, im Gegenteil es wird gar nicht erst versucht. Es wird nur dafür gesorgt das sie nicht mehr zu sehen und zu finden ist und die belegten Datenbereiche dieser Datei wieder frei verfügbar sind. Bei ext3/4 ist im Gegensatz zu ext2 aber genau die Entfernung der Verlinkung in der Inode zu den Datenblöcken der Datei, ein Problem das ein rückgängig machen einer ausgeführten Löschung, ausgesprochen schwierig gestaltet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wiederherstellen von versehentlich gelöschten offene Dateien  ===&lt;br /&gt;
&lt;br /&gt;
==== Dateien aus dem /proc Verzeichnis wiedergewinnen ====&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann es vorkommen, und man löscht eine Datei versehentlich und merkt sofort: &amp;quot;Hilfe  diese Datei wird benötigt und ich habe sie auch gerade noch in einem anderem Programm in Benutzung&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Rechtzeitig bemerkt ist so was erst einmal nur Halb so schlimm. Solange eine Datei noch von einem Prozess geöffnet ist, existiert im Rechner noch der Verweis auf die Datei, und der entsprechende Prozess kann weiter mit dieser Datei arbeiten. In den Verzeichnissen ist die Datei schon nicht mehr sichtbar. Andere Prozesse können diese Datei jetzt also auch nicht mehr öffnen weil sie nicht mehr zu finden ist. Sobald der letzte Prozess, der auf eine solche schon gelöschte Datei, zugreift diese Datei schließt, oder dieser Prozess beendet wird, erst dann wird diese Datei dann endgültig im Filesystem gelöscht. Dieses Verhalten kann man zum Beispiel auch bemerken, wenn man versucht eine überlange aktuelle Logdatei zu löschen. Man hat eine riesengroße Datei zwar gelöscht, sieht sie auch nicht mehr mit '''&amp;quot;ls&amp;quot;''', aber der Speicherplatz dieser Datei wird einfach nicht freigegeben. Die Logdatei ist dann immer noch von einem Prozess geöffnet der hier nach wie vor in die scheinbar schon gelöschte Datei weiter schreibt. Die Datei kann also durchaus noch weiter anwachsen. Erst wenn dieser Prozess beendet wird, dann wird der Plattenplatz den diese Datei belegt hat, wirklich freigegeben.&lt;br /&gt;
&lt;br /&gt;
Eine solche Datei kann man mit dem Befehl [http://linux.die.net/man/8/lsof lsof] finden.&lt;br /&gt;
&amp;lt;pre&amp;gt; rob@dhcppc0:~/Dokumente&amp;gt; lsof -a +L1 /home&lt;br /&gt;
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NLINK    NODE NAME&lt;br /&gt;
more    5139  rob    3r   REG    8,6    72830     0 1143264 /home/rob/Dokumente/orig.txt (deleted) &amp;lt;/pre&amp;gt;&lt;br /&gt;
Wir sehen die Datei ist vom Befehl &amp;quot;more&amp;quot; mit der PID 5139  in Arbeit und wird als &amp;quot;deleted&amp;quot; angezeigt. In der Spalte '''FD''' finden wir '''&amp;quot;3r&amp;quot;''' Das Bedeutet: dieser Prozess greift mit dem Filediskriptor Nr '''3''' lesend ('''r''') zu.  &amp;quot;5w&amp;quot; würde dann also Filediskriptor 5 hat schreibenden Zugriff auf diese Datei.&lt;br /&gt;
&lt;br /&gt;
Diese Datei können wir jetzt im /proc Verzeichnis finden. &lt;br /&gt;
&amp;lt;pre&amp;gt;rob@dhcppc0:~/Dokumente&amp;gt; ls -l /proc/5139/fd/*&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/0 -&amp;gt; /dev/pts/0&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/1 -&amp;gt; /dev/pts/0&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/2 -&amp;gt; /dev/pts/0&lt;br /&gt;
lr-x------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/3 -&amp;gt; /home/rob/Dokumente/orig.txt (deleted)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings, können wir hier auch nicht direkt auf die schon gelöschte Datei zugreifen, aber wir können ihren Inhalt immer noch auslesen und diesen wieder als Datei neu schreiben. Dabei würde jetzt eine neue Datei mit gleichem Namen und gleichem Inhalt angelegt. &lt;br /&gt;
&amp;lt;pre&amp;gt;rob@dhcppc0:~/Dokumente&amp;gt; cat /proc/5139/fd/3 &amp;gt; /home/rob/Dokumente/orig.txt&lt;br /&gt;
rob@dhcppc0:~/Dokumente&amp;gt; ls -l /home/rob/Dokumente/orig.txt&lt;br /&gt;
-rw-r--r-- 1 rob users 72830  9. Dez 19:24 /home/rob/Dokumente/orig.txt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ganze funktioniert auf diese Weise solange wir es mit &amp;quot;nur zum Lesen geöffnet&amp;quot; Dateien haben. Ist diese Datei zum Schreiben geöffnet, können wir so auch jederzeit eine Momentaufnahme dieser Datei erzeugen. Doch danach wird der Prozess eventuell weiterhin in die alte, schon gelöschte Datei, weiter schreiben. Diese Änderungen werden dann natürlich nicht mehr in unsere neu angelegte Datei registriert. Wir haben ja nur eine Momentaufnahme als Kopie. So kann es hier sein, das wir die letzten Änderungen an einer solchen Datei verlieren. ZB bei  Datenbankdateien wäre so etwas dann allerdings fatal. Hier könnte zB [http://linux.die.net/man/1/tail tail] helfen, um die Datei mit allen Änderungen vollständig wieder herzustellen. Siehe auch [http://www.jfranken.de/homepages/johannes/vortraege/lsof_inhalt.de.html#ToC6 Beispiele]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ich habe gerade all meine Daten gelöscht,  Erste Hilfe ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Der ganze Abschnitt gefällt mir noch nicht so richtig , nach mehreren Versuchen bleibt er aber jetzt trotzdem erst mal so stehen ~~~~ --&amp;gt;&lt;br /&gt;
Selbstverständlich hat ja jeder immer ein aktuelles Backup all seiner Betriebssysteme und all seiner Daten und hat es auch schon erfolgreich getestet, dass er damit jederzeit alles wiederherstellen kann. Deshalb das folgende hier nur theoretischer Art. ;-) &amp;lt;br&amp;gt;&lt;br /&gt;
Jeder hat etwas anders auf dem Rechner und nicht jeder Rechner hat die selbe Nutzung, deshalb erstmal allgemeine Vorgehensweise unmittelbar nach dem man bemerkt hat, &amp;quot;hier sind wohl eben versehentlich wichtige Daten gelöscht worden&amp;quot;. Ziel ist es hier sicherzustellen, das man morgen wieder an die Daten kommt, die man heute gelöscht hat, auch wenn man heute noch überhaupt keine Ahnung davon hat, wie das gehen soll.   &lt;br /&gt;
&lt;br /&gt;
# zuerst möglichst keine vorschnellen unüberlegten Aktionen starten. Nicht ausschalten, nicht Platte ziehen, keine größeren Programme, Scripte oder Befehle&amp;lt;!--?--&amp;gt; nach starten   &lt;br /&gt;
# besser erstmals 3 Minuten lang nur den Kopf benutzen und versuchen überhaupt erst mal zu begreifen, was eventuell schief gelaufen sein könnte:  wann ging es noch ; was habe ich &amp;quot;falsch&amp;quot; gemacht ; was könnte betroffen sein? Letzte Befehle anschauen, letzte Fehlermeldungen verstehen.&lt;br /&gt;
# Was hier zuerst einmal ganz wichtig ist: jetzt unbedingt verhindern das dieser Datenstand automatisch als Backup gesichert wird und uns damit vielleicht noch das letzte vollständige Backup überschreibt. &lt;br /&gt;
# als nächstes mit &amp;quot;kleinen Befehlen&amp;quot; möglichst herausfinden: Geht überhaupt noch was? Welches Filesystem, welcher Verzeichnisbaum ist betroffen? was sind/waren dort für Dateien und Daten? Welche Prozesse/User/Dienste/Server greifen dort zu, welche davon könnten dort auch schreiben? Kann/darf ich diese Programme beenden, oder noch schlimmer, muss ich sie etwa beenden, weil ihnen Dateien unter dem Hintern weggelöscht wurden und sie jetzt deshalb nur noch Fehler produzieren und die Logdateien vollmüllen? &lt;br /&gt;
# Wichtig nachdem klar ist was in etwa alles gelöscht wurde: das entsprechenden Filesystem so gut es geht vor weiteren Schreibaktionen schützen: Wenn möglich Rechner beruhigen (zB Singleusermodus wenn man genügend Konsolenrfahrung dafür hat), ansonsten: Programme die schreibend zugreifen möglichst beenden, nicht benötigte Programme und Fenster schließen, keine weiteren Programme starten die auf dieses Filesystem zugreifen könnten. Bei betroffenen Homeverzeichnissen eventuell, neuen User anlegen dessen Home dann auf dem Rootfilesystem angelegt wird und als dieser User weiterarbeiten, Ziel ist möglichst das entsprechende Filesystem auf readonly zu remounten noch besser wenn möglich das Filesystem komplett umounten. Vorsichtshalber in der /etc/fstab Schreiberlaubnis für die betroffene Partition auch vorläufig entfernen.&lt;br /&gt;
# Was oftmals übersehen wird. Es handelt sich um ein Journal&amp;lt;!--ing --&amp;gt;filesystem. Das Journal wird auch weiterhin benutzt auch wenn man nichts in das Filesystem schreibt. ZB. wenn Dateien gelesen werden, dabei wird ein neuer a-time Zeitstempel in die Inode eingetragen. Auch solche Aktionen laufen über das Journal. Würde jetzt zB mit einem &amp;quot;find&amp;quot; der Rest des Filesystems durchsucht werden, würde je nachdem wie viel vom Filesystem nach dem Löschen noch übrig ist, eventuell eine ganze Menge ins Journal geschrieben. Jede dieser Schreibaktionen im Journal wird dabei alte Journaldaten überschreiben. Und es gibt Recoverprogramme die aus alten Journaldaten hervorragend wiederherstellen können. Also sollte man sich die alten Journaldaten nicht noch unnötig überschreiben, wenn man ein solches Programm nutzen möchte. Je früher man das Filesystem oder zumindestens das Journal jetzt aushängt und nicht weiter benutzt, desto mehr Dateien werden solche Programme finden können. &lt;br /&gt;
# Informationen sammeln: Parititionsgrößen, Mountpoints, Filesystemtyp, wie viel ist im Moment belegt, wie viel könnte es vorher gewesen sein, Datentypen, Homeverzeichnisse anderer User betroffen? Dann diese auch informieren und auch dort Informationen sammeln. Wenn möglich welche Verzeichnisstruktur war auf der Platte, bzw. was ist davon verschwunden. Wo habe ich im Rechner eventuell noch Platz, um temporär Dateien zwischenzuspeichern. Eventuell muss man sich Prioritäten setzen: was brauche ich an Dateien unbedingt wieder; auf was kann ich notfalls verzichten; was wäre eventuell ganz unwichtig.&lt;br /&gt;
# Ist das betroffene Filesystem soweit beruhigt, dass möglichst nichts mehr neu geschrieben werden kann (auch nicht nach einem eventuellem reboot) und die wichtigsten Informationen eingesammelt sind, erst dann geht es weiter.&lt;br /&gt;
# Möglichst an dieser Stelle jetzt eine Kopie der Partition als Image oder auf eine andere Platte erzeugen. (1 zu 1, nicht komprimiert). Eine solche Kopie kann mit [[dd]] erzeugt werden, wichtig hierbei die Partition sollte möglichst umountet sein, maximal aber Readonly. Mit einer solchen Kopie zB auf einer USB-Platte hat man jetzt theoretisch unendlich viel Zeit und unendlich viele Versuche die wichtigen Dateien wieder herzustellen. Dazu muss aber entweder das Original, oder die Kopie vom Original, von jeglichen Versuchen kategorisch ausgeschlossen werden. Dieses wird immer nur zum Lesen benutzt und zwar um wieder eine neue Kopie davon zu machen, für den nächsten Versuch die Dateien wieder herzustellen.     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Datenwiederherstellen benötigt man mindestens 3 Dinge: Internetzugang, um an die richtigen Howtos und die Programme zu kommen, genügend Plattenkapazität, um die wiederhergestellten Dateien schreiben zu können, und reichlich Zeit. Erfahrungsgemäß fehlt einem immer eines. :-) man wird es aber trotzdem brauchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateien anhand ihres Type mit einem Flächenscan aus den Datenblöcken wieder gewinnen ===&lt;br /&gt;
&lt;br /&gt;
Die nackten Datenblöcke der Dateien bleiben als solche bei den allermeisten Filesystemen auch beim Löschen vollkommen intakt auf der Festplatte zurück. Man muss eine Platte schon gezielt überschreiben, damit man nicht mehr an alte Dateien herankommt. Liest man die gesamte Partition Block für Block aus und schaut sich die einzelnen Blöcke insbesondere den Blockanfang an, wird man dort an bestimmten Eigenschaften den Beginn von bestimmten Dateitypen erkennen können. Ist die Datei größer als die Blockgröße, dann wird man wahrscheinlich im nächsten Block die Fortsetzung dieser Datei finden. Auch das Ende vieler Dateien kann man erkennen. Meist ist der Rest hinter einer Datei mit Nullen bis zum Blockende gefüllt. Es ist also möglich hintereinander liegende Datenblöcke zu Dateien zusammen zu bauen. Wenn das ein einigermaßen intelligentes Tool macht, und dieses auch noch ein bisschen Ahnung vom Filesystem hat, dann hat man sogar die Chance auch Dateien aus Blöcken wiederzufinden und zusammen zu bauen, die auf der Platte fragmentiert vorliegen. Tools die so nach verlorenen Dateien suchen gibt es eine ganze Menge.&lt;br /&gt;
&lt;br /&gt;
Das Problem dabei. Es werden in aller Regel nicht nur die verlorenen Dateien wieder gefunden die man benötigt, sondern auch solche, die man nicht verloren hat, sowie jede Menge Kopien davon und jede Menge Dateien die man schon vor ewiger Zeit gelöscht hat, und auch mehr oder weniger viele, die mittlerweile fehlerhaft oder komplett defekt sind. Ein gutes Tool ist jetzt in der Lage bei einigen Dateitype, insbesondere bei Dateien welche Metadaten in sich bergen den Dateinamen und einige Eigenschaften wieder richtig zu setzen. Für einige Dateitypen wird eventuell noch der gefundenen Datei wieder eine richtige Dateiendung gegeben, die auf den wahrscheinlichsten Datentyp hinweist. Diese Tools sind aber nicht in der Lage den gefundenen Dateien allen ihre ursprünglichen Namen wieder zugeben, geschweige denn zu entscheiden, in welches Verzeichnis gehört die Datei und welchem User hat die Datei gehört. Nach dem Einsatz solcher Tools kann man sich nicht selten Stunden und Tage damit befassen, Dateien zu sichten, zu sortieren und ihnen neue Namen zu geben. Eventuell helfen Scripte dabei. Allerdings sind die Probleme dabei so vielfältig und in jedem Fall anders gelagert, das es dazu nicht wirklich etwas universelles gibt. Dieses Verfahren eignet sich vor allem für gelöschte Datendateien, Bilder, Musik, Dokumente usw. Der Versuch dieses Verfahren auf das Rootfilesystem anzuwenden, würde wahrscheinlich zu nichts weiter als zu Datenschrott führen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== PhotoRec ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cgsecurity.org/wiki/PhotoRec_DE PhotoRec] ist ein Tool aus [http://www.cgsecurity.org/wiki/TestDisk_DE TestDisk] &lt;br /&gt;
Mit seiner Hilfe ist es möglich verlorene oder gelöschte Dateien durch einen Scan des Datenträgers wiederzufinden. '''PhotoRec''' unterstützt viele Dateisysteme und ist nicht mal auf ein funktionierendes Filesystem angewiesen, kann also Dateien auch noch finden wenn das Filesystem schwer beschädigt oder eventuell neu formatiert wurde.&lt;br /&gt;
Es kennt eine ganze Reihe von [http://www.cgsecurity.org/wiki/Wiederherstellbare_Dateiformate_unter_PhotoRec Dateitypen], die es wieder herstellen kann.&lt;br /&gt;
&lt;br /&gt;
Testdisk sollte man in verschiedenen Distributionen und auf verschiedenen Hilfs- CD/DVDs finden. Unter OpenSuse sollten fertige [http://packages.opensuse-community.org/index.jsp?searchTerm=testdisk&amp;amp;distro=openSUSE_111 Pakete bei Packman] zu finden sein.  &lt;br /&gt;
&lt;br /&gt;
Die Benutzung von PhotoRec ist in diesem [http://www.cgsecurity.org/wiki/PhotoRec_Schritt_f%C3%BCr_Schritt HOWTO] wohl gut genug beschrieben, so das wir das hier gar nicht erst versuchen müssten.&lt;br /&gt;
&lt;br /&gt;
Das Hauptproblem dürfte meist erst auftreten, wenn PhotoRec mit seiner Arbeit fertig ist. Es wird oftmals nicht leicht sein all die Dateien zu sortieren die dort gefunden werden. [http://www.cgsecurity.org/wiki/Nach_dem_Gebrauch_von_PhotoRec Hier] und an vielen anderen Stellen i, Netz wird man sicherlich Tipps und Tricks dazu finden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Die Dateien mit Hilfe alter Filesystem-Journaldaten wieder herstellen ===&lt;br /&gt;
&lt;br /&gt;
Das Prinzip dahinter ist folgendes. ext3/4 ist ein Journalfilesystem. Bevor Änderungen an der internen Filesystemstruktur vorgenommen werden, werden diese Änderungen in einer Art Aufgabenbuch, dem sogenanntem Journal, auf die Platte geschrieben. Erst dann werden die Änderungen an dem Filesystem selbst vorgenommen. Ist die Änderung im Filesystem abgeschlossen, werden die Aufgaben im Journal als &amp;quot;erledigt&amp;quot; markiert. Damit wird gesichert, dass auch bei einem Rechnerabsturz das Filesystems konsistent bleibt und ermöglicht eine schnelle Wiederherstellung des Filesystems nach einem Absturz. In diesem Fall müssen dann nur die noch offenen Änderungen im Journal abgearbeitet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Zu den Daten die dort im Journal abgelegt werden gehören die Blöcke in denen die Inode enthalten sind. Dort im Journal befinden sich also Kopien von alten Inodedaten. Und diese stehen dort oftmals einen längeren Zeitraum. Da immer ganze Inode Blöcke dort abgelegt werden, ist die Wahrscheinlichkeit sehr groß, dass man von vielen Dateien dort auch eine alte Inode findet. &lt;br /&gt;
&lt;br /&gt;
Hier sind also genau die Informationen die uns zB. nach dem Löschen von Dateien fehlen würden, um eine Datei komplett wieder herzustellen. Das Problem ist jedoch jetzt die richtige Kopie einer Inode zu finden, die genau die Daten der Inode einer Datei vor dem Löschen enthält. Meist sind von Dateien mehrere, oftmals sehr viele alte Kopien dort zu finden. Gelöschte Dateinamen stehen immer noch mit der ehemaligen Inodenummer in den Datenblöcken der Verzeichnisdateien. Dort müsste der Datenblock nur roh ausgelesen werden um den ehemaligen Dateinamen und die dazugehörige Inode zu ermitteln. Von dieser Inode benötigen wir jetzt aus dem Journal die älteste Kopie die noch keinen Löschzeitstempel hat. Aus den Daten dieser Inodekopie kann jetzt über die Links zu den Datenblöcken, die Datei wieder hergestellt werden. Die anderen Eigenschaften der gelöschten Datei stehen auch in dieser Inode. Die Datenblöcke auf die diese Inodekopie verweist, sind zwar im Filesystem derzeit als &amp;quot;frei verfügbar&amp;quot; markiert, die Wahrscheinlichkeit dass sie jedoch noch nicht anderweitig benutzt wurden, ist groß. Damit könnte jetzt problemlos eine Kopie der gelöschten Datei erzeugt werden. Programme die das können sind '''ext3grep''' ; '''extundelete''' ; '''ext4magic''' &lt;br /&gt;
&lt;br /&gt;
Haben wir uns eine Datei überschrieben, zB weil wir statt mit der Umleitung &amp;quot;''&amp;gt;&amp;gt; Dateiname''&amp;quot; (die soviel bedeutet wie, Ausgabe am Ende der Datei Dateiname weiter schreiben) mit der Umleitung &amp;quot;''&amp;gt; Dateiname''&amp;quot; (Ausgabe in Datei Dateiname schreiben), gearbeitet haben, dann könnte über das Journal auch in diesem Fall die Informationen gewonnen werden, um den alten Dateistand wieder herzustellen. Automatische Funktionen dafür gibt es in den hier vorgestellten Programmen derzeit wohl nun bei '''ext4magic'''. Mit Hilfe von '''ext3grep''' wäre es mit einigem Hintergrundwissen noch manuell möglich. Mit '''extundelete''' scheint das derzeit überhaupt nicht möglich zu sein.     &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ext3grep ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Einleitung''' : &amp;lt;br&amp;gt;&lt;br /&gt;
'''[http://groups.google.com/group/ext3grep/web/ext3grep-source-code-and-overview ext3grep]''' ist ein Konsolenprogramm von Carlo Wood. Es wurde wohl ursprünglich aus der Not heraus entwickelt. Die allgemeine Vorgehensweise und das Prinzip sind in seinem [http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html Howto] sehr schön beschrieben. Carlo Wood hatte die revolutionäre Idee aus dem Filesystem-Journal Backups von früheren Inodeblöcken die Daten zu gewinnen mit deren Hilfe die gelöschten Dateien wieder hergestellt werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vorteile''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Es können gezielt Kopien sowohl von einzelnen gelöschte Dateien, oder auch von allen als gelöscht erkannten des Filesystems mitsamt Dateinamen mit dem Pfad und original Zugriffsrechten und Zeitstempel wieder hergestellt werden. Man kann dabei den Löschzeitraum zeitlich eingrenzen, so das man gezielt nur versucht solche Dateien wieder zu gewinnen, die während diesem Zeitraum gelöscht wurden. Es kann eine Liste aller in Verzeichnisdatenblöcken gefundenen Dateinamen erstellt werden. Möglich sind auch Zeit Histogramme aus den Inodedaten, zB um die Anzahl der Löschvorgänge im zeitlichen Zusammenhang anzuzeigen. Damit ist es möglich den interessanten Löschzeitraum gut einzugrenzen. Eine Reihe von zusätzliche Optionen ermöglichen eine sehr gute und hilfreiche Informationen aus dem Filesystem und aus dem Journal für das Auffinden von gelöschten oder verlorenen Dateien auch in speziellen Problemfällen. Mit diesen Informationen ist es mit etwas Hintergrundwissen auch durchaus möglich per Hand bestimmte ältere Dateistände von Dateien wieder herzustellen. Einfaches normales Wiederherstellen einer erst kürzlich gelöschten Datei ist damit auch ohne spezielle Kenntnisse mit nur wenigen Optionen für die meisten Linuxuser fast problemlos auf der Konsole machbar.       &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''kleine Mängel''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm arbeitet relativ langsam, da es einmalig aufwendige Scans nach allen Dateinamen über das gesamte Dateisystem macht. Größere Filesysteme haben dabei entsprechend sehr lange Laufzeiten, auch wenn nur sehr wenige Dateien wieder hergestellt werden sollen. Bei einem erneutem Aufruf von ext3grep auf dem selben Filesystem ist es dann recht flott, da die Daten nur einmalig gescannt werden brauchen und in Logdateien abgelegt werden. &lt;br /&gt;
Es ist sehr viel im Programm starr einprogrammiert worden. Dadurch ist es nicht flexibel genug, um alle möglichen Eigenschaften des Filesystems zu berücksichtigen. ext4 Filesysteme funktionieren zum Beispiel gar nicht. Unterstützt werden nur [http://de.wikipedia.org/wiki/Byte-Reihenfolge Little Endian] (Intel x86) Systeme. Das Programm wird scheinbar vom Entwickler selbst z.Z. nicht mehr ernsthaft weiterentwickelt und ist auch im Quelltext nicht sonderlich übersichtlich und strukturiert, so das auch andere Entwickler hier nur sehr schwer einen Einstieg für eine Weiterentwicklung finden werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fazit''' (des Autor dieses Wikibeitrages) :&amp;lt;br&amp;gt;&lt;br /&gt;
Einfach genial für Standard ext3, aber leider nicht flexibel genug für ext4. Geeignet für kleine und mittlere Filesysteme wenn viele Dateien wieder hergestellt werden sollen. Sehr gut geeignet auch um Informationen aus dem Filesystem für manuelles Wiederherstellen bei extremen Problemfällen zu gewinnen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Installation von ext3grep =====&lt;br /&gt;
&lt;br /&gt;
Einige Distributionen scheinen es per Paket oder per default zu unterstützen. Für OpenSuse müsste es bei Bedarf selbst kompiliert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Benötigt werden die allgemeinen Entwicklertools mit '''C++''' sowie die Header von  '''e2fsprogs'''&lt;br /&gt;
&lt;br /&gt;
Im einzelnen wären folgende Pakete mit ihren Abhängigkeiten zu installieren : '''gcc ; gcc-c++ ; make ; e2fsprogs-devel''' &lt;br /&gt;
&lt;br /&gt;
Quellcodearchiv downloaden&lt;br /&gt;
  wget http://ext3grep.googlecode.com/files/ext3grep-0.10.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
Archiv auspacken&lt;br /&gt;
 tar -xzf ext3grep-0.10.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
in das Verzeichnis wechseln, dort '''configure''' und '''make''' ausführen.&lt;br /&gt;
 cd ext3grep-0.10.1/&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
Das Ergebnis ist eine ausführbare Datei namens '''ext3grep''' im Unterverzeichnis '''src/''' &amp;lt;br&amp;gt;&lt;br /&gt;
Zu installieren braucht man das Programm nicht unbedingt, es reicht wenn man es in ein Arbeitsverzeichnis kopiert oder man könnte es auch dort an Ort und Stelle ausführen, wo es kompiliert wurde. Dadurch kann es, wenn man es nur einmalig benötigt, anschließend auch schnell wieder gelöscht werden. &lt;br /&gt;
 cp src/ext3grep /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 cd /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 ./ext3grep --help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Hinweise und Beispiele zur Benutzung =====&lt;br /&gt;
&lt;br /&gt;
Es wird dringend empfohlen mit einer Kopie des entsprechenden Filesystems zu arbeiten. Wo das nicht möglich ist, geht es auch mit dem Filesystem selbst, nur sollte es auf keinem Fall in dieser Zeit mit Schreibzugriff eingehängt sein. Wenn man mit einer Image-Kopie vom Filesystem arbeitet, benötigt man keine Rootrechte, kann dann allerdings ohne Rootrechte auch die Dateien nicht mit ihren Orginal Zugriffsberechtigungen erstellen. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Arbeitsverzeichnis sollte genügend freie Plattenkapazität vorhanden sein, da dorthin die wiederhergestellten Dateien geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn ext3grep das Filesystem scannt, legt es im aktuellem Verzeichnis 2 Dateien an. '''FILESYSTEMNAME.ext3grep.stage1 '''und''' FILESYSTEMNAME.ext3grep.stage2'''&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Dateien bitte nicht per Hand manipulieren, auch wenn das noch so verlockend ist. Diese Dateien müssen jedes mal gelöscht werden (damit sie bei erneuter Verwendung von ext3grep wieder neu erzeugt werden) nachdem man das Filesystem wieder schreibend eingehängt hat oder zB  ein anderes Filesystem mit dem selben Kopienamen bearbeiten will. Sonst kommt ext3grep durcheinander.&lt;br /&gt;
&lt;br /&gt;
Die wiederhergestellten Dateien landen in einem Unter-Verzeichnis  '''&amp;quot;RESTORED_FILES/&amp;quot;''' das ext3grep selbst anlegt.&lt;br /&gt;
Es werden für einige Optionen Zeitangaben im Sekundenformat seit 1970 benötigt. Diese kann man zB wie folgt ermitteln, oder in der [http://linux.die.net/man/1/date Manpage von date] nachlesen.&lt;br /&gt;
 date +%s                             #jetzt&lt;br /&gt;
 date -d &amp;quot;&amp;quot; +%s                       #heute 0:00 Uhr&lt;br /&gt;
 date -d &amp;quot;-1 day&amp;quot; +%s                 #gestern um diese Zeit&lt;br /&gt;
 date -d &amp;quot;2009-12-10 15:28:42&amp;quot; +%s&lt;br /&gt;
&lt;br /&gt;
Alle Befehlsoptionen anzeigen lassen, allgemeine Hilfe&lt;br /&gt;
 ./ext3grep --help&lt;br /&gt;
&lt;br /&gt;
Test auf prinzipielle Unterstützung des Filesystems, auslesen des Filesystem Superblocks, ('''test.iso''' ist hier ein Filesystemimage)&lt;br /&gt;
 ./ext3grep test.iso&lt;br /&gt;
&lt;br /&gt;
Ein Histogramm erzeugen, um herauszufinden, wann wie viele Dateien gelöscht wurden, Damit lässt sich der interessante Zeitbereich sehr genau bestimmen (Zeitoptionen wie oben beschrieben)&lt;br /&gt;
 ./ext3grep --histogram=dtime --after=1202351086 --before=1202351129&lt;br /&gt;
&lt;br /&gt;
Alle Dateien wiederherstellen, die ab einer bestimmten Zeit gelöscht wurden&lt;br /&gt;
 ./ext3grep test.iso --restore-all --after=1260399600 &lt;br /&gt;
&lt;br /&gt;
Eine Liste der Dateinamen erzeugen von denen ext3grep annimmt, sie wiederherstellen zu können&lt;br /&gt;
 ./ext3grep test.iso --dump-names&lt;br /&gt;
&lt;br /&gt;
Eine einzelne ganz bestimmte Datei &amp;quot;'''Verzeichnis/Path/dateiname.txt'''&amp;quot; wiederherstellen. Der Path zur Datei beginnt mit dem Wurzelverzeichnis aus der Sicht dieses Filesystems und darf nicht mit '''&amp;quot;/&amp;quot;''' beginnen. Der Dateiname muss in der oben erzeugten Liste enthalten sein. &lt;br /&gt;
 ./ext3grep test.iso --restore-file Verzeichnis/Path/dateiname.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
# '''Das Programm ist und bleibt &amp;quot;Beta&amp;quot;'''&lt;br /&gt;
# Es geht hier nur ext3, wenn ein ext3 Filesystem mit ext4 beschrieben wurde, oder nach ext3 konvertiert wurde, wird es nicht funktionieren oder nur unzureichende Ergebnisse liefern&lt;br /&gt;
# Niemals, und auf gar keinen Fall versuchen, Dateien aus dem selben Filesystem wiederherzustellen, in das man gerade die wiederhergestellten Dateien wieder hinein schreibt :-)&lt;br /&gt;
# Wann immer möglich keinen Filesystemcheck nach dem Löschen und vor dem Recoverversuch durchführen, besonders keinen, wo man Fragen beantworten soll. Wenn der Rechner vor dem Recoverversuch noch rebootet oder ausgeschalten werden muss und man keine Kopie hat, prüfen ob man den Eintrag in der /etc/fstab auf readonly umändern kann und im sechtem&amp;lt;!-- ???? --&amp;gt; Feld mit einer &amp;quot;0&amp;quot; den Filesystemcheck verhindern kann&lt;br /&gt;
# Möglichst den Zeitraum einschränken oder genaue Dateinamen angeben, damit nicht Unmengen uralte Dateien wiederhergestellt werden.&lt;br /&gt;
# Es wird mit diesen hier vorgestellten einfachen Optionen der Stand vor dem letztem Löschvorgang einer Datei hergestellt. &lt;br /&gt;
# Nicht wirklich jede Datei wird sich jederzeit auch so wiederherstellen lassen, Ein Backup ersetzt dieses Tool also keinesfalls &lt;br /&gt;
# Möglichst nicht erst viel im Filesystem weiter schreiben&lt;br /&gt;
# Die wiederhergestellten Dateien sollten gründlich kontrolliert werden, auf Vollständigkeit und ordnungsgemäßen Inhalt&lt;br /&gt;
# je nach Füllstand und Durchsatz können einzelne Dateibestandteile schon ganz oder teilweise neu überschrieben und schon wieder gelöscht sein. Daraus könnte im Einzelfall durchaus auch mal ein scheinbar ganz falscher Inhalt der wiederhergestellten Dateien resultieren.&lt;br /&gt;
# Gerätedateien Pipes u.ä. werden nicht unterstützt&lt;br /&gt;
# Eventuell werden ehemalige Hardlinks jetzt zu selbständigen Dateien (Auch den Hinweis über die Hardlinks im [http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html Howto] lesen.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== extundelete ====&lt;br /&gt;
&lt;br /&gt;
'''Einleitung''': &amp;lt;br&amp;gt;&lt;br /&gt;
[http://extundelete.sourceforge.net/ extundelete] ist eine Überarbeitung der Idee von ext3grep. Im Unterschied zu '''ext3grep''' benutzt '''extundelete''' die Funktionen des [http://e2fsprogs.sourceforge.net/ ext2fs library] zu. Dadurch können recht schnell auch aus großen Filesystemen einzelne Dateien wiederhergestellt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vorteile''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Sehr brauchbare Laufzeiten auch in großen Filesystemen. Flexibel sowohl auf ext3 wie ext4. Analoge Funktionen und ebenfalls weitestgehende analoge Befehls-Optionen zu ext3grep. Durch die Benutzung der Libraryfunktionen erhält es automatisch die notwendige Flexibilität für eine gute Unterstützung des ext3/4 Filesystems. Unterstützung auf für Big Endian. Es können hiermit auch gezielt Verzeichnissbäume und Dateilisten wiederhergestellt werden.&lt;br /&gt;
Das Wiederherstellen von Dateien ist ohne großartige Spezialkenntnisse von jedermann möglich. Für viele Distributionen als Paket erhältlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''kleine Mängel''' : &amp;lt;br&amp;gt;        &lt;br /&gt;
Es sind noch längst nicht alle ursprünglich beabsichtigten Funktionen implementiert. Die Weiterentwicklung scheint mehr oder weniger eingeschlafen zu sein. Derzeit kann nur der reine Dateiinhalt wiederhergestellt werden. Nützliche Zusatzfunktionen, wie in ext3grep, sind leider derzeit nicht implementiert. ''extundelte'' ist derzeit nicht mit den aktuellsten Versionen von libext2fs (1.42) nutzbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fazit''' (des Autor dieses Wikibeitrages) :&amp;lt;br&amp;gt;&lt;br /&gt;
Projekt mit guten Potential. Einfach in der Anwendung und einige Tests und  Wiederherstellungen von Dateien und Verzeichnissen sowohl auf ext3 wie ext4 begeistern jedoch, auch wenn mehr oder weniger &amp;quot;nur&amp;quot; die reinen Dateidaten mit ihrem Namen und Pfad möglich sind. Die Datendateien sind das Wichtigste, das scheint prima zu funktionieren. Leider bleiben Fragen zu Problemen selbst in den offiziellen Mailinglisten oftmals unbeantwortet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Installation von undelete =====&lt;br /&gt;
&lt;br /&gt;
Soweit ''undelete'' nicht als Paket erhältlich sein sollte (Einige Distributionen bieten derzeit fertige Installationspakete an), bitte immer die aktuellste Version nehmen, hier wurde die Version 0.1.8 getestet. Kompilieren ist recht einfach, ähnlich ext3grep  &amp;lt;br&amp;gt; &lt;br /&gt;
Benötigt werden genauso die allgemeinen Entwicklertools mit '''C++''' sowie die Header von '''e2fsprogs''' unterstützte Versionen 1.41.9 bis 1.41.14&lt;br /&gt;
&lt;br /&gt;
Im Einzelnen wären folgende Pakete mit ihren Abhängigkeiten zu installieren : '''gcc ; gcc-c++ ; make ; e2fsprogs-devel''' &lt;br /&gt;
&lt;br /&gt;
Quellcodearchiv downloaden&lt;br /&gt;
  wget http://sourceforge.net/projects/extundelete/files/extundelete/0.1.8/extundelete-0.1.8.tar.bz2/download&lt;br /&gt;
&lt;br /&gt;
Archiv auspacken&lt;br /&gt;
 tar -xjf extundelete-0.1.8.tar.bz2&lt;br /&gt;
&lt;br /&gt;
in das Unterverzeichnis &amp;quot;extundelete*/src&amp;quot; wechseln dort '''make''' ausführen. ( bei neueren Versionen erst &amp;quot;./configure&amp;quot;)&lt;br /&gt;
 cd extundelete-0.1.8/src/&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis ist eine ausführbare Datei mit Namen '''extundelete''' im Unterverzeichnis '''src/'''  &amp;lt;br&amp;gt;&lt;br /&gt;
Installieren braucht man das Programm nicht unbedingt, es reicht wenn man es in ein Arbeitsverzeichnis kopiert oder man könnte es auch dort an Ort und Stelle ausführen, wo es kompiliert wurde. Dadurch kann es, wenn man es nur einmalig benötigt wird, anschließend auch schnell wieder gelöscht werden. &lt;br /&gt;
 cp extundelete/TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 cd /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 ./extundelete --help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Hinweise und Beispiele zur Benutzung =====&lt;br /&gt;
&lt;br /&gt;
Es wird dringend empfohlen mit einer Kopie des entsprechenden Filesystems zu arbeiten. Wo das nicht möglich ist, geht es auch mit dem Filesystem selbst, nur sollte es auf keinem Fall in dieser Zeit mit Schreibzugriff eingehängt sein. Wenn man mit einer Image-Kopie vom Filesystem arbeitet wird, benötigt man theoretisch keine Rootrechte. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Arbeitsverzeichnis sollte genügend freie Plattenkapazität vorhanden sein, da dorthin die wiederhergestellten Dateien geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Bei '''extundelete''' werden im Gegensatz zu '''ext3grep''' keine &amp;quot;stage&amp;quot;-Dateien angelegt auf die man gegenenfalls achten muss. Abgelegt werden die Dateien ebenfalls in einem Unterverzeichnis des aktuellem Verzeichnisses  mit dem Namen '''&amp;quot;RECOVERED_FILES/&amp;quot;''' &amp;lt;br&amp;gt;&lt;br /&gt;
Im Gegensatz zu '''ext3grep''' werden jedoch Dateien die mehrmals restored werden, dort nicht jedes mal überschrieben, sondern bekommen zusätzlich noch eine Endung &amp;quot;'''.v1 .v2 .v3''' ......&amp;quot; an den Dateinamen angehängt, so das man dann bei mehrere Versuchen auch mehrere Versionen ein und der selben Datei hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Einen Überblick über die derzeit aktuell unterstützten Optionen kann man auch [http://extundelete.sourceforge.net/options.html hier] finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Beispiele:'''&lt;br /&gt;
&lt;br /&gt;
Eine einzelne Datei wiederherstellen: es muss auch hier der komplette Pfad zur Datei wie bei '''ext3grep''' angegeben werden. ''(Das ist im Moment noch etwas schwierig, da die Option ''--dump-names'' noch nicht implementiert ist.)''&lt;br /&gt;
 ./extundelete test.iso --restore-file dir/subdir/filename&lt;br /&gt;
&lt;br /&gt;
Ein komplettes Verzeichnis recursiv wiedergewinnen. (Verzeichnis hier &amp;quot;testdir/&amp;quot; im Root des Filesystems)&lt;br /&gt;
 ./extundelete test.iso --restore-directory testdir &lt;br /&gt;
&lt;br /&gt;
Eine Dateiliste wiederherstellen. Die Liste besteht aus den Dateinamen mit Pfad. Eine Datei pro Zeile. also zB so hier&lt;br /&gt;
&amp;lt;pre&amp;gt;# cat filename.log&lt;br /&gt;
test8/datei_follow.log&lt;br /&gt;
test8/test5&lt;br /&gt;
test8/test5/.Hallo1&lt;br /&gt;
test8/test5/.Hallo2&lt;br /&gt;
test8/test5/.Hallo3&lt;br /&gt;
test8/test5/.Hallo4&lt;br /&gt;
test8/test6&lt;br /&gt;
test8/test6/dir1&lt;br /&gt;
test8/test6/dir1/dir2&lt;br /&gt;
test8/test6/dir1/dir2/dir3&lt;br /&gt;
test8/test6/dir1/dir2/dir3/dir4&lt;br /&gt;
test8/test6/dir1/dir2/dir3/dir4/Testdatei.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
Achtung: Der Befehl ist nicht zu verwechseln mit dem zum Wiederherstellen nur einer einzigen Datei&lt;br /&gt;
 ./extundelete test.iso --restore-files filename.log&lt;br /&gt;
&lt;br /&gt;
Alle als gelöscht zu findenden Dateien restaurieren. &lt;br /&gt;
 ./extundelete test.iso --restore-all&lt;br /&gt;
&lt;br /&gt;
Besser ist es jedoch den Löschzeitraum möglichst genau einzuschränken, damit nicht uralte Dateien mit hergestellt werden. Die Zeitangabe auch hier in Sekunden seit 1970. (Hier im Beispiel mal gleich in der Befehlszeile erledigt.) Es sollen alle Dateien die vor mindestens 16 Stunden aber höchstens vor 18 Stunden gelöscht wurden wiederhergestellt werden. &lt;br /&gt;
 ./extundelete test.iso --after $(date -d &amp;quot;-18 hour&amp;quot; +%s) --before $(date -d &amp;quot;-16 hour&amp;quot; +%s) --restore-all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hinweise :'''&lt;br /&gt;
&lt;br /&gt;
Allgemein gilt dasselbe wie bei ext3grep.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ext4magic====&lt;br /&gt;
&lt;br /&gt;
Mit [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic ext4magic] entsteht derzeit ein weiteres Konsolentool, welches das Wiederherstellen von Dateien aus Journaldaten ermöglicht. Es baut auf den Erfahrungen von ext3grep und extundelete auf, und geht dabei ein paar Schritte weiter. Es ermöglicht auch die Wiederherstellung der User- und Zugriffsrechte, der Zeitstempel, unterstützt mit Ausnahme von Sockets alle Dateitypen und auch Hardlinks. Auch das Wiederherstellen von Dateiattributen ist möglich und kann optional beim compilieren aktiviert werden. Das Wiederherstellen überschriebener Dateien/Verzeichnisse oder älterer Dateiversionen ist in gewissem Mass möglich, soweit die Journaldaten dafür ausreichend sind. Unterstützt wird dabei sowohl ext3 als auch ext4.&lt;br /&gt;
&lt;br /&gt;
Das Programm hat eine Vielzahl von Anzeigeoptionen und ermöglicht somit auch Untersuchungen am Filesystem. Somit können über die Nutzung der Journaldaten Manipulationen und Änderungen an Dateien und Verzeichnissen ermittelt und verfolgt werden, soweit sich die Daten dazu noch im Journal befinden. Die Vielzahl der Funktionen macht dieses Programm jedoch in der Anwendung nicht ganz einfach.     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Weitere Möglichkeiten und Funktionen =====&lt;br /&gt;
&lt;br /&gt;
In Entwicklung dort ist ein mehrstufiges Recover welches speziell für den Fall eines versehentlich rekursiven Löschens abgestimmt ist. Wird das Filesystem nach einem solchem Löschvorgang baldmöglichst umountet und nicht weiter benutzt hat man mit den neuen Magic-Funktionen (derzeit verfügbar für ext3 in Versionen 0.2.x und für ext4 in Versionen 0.3.x ) sehr gute Chancen auch Dateien wiederherstellen zu können, von denen keine alte Inodekopie mehr vorhanden sind. Ermöglicht wird das durch ein mehrstufiges Verfahren. Im ersten Schritt werden alle Dateien wiederhergestellt die aus Inodekopien im Journal gewonnen werden können. Nachfolgend wird mit einem neuen sehr speziell auf das Filesystem abgestimmten [http://www.forensicswiki.org/wiki/File_Carving File Carving Verfahren] versucht, auch die Dateien zu finden, von denen keine Inodekopie mehr vorhanden sind. Im Gegensatz zu anderen Recovertools, wie zB PhotoRec, werden in den Magic-Funktionen jedoch nicht alle Datenblöcke des Filesystems untersucht. Es werden aus den Journaldaten, welche während des Löschens geschrieben wurden, versucht die Datenblöcke gezielt zu ermitteln, die gelöscht worden sind und es werden auch alle Datenblöcke übersprungen die schon durch das Recovern der Inodekopien aus dem Journal ihre Verwendung wieder gefunden haben. Damit ist auch effektives Wiederherstellen der Daten in nur teilweise gelöschten Filesystemen möglich. Diese neuen Funktionen nutzen unter anderem auch filesystemtypische Metablöcke für das Zusammenbauen der Dateien. Solche Daten werden von den meisten Recovertools weniger bis gar nicht genutzt, da viele dieser Programme darauf abgestimmt wurden, möglichst universell auf vielen unterschiedlichen Filesystemen zu arbeiten.&lt;br /&gt;
Im Ergebnis kann ext4magic in der derzeitigen Ausbaustufe auf ext3 auch viele fragmentiert vorhandene Dateien und damit auch sehr große Dateien wiederfinden. Viele andere typische Carving Tools haben mit solchen Dateien Probleme und können sie nicht, nur teilweise oder beschädigt wiederherstellen. Unter ext4 werden Dateien gefunden die unfragmentiert waren, und Dateien die sehr stark fragmentiert vorgelegen haben, zB sehr große Dateien, oder Dateien welche geschrieben wurden als das Filesystem so gut wie voll war. Derzeit können Dateien welche aus 2 bis 4 Fragmenten bestehen noch nicht gefunden werden, es wird noch daran gearbeitet ein Recover auch solcher Dateien für einige Dateitypen möglich zu machen.   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile dieses Verfahrens:'''&lt;br /&gt;
# Verknüpfung und Ergänzung beider Recoververfahren in einem einzigem Tool für das optimale Ergebnis&lt;br /&gt;
# kann auch in nur teilweise gelöschten Filesystemen effizient nur nach den wirklich gelöschten Dateien suchen&lt;br /&gt;
# es wird so gut es geht vermieden solche Datenbereiche auszuwerten, die mit dem letztem Löschvorgang nichts zu tun haben&lt;br /&gt;
# Datenbereiche werden nicht mehrfach recovert und der Datenschrott beim Recovern wird verringert&lt;br /&gt;
# z.T. werden fragmentiert abgelegte Dateien, die sonst sehr schwierig zu restaurieren sind, gefunden&lt;br /&gt;
&lt;br /&gt;
ext4magic stellt im optionalen Expert-Mode auch Funktionen zur Verfügung, mit denen aus defekten oder teilweise überschriebenen Filesystemen versucht werden kann, noch Dateien zu retten (funktioniert aber nur bevor versucht wurde ein komplett defektes Filesystem mit fsck wieder zu reparieren).  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===== ext4magic Links und Dokumentation =====&lt;br /&gt;
&lt;br /&gt;
Informationen für das [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic-Installation compilieren aus dem Quellcode], Benutzung sowie Hintergrundinformationen sind über die [http://developer.berlios.de/projects/ext4magic/ Projektseite] oder das [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic Wiki] zu finden.&amp;lt;br&amp;gt;&lt;br /&gt;
Einige ausführliche Howtos für [http://openfacts2.berlios.de/wikien/index.php/BerliosProject:Ext4magic-Howto typische Anwendungsfälle] sind im englischem Wiki zu finden.&lt;br /&gt;
 &lt;br /&gt;
Aktueller Source Download &amp;lt;!-- Stand? --&amp;gt;&lt;br /&gt;
:[http://prdownload.berlios.de/ext4magic/ext4magic-0.2.4.tar.gz ext4magic-0.2.4]  mit der Magic-Funktion für ext3&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://prdownload.berlios.de/ext4magic/ext4magic-0.3.0.tar.gz ext4magic-0.3.0]  mit der Magic-Funktion für ext4&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einige Distributionen bieten fertige Community Pakete an. zu finden zB über [http://pkgs.org/search/?keyword=ext4magic pkgs.org]&amp;lt;br&amp;gt;&lt;br /&gt;
Die ext4magic Entwicklung stellt selbst auch für einige RPM basierende Distributionen fertige Pakete online. Sieht auch [http://openfacts2.berlios.de/wikien/index.php/BerliosProject:Ext4magic#Installation Installationshinweise] im Wiki&lt;br /&gt;
&lt;br /&gt;
'''Neuigkeiten:''' Ein [http://developer.berlios.de/forum/forum.php?forum_id=35219 Front-End für ext4magic] speziell für kleine Rescue-Systeme steht derzeit&amp;lt;!-- Stand? --&amp;gt; für die ersten Usertests zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Links und Quellen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.nongnu.org/ext2-doc/ext2.html Dokumentation &amp;quot;The Second Extended File System&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Category:Partitionen]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28907</id>
		<title>Verlorene Dateien wiederherstellen ext3 ext4</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28907"/>
		<updated>2013-01-24T08:03:28Z</updated>

		<summary type="html">&lt;p&gt;Itu: dank xclip ....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wird eine Datei gelöscht, dann bleiben die Datenblöcke dieser Datei von der Löschung unberührt. Die Löschung der Datei erfolgt in den Verwaltungsdaten ([[Inode]]) der Datei, sowie in den Verzeichnissen, wo die Inodenummer mit dem Dateinamen verknüpft wird. In einem ext3/4 Filesystem werden die Daten in der Inode soweit gelöscht, das es schwierig wird eine versehentliche Löschung wieder rückgängig zu machen. Lange Zeit war das etwas für Spezialisten und dem Filesystem Debugger. [http://linux.die.net/man/8/debugfs debugfs]&lt;br /&gt;
&lt;br /&gt;
Da es trotz größter Vorsicht hin und wieder mal jedem passieren kann, an dieser Stelle ein paar Hinweise und Links was heute auf ext3/4 möglich und machbar ist. Was man wissen sollte, und wie man vorgehen kann. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gelöschte Dateien auf einem ext3 oder ext4 Filesystem wiederherstellen ==&lt;br /&gt;
&lt;br /&gt;
=== Ein paar Einleitende Hintergrundinformationen ===&lt;br /&gt;
&lt;br /&gt;
Um die Probleme und Möglichkeiten die beim Herstellen von gelöschten Dateien bestehen einigermaßen zu verstehen, sollte man folgendes ansatzweise wissen.&lt;br /&gt;
Die Gesamtheit einer normalen Dateien bestehen im ext2/3/4 Filesystem aus mehreren Einzelkomponenten&lt;br /&gt;
; '''die Datenblöcken''' :&lt;br /&gt;
* dieses sind einzelne Blöcke die den Inhalt der Datei, also die reinen Daten, aufnehmen müssen. Je größer die Datei, umso mehr solche Datenblöcke gehören zu dieser Datei.&lt;br /&gt;
&lt;br /&gt;
; '''die [[Inode]]''' :&lt;br /&gt;
* hier stehen die Eigenschaften der Datei, wie Dateityp, Zugriffsrechte, User und Gruppe, Dateigröße usw. Die Inode adressiert aber auch über eine Art Zeigersystem die Datenblöcke. Das bedeutet, über die Inode sind alle Datenblöcke die zur Datei gehören erst auffindbar. Bei großen Dateien reicht die direkte Adressierungsmöglichkeit der Inode nicht aus und es werden zwischen die Datenblöcke weitere Adressblöcke geschrieben, die die Adressierung der Inode durch indirekter Adressierung erweitern. Die Daten von großen Dateien werden so sequentiell auf der Festplatte dann durch gelegentliche zusätzlich eingeschobene Verwaltungsblöcke unterbrochen. Große Dateien stehen also nicht in einem Stück auf der Festplatte, da Verwaltungsdaten dazwischen eingeschoben sind.&lt;br /&gt;
&lt;br /&gt;
; '''der Verzeichnisseintrag''' :&lt;br /&gt;
* das ist ein Eintrag in einer Verzeichnisdatei. In diesen Verzeichnissdateien wird eine Zuordnung von genau einem Dateinamen zu genau einer Inode gemacht. Hier bekommt eine Datei ihren Namen. Die einzelnen Einträge für die Dateien bilden innerhalb der Verzeichnissdateidaten eine verkettete Liste, mit deren Hilfe alle Dateien dieses Verzeichnisses aufgelistet/angesprochen werden können.&lt;br /&gt;
&lt;br /&gt;
; '''die Kette der Verzeichnisse''' :&lt;br /&gt;
* Auch die einzelnen Unterverzeichnisse sind in den Direktories mit einem Namen und der Inode der jeweils eingetragen. So bilden sie eine Art verketter Liste von der Wurzel des Dateisystems bis zum Verzeichnis in dem dann die Dateinamen enthalten sind. Aus den Verzeichnisnamen in dieser Kette wird der Path für diese Datei im Filesystem gebildet, und dieser zusammen mit dem Mountpoint ergibt dann die absolute Adresse einer Datei im gemounteten Filesystem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Änderungen am Filesystem werden in aller Regel nicht momentan ausgeführt. Das System nimmt den Filesystem Cache und buffert die Daten temporär. Automatisch wird ein &amp;quot;sync&amp;quot; alle paar Sekunden dann die Daten wirklich auf die Platte schreiben. Wird zB eine Datei verändert und unmittelbar danach sofort die ganze Datei gelöscht, dann wird die Änderung der Datei eventuell gar nicht erst auf die Platte geschrieben, sondern nur die Löschung. Wiederherstellen können wir nur das, was auf der Platte steht und nicht das was niemals auf die Platte geschrieben wurde.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Löschen von Dateien in ext3/4 passiert nun vereinfacht folgendes:&amp;lt;br&amp;gt;&lt;br /&gt;
es werden in der Inode die Zeiger auf die Datenblöcke gelöscht. Die Inode bekommt einen Zeitstempel als Lösch-Markierung, die Datenblöcke werden als &amp;quot;Frei verfügbar&amp;quot; markiert, und in den Verzeichnisdateien werden die Einträge mit dem Dateinamen und der dazugehörigen Inode ausgekettet (nicht gelöscht). Somit sind diese Dateinamen dann im Dateisystem bei normalen Zugriffen nicht mehr sichtbar. Es werden also nicht alle Spuren einer Datei beim Löschen endgültig beseitigt, im Gegenteil es wird gar nicht erst versucht. Es wird nur dafür gesorgt das sie nicht mehr zu sehen und zu finden ist und die belegten Datenbereiche dieser Datei wieder frei verfügbar sind. Bei ext3/4 ist im Gegensatz zu ext2 aber genau die Entfernung der Verlinkung in der Inode zu den Datenblöcken der Datei, ein Problem das ein rückgängig machen einer ausgeführten Löschung, ausgesprochen schwierig gestaltet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wiederherstellen von versehentlich gelöschten offene Dateien  ===&lt;br /&gt;
&lt;br /&gt;
==== Dateien aus dem /proc Verzeichnis wiedergewinnen ====&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann es vorkommen, und man löscht eine Datei versehentlich und merkt sofort: &amp;quot;Hilfe  diese Datei wird benötigt und ich habe sie auch gerade noch in einem anderem Programm in Benutzung&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Rechtzeitig bemerkt ist so was erst einmal nur Halb so schlimm. Solange eine Datei noch von einem Prozess geöffnet ist, existiert im Rechner noch der Verweis auf die Datei, und der entsprechende Prozess kann weiter mit dieser Datei arbeiten. In den Verzeichnissen ist die Datei schon nicht mehr sichtbar. Andere Prozesse können diese Datei jetzt also auch nicht mehr öffnen weil sie nicht mehr zu finden ist. Sobald der letzte Prozess, der auf eine solche schon gelöschte Datei, zugreift diese Datei schließt, oder dieser Prozess beendet wird, erst dann wird diese Datei dann endgültig im Filesystem gelöscht. Dieses Verhalten kann man zum Beispiel auch bemerken, wenn man versucht eine überlange aktuelle Logdatei zu löschen. Man hat eine riesengroße Datei zwar gelöscht, sieht sie auch nicht mehr mit '''&amp;quot;ls&amp;quot;''', aber der Speicherplatz dieser Datei wird einfach nicht freigegeben. Die Logdatei ist dann immer noch von einem Prozess geöffnet der hier nach wie vor in die scheinbar schon gelöschte Datei weiter schreibt. Die Datei kann also durchaus noch weiter anwachsen. Erst wenn dieser Prozess beendet wird, dann wird der Plattenplatz den diese Datei belegt hat, wirklich freigegeben.&lt;br /&gt;
&lt;br /&gt;
Eine solche Datei kann man mit dem Befehl [http://linux.die.net/man/8/lsof lsof] finden.&lt;br /&gt;
&amp;lt;pre&amp;gt; rob@dhcppc0:~/Dokumente&amp;gt; lsof -a +L1 /home&lt;br /&gt;
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NLINK    NODE NAME&lt;br /&gt;
more    5139  rob    3r   REG    8,6    72830     0 1143264 /home/rob/Dokumente/orig.txt (deleted) &amp;lt;/pre&amp;gt;&lt;br /&gt;
Wir sehen die Datei ist vom Befehl &amp;quot;more&amp;quot; mit der PID 5139  in Arbeit und wird als &amp;quot;deleted&amp;quot; angezeigt. In der Spalte '''FD''' finden wir '''&amp;quot;3r&amp;quot;''' Das Bedeutet: dieser Prozess greift mit dem Filediskriptor Nr '''3''' lesend ('''r''') zu.  &amp;quot;5w&amp;quot; würde dann also Filediskriptor 5 hat schreibenden Zugriff auf diese Datei.&lt;br /&gt;
&lt;br /&gt;
Diese Datei können wir jetzt im /proc Verzeichnis finden. &lt;br /&gt;
&amp;lt;pre&amp;gt;rob@dhcppc0:~/Dokumente&amp;gt; ls -l /proc/5139/fd/*&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/0 -&amp;gt; /dev/pts/0&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/1 -&amp;gt; /dev/pts/0&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/2 -&amp;gt; /dev/pts/0&lt;br /&gt;
lr-x------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/3 -&amp;gt; /home/rob/Dokumente/orig.txt (deleted)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings, können wir hier auch nicht direkt auf die schon gelöschte Datei zugreifen, aber wir können ihren Inhalt immer noch auslesen und diesen wieder als Datei neu schreiben. Dabei würde jetzt eine neue Datei mit gleichem Namen und gleichem Inhalt angelegt. &lt;br /&gt;
&amp;lt;pre&amp;gt;rob@dhcppc0:~/Dokumente&amp;gt; cat /proc/5139/fd/3 &amp;gt; /home/rob/Dokumente/orig.txt&lt;br /&gt;
rob@dhcppc0:~/Dokumente&amp;gt; ls -l /home/rob/Dokumente/orig.txt&lt;br /&gt;
-rw-r--r-- 1 rob users 72830  9. Dez 19:24 /home/rob/Dokumente/orig.txt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ganze funktioniert auf diese Weise solange wir es mit &amp;quot;nur zum Lesen geöffnet&amp;quot; Dateien haben. Ist diese Datei zum Schreiben geöffnet, können wir so auch jederzeit eine Momentaufnahme dieser Datei erzeugen. Doch danach wird der Prozess eventuell weiterhin in die alte, schon gelöschte Datei, weiter schreiben. Diese Änderungen werden dann natürlich nicht mehr in unsere neu angelegte Datei registriert. Wir haben ja nur eine Momentaufnahme als Kopie. So kann es hier sein, das wir die letzten Änderungen an einer solchen Datei verlieren. ZB bei  Datenbankdateien wäre so etwas dann allerdings fatal. Hier könnte zB [http://linux.die.net/man/1/tail tail] helfen, um die Datei mit allen Änderungen vollständig wieder herzustellen. Siehe auch [http://www.jfranken.de/homepages/johannes/vortraege/lsof_inhalt.de.html#ToC6 Beispiele]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ich habe gerade all meine Daten gelöscht,  Erste Hilfe ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Der ganze Abschnitt gefällt mir noch nicht so richtig , nach mehreren Versuchen bleibt er aber jetzt trotzdem erst mal so stehen ~~~~ --&amp;gt;&lt;br /&gt;
Selbstverständlich hat ja jeder immer ein aktuelles Backup all seiner Betriebssysteme und all seiner Daten und hat es auch schon erfolgreich getestet, dass er damit jederzeit alles wiederherstellen kann. Deshalb das folgende hier nur theoretischer Art. ;-) &amp;lt;br&amp;gt;&lt;br /&gt;
Jeder hat etwas anders auf dem Rechner und nicht jeder Rechner hat die selbe Nutzung, deshalb erstmal allgemeine Vorgehensweise unmittelbar nach dem man bemerkt hat, &amp;quot;hier sind wohl eben versehentlich wichtige Daten gelöscht worden&amp;quot;. Ziel ist es hier sicherzustellen, das man morgen wieder an die Daten kommt, die man heute gelöscht hat, auch wenn man heute noch überhaupt keine Ahnung davon hat, wie das gehen soll.   &lt;br /&gt;
&lt;br /&gt;
# zuerst möglichst keine vorschnellen unüberlegten Aktionen starten. Nicht ausschalten, nicht Platte ziehen, keine größeren Programme, Scripte oder Befehle&amp;lt;!--?--&amp;gt; nach starten   &lt;br /&gt;
# besser erstmals 3 Minuten lang nur den Kopf benutzen und versuchen überhaupt erst mal zu begreifen, was eventuell schief gelaufen sein könnte:  wann ging es noch ; was habe ich &amp;quot;falsch&amp;quot; gemacht ; was könnte betroffen sein? Letzte Befehle anschauen, letzte Fehlermeldungen verstehen.&lt;br /&gt;
# Was hier zuerst einmal ganz wichtig ist: jetzt unbedingt verhindern das dieser Datenstand automatisch als Backup gesichert wird und uns damit vielleicht noch das letzte vollständige Backup überschreibt. &lt;br /&gt;
# als nächstes mit &amp;quot;kleinen Befehlen&amp;quot; möglichst herausfinden: Geht überhaupt noch was? Welches Filesystem, welcher Verzeichnisbaum ist betroffen? was sind/waren dort für Dateien und Daten? Welche Prozesse/User/Dienste/Server greifen dort zu, welche davon könnten dort auch schreiben? Kann/darf ich diese Programme beenden, oder noch schlimmer, muss ich sie etwa beenden, weil ihnen Dateien unter dem Hintern weggelöscht wurden und sie jetzt deshalb nur noch Fehler produzieren und die Logdateien vollmüllen? &lt;br /&gt;
# Wichtig nachdem klar ist was in etwa alles gelöscht wurde: das entsprechenden Filesystem so gut es geht vor weiteren Schreibaktionen schützen: Wenn möglich Rechner beruhigen (zB Singleusermodus wenn man genügend Konsolenrfahrung dafür hat), ansonsten: Programme die schreibend zugreifen möglichst beenden, nicht benötigte Programme und Fenster schließen, keine weiteren Programme starten die auf dieses Filesystem zugreifen könnten. Bei betroffenen Homeverzeichnissen eventuell, neuen User anlegen dessen Home dann auf dem Rootfilesystem angelegt wird und als dieser User weiterarbeiten, Ziel ist möglichst das entsprechende Filesystem auf readonly zu remounten noch besser wenn möglich das Filesystem komplett umounten. Vorsichtshalber in der /etc/fstab Schreiberlaubnis für die betroffene Partition auch vorläufig entfernen.&lt;br /&gt;
# Was oftmals übersehen wird. Es handelt sich um ein Journal&amp;lt;!--ing --&amp;gt;filesystem. Das Journal wird auch weiterhin benutzt auch wenn man nichts in das Filesystem schreibt. ZB. wenn Dateien gelesen werden, dabei wird ein neuer a-time Zeitstempel in die Inode eingetragen. Auch solche Aktionen laufen über das Journal. Würde jetzt zB mit einem &amp;quot;find&amp;quot; der Rest des Filesystems durchsucht werden, würde je nachdem wie viel vom Filesystem nach dem Löschen noch übrig ist, eventuell eine ganze Menge ins Journal geschrieben. Jede dieser Schreibaktionen im Journal wird dabei alte Journaldaten überschreiben. Und es gibt Recoverprogramme die aus alten Journaldaten hervorragend wiederherstellen können. Also sollte man sich die alten Journaldaten nicht noch unnötig überschreiben, wenn man ein solches Programm nutzen möchte. Je früher man das Filesystem oder zumindestens das Journal jetzt aushängt und nicht weiter benutzt, desto mehr Dateien werden solche Programme finden können. &lt;br /&gt;
# Informationen sammeln: Parititionsgrößen, Mountpoints, Filesystemtyp, wie viel ist im Moment belegt, wie viel könnte es vorher gewesen sein, Datentypen, Homeverzeichnisse anderer User betroffen? Dann diese auch informieren und auch dort Informationen sammeln. Wenn möglich welche Verzeichnisstruktur war auf der Platte, bzw. was ist davon verschwunden. Wo habe ich im Rechner eventuell noch Platz, um temporär Dateien zwischenzuspeichern. Eventuell muss man sich Prioritäten setzen: was brauche ich an Dateien unbedingt wieder; auf was kann ich notfalls verzichten; was wäre eventuell ganz unwichtig.&lt;br /&gt;
# Ist das betroffene Filesystem soweit beruhigt, dass möglichst nichts mehr neu geschrieben werden kann (auch nicht nach einem eventuellem reboot) und die wichtigsten Informationen eingesammelt sind, erst dann geht es weiter.&lt;br /&gt;
# Möglichst an dieser Stelle jetzt eine Kopie der Partition als Image oder auf eine andere Platte erzeugen. (1 zu 1, nicht komprimiert). Eine solche Kopie kann mit [[dd]] erzeugt werden, wichtig hierbei die Partition sollte möglichst umountet sein, maximal aber Readonly. Mit einer solchen Kopie zB auf einer USB-Platte hat man jetzt theoretisch unendlich viel Zeit und unendlich viele Versuche die wichtigen Dateien wieder herzustellen. Dazu muss aber entweder das Original, oder die Kopie vom Original, von jeglichen Versuchen kategorisch ausgeschlossen werden. Dieses wird immer nur zum Lesen benutzt und zwar um wieder eine neue Kopie davon zu machen, für den nächsten Versuch die Dateien wieder herzustellen.     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Datenwiederherstellen benötigt man mindestens 3 Dinge: Internetzugang, um an die richtigen Howtos und die Programme zu kommen, genügend Plattenkapazität, um die wiederhergestellten Dateien schreiben zu können, und reichlich Zeit. Erfahrungsgemäß fehlt einem immer eines. :-) man wird es aber trotzdem brauchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateien anhand ihres Type mit einem Flächenscan aus den Datenblöcken wieder gewinnen ===&lt;br /&gt;
&lt;br /&gt;
Die nackten Datenblöcke der Dateien bleiben als solche bei den allermeisten Filesystemen auch beim Löschen vollkommen intakt auf der Festplatte zurück. Man muss eine Platte schon gezielt überschreiben, damit man nicht mehr an alte Dateien herankommt. Liest man die gesamte Partition Block für Block aus und schaut sich die einzelnen Blöcke insbesondere den Blockanfang an, wird man dort an bestimmten Eigenschaften den Beginn von bestimmten Dateitypen erkennen können. Ist die Datei größer als die Blockgröße, dann wird man wahrscheinlich im nächsten Block die Fortsetzung dieser Datei finden. Auch das Ende vieler Dateien kann man erkennen. Meist ist der Rest hinter einer Datei mit Nullen bis zum Blockende gefüllt. Es ist also möglich hintereinander liegende Datenblöcke zu Dateien zusammen zu bauen. Wenn das ein einigermaßen intelligentes Tool macht, und dieses auch noch ein bisschen Ahnung vom Filesystem hat, dann hat man sogar die Chance auch Dateien aus Blöcken wiederzufinden und zusammen zu bauen, die auf der Platte fragmentiert vorliegen. Tools die so nach verlorenen Dateien suchen gibt es eine ganze Menge.&lt;br /&gt;
&lt;br /&gt;
Das Problem dabei. Es werden in aller Regel nicht nur die verlorenen Dateien wieder gefunden die man benötigt, sondern auch solche, die man nicht verloren hat, sowie jede Menge Kopien davon und jede Menge Dateien die man schon vor ewiger Zeit gelöscht hat, und auch mehr oder weniger viele, die mittlerweile fehlerhaft oder komplett defekt sind. Ein gutes Tool ist jetzt in der Lage bei einigen Dateitype, insbesondere bei Dateien welche Metadaten in sich bergen den Dateinamen und einige Eigenschaften wieder richtig zu setzen. Für einige Dateitypen wird eventuell noch der gefundenen Datei wieder eine richtige Dateiendung gegeben, die auf den wahrscheinlichsten Datentyp hinweist. Diese Tools sind aber nicht in der Lage den gefundenen Dateien allen ihre ursprünglichen Namen wieder zugeben, geschweige denn zu entscheiden, in welches Verzeichnis gehört die Datei und welchem User hat die Datei gehört. Nach dem Einsatz solcher Tools kann man sich nicht selten Stunden und Tage damit befassen, Dateien zu sichten, zu sortieren und ihnen neue Namen zu geben. Eventuell helfen Scripte dabei. Allerdings sind die Probleme dabei so vielfältig und in jedem Fall anders gelagert, das es dazu nicht wirklich etwas universelles gibt. Dieses Verfahren eignet sich vor allem für gelöschte Datendateien, Bilder, Musik, Dokumente usw. Der Versuch dieses Verfahren auf das Rootfilesystem anzuwenden, würde wahrscheinlich zu nichts weiter als zu Datenschrott führen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== PhotoRec ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cgsecurity.org/wiki/PhotoRec_DE PhotoRec] ist ein Tool aus [http://www.cgsecurity.org/wiki/TestDisk_DE TestDisk] &lt;br /&gt;
Mit seiner Hilfe ist es möglich verlorene oder gelöschte Dateien durch einen Scan des Datenträgers wiederzufinden. '''PhotoRec''' unterstützt viele Dateisysteme und ist nicht mal auf ein funktionierendes Filesystem angewiesen, kann also Dateien auch noch finden wenn das Filesystem schwer beschädigt oder eventuell neu formatiert wurde.&lt;br /&gt;
Es kennt eine ganze Reihe von [http://www.cgsecurity.org/wiki/Wiederherstellbare_Dateiformate_unter_PhotoRec Dateitypen], die es wieder herstellen kann.&lt;br /&gt;
&lt;br /&gt;
Testdisk sollte man in verschiedenen Distributionen und auf verschiedenen Hilfs- CD/DVDs finden. Unter OpenSuse sollten fertige [http://packages.opensuse-community.org/index.jsp?searchTerm=testdisk&amp;amp;distro=openSUSE_111 Pakete bei Packman] zu finden sein.  &lt;br /&gt;
&lt;br /&gt;
Die Benutzung von PhotoRec ist in diesem [http://www.cgsecurity.org/wiki/PhotoRec_Schritt_f%C3%BCr_Schritt HOWTO] wohl gut genug beschrieben, so das wir das hier gar nicht erst versuchen müssten.&lt;br /&gt;
&lt;br /&gt;
Das Hauptproblem dürfte meist erst auftreten, wenn PhotoRec mit seiner Arbeit fertig ist. Es wird oftmals nicht leicht sein all die Dateien zu sortieren die dort gefunden werden. [http://www.cgsecurity.org/wiki/Nach_dem_Gebrauch_von_PhotoRec Hier] und an vielen anderen Stellen i, Netz wird man sicherlich Tipps und Tricks dazu finden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Die Dateien mit Hilfe alter Filesystem-Journaldaten wieder herstellen ===&lt;br /&gt;
&lt;br /&gt;
Das Prinzip dahinter ist folgendes. ext3/4 ist ein Journalfilesystem. Bevor Änderungen an der internen Filesystemstruktur vorgenommen werden, werden diese Änderungen in einer Art Aufgabenbuch, dem sogenanntem Journal, auf die Platte geschrieben. Erst dann werden die Änderungen an dem Filesystem selbst vorgenommen. Ist die Änderung im Filesystem abgeschlossen, werden die Aufgaben im Journal als &amp;quot;erledigt&amp;quot; markiert. Damit wird gesichert, dass auch bei einem Rechnerabsturz das Filesystems konsistent bleibt und ermöglicht eine schnelle Wiederherstellung des Filesystems nach einem Absturz. In diesem Fall müssen dann nur die noch offenen Änderungen im Journal abgearbeitet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Zu den Daten die dort im Journal abgelegt werden gehören die Blöcke in denen die Inode enthalten sind. Dort im Journal befinden sich also Kopien von alten Inodedaten. Und diese stehen dort oftmals einen längeren Zeitraum. Da immer ganze Inode Blöcke dort abgelegt werden, ist die Wahrscheinlichkeit sehr groß, dass man von vielen Dateien dort auch eine alte Inode findet. &lt;br /&gt;
&lt;br /&gt;
Hier sind also genau die Informationen die uns zB. nach dem Löschen von Dateien fehlen würden, um eine Datei komplett wieder herzustellen. Das Problem ist jedoch jetzt die richtige Kopie einer Inode zu finden, die genau die Daten der Inode einer Datei vor dem Löschen enthält. Meist sind von Dateien mehrere, oftmals sehr viele alte Kopien dort zu finden. Gelöschte Dateinamen stehen immer noch mit der ehemaligen Inodenummer in den Datenblöcken der Verzeichnisdateien. Dort müsste der Datenblock nur roh ausgelesen werden um den ehemaligen Dateinamen und die dazugehörige Inode zu ermitteln. Von dieser Inode benötigen wir jetzt aus dem Journal die älteste Kopie die noch keinen Löschzeitstempel hat. Aus den Daten dieser Inodekopie kann jetzt über die Links zu den Datenblöcken, die Datei wieder hergestellt werden. Die anderen Eigenschaften der gelöschten Datei stehen auch in dieser Inode. Die Datenblöcke auf die diese Inodekopie verweist, sind zwar im Filesystem derzeit als &amp;quot;frei verfügbar&amp;quot; markiert, die Wahrscheinlichkeit dass sie jedoch noch nicht anderweitig benutzt wurden, ist groß. Damit könnte jetzt problemlos eine Kopie der gelöschten Datei erzeugt werden. Programme die das können sind '''ext3grep''' ; '''extundelete''' ; '''ext4magic''' &lt;br /&gt;
&lt;br /&gt;
Haben wir uns eine Datei überschrieben, zB weil wir statt mit der Umleitung &amp;quot;''&amp;gt;&amp;gt; Dateiname''&amp;quot; (die soviel bedeutet wie, Ausgabe am Ende der Datei Dateiname weiter schreiben) mit der Umleitung &amp;quot;''&amp;gt; Dateiname''&amp;quot; (Ausgabe in Datei Dateiname schreiben), gearbeitet haben, dann könnte über das Journal auch in diesem Fall die Informationen gewonnen werden, um den alten Dateistand wieder herzustellen. Automatische Funktionen dafür gibt es in den hier vorgestellten Programmen derzeit wohl nun bei '''ext4magic'''. Mit Hilfe von '''ext3grep''' wäre es mit einigem Hintergrundwissen noch manuell möglich. Mit '''extundelete''' scheint das derzeit überhaupt nicht möglich zu sein.     &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ext3grep ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Einleitung''' : &amp;lt;br&amp;gt;&lt;br /&gt;
'''[http://groups.google.com/group/ext3grep/web/ext3grep-source-code-and-overview ext3grep]''' ist ein Konsolenprogramm von Carlo Wood. Es wurde wohl ursprünglich aus der Not heraus entwickelt. Die allgemeine Vorgehensweise und das Prinzip sind in seinem [http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html Howto] sehr schön beschrieben. Carlo Wood hatte die revolutionäre Idee aus dem Filesystem-Journal Backups von früheren Inodeblöcken die Daten zu gewinnen mit deren Hilfe die gelöschten Dateien wieder hergestellt werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vorteile''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Es können gezielt Kopien sowohl von einzelnen gelöschte Dateien, oder auch von allen als gelöscht erkannten des Filesystems mitsamt Dateinamen mit dem Pfad und original Zugriffsrechten und Zeitstempel wieder hergestellt werden. Man kann dabei den Löschzeitraum zeitlich eingrenzen, so das man gezielt nur versucht solche Dateien wieder zu gewinnen, die während diesem Zeitraum gelöscht wurden. Es kann eine Liste aller in Verzeichnisdatenblöcken gefundenen Dateinamen erstellt werden. Möglich sind auch Zeit Histogramme aus den Inodedaten, zB um die Anzahl der Löschvorgänge im zeitlichen Zusammenhang anzuzeigen. Damit ist es möglich den interessanten Löschzeitraum gut einzugrenzen. Eine Reihe von zusätzliche Optionen ermöglichen eine sehr gute und hilfreiche Informationen aus dem Filesystem und aus dem Journal für das Auffinden von gelöschten oder verlorenen Dateien auch in speziellen Problemfällen. Mit diesen Informationen ist es mit etwas Hintergrundwissen auch durchaus möglich per Hand bestimmte ältere Dateistände von Dateien wieder herzustellen. Einfaches normales Wiederherstellen einer erst kürzlich gelöschten Datei ist damit auch ohne spezielle Kenntnisse mit nur wenigen Optionen für die meisten Linuxuser fast problemlos auf der Konsole machbar.       &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''kleine Mängel''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm arbeitet relativ langsam, da es einmalig aufwendige Scans nach allen Dateinamen über das gesamte Dateisystem macht. Größere Filesysteme haben dabei entsprechend sehr lange Laufzeiten, auch wenn nur sehr wenige Dateien wieder hergestellt werden sollen. Bei einem erneutem Aufruf von ext3grep auf dem selben Filesystem ist es dann recht flott, da die Daten nur einmalig gescannt werden brauchen und in Logdateien abgelegt werden. &lt;br /&gt;
Es ist sehr viel im Programm starr einprogrammiert worden. Dadurch ist es nicht flexibel genug, um alle möglichen Eigenschaften des Filesystems zu berücksichtigen. ext4 Filesysteme funktionieren zum Beispiel gar nicht. Unterstützt werden nur [http://de.wikipedia.org/wiki/Byte-Reihenfolge Little Endian] (Intel x86) Systeme. Das Programm wird scheinbar vom Entwickler selbst z.Z. nicht mehr ernsthaft weiterentwickelt und ist auch im Quelltext nicht sonderlich übersichtlich und strukturiert, so das auch andere Entwickler hier nur sehr schwer einen Einstieg für eine Weiterentwicklung finden werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fazit''' (des Autor dieses Wikibeitrages) :&amp;lt;br&amp;gt;&lt;br /&gt;
Einfach genial für Standard ext3, aber leider nicht flexibel genug für ext4. Geeignet für kleine und mittlere Filesysteme wenn viele Dateien wieder hergestellt werden sollen. Sehr gut geeignet auch um Informationen aus dem Filesystem für manuelles Wiederherstellen bei extremen Problemfällen zu gewinnen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Installation von ext3grep =====&lt;br /&gt;
&lt;br /&gt;
Einige Distributionen scheinen es per Paket oder per default zu unterstützen. Für OpenSuse müsste es bei Bedarf selbst kompiliert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Benötigt werden die allgemeinen Entwicklertools mit '''C++''' sowie die Header von  '''e2fsprogs'''&lt;br /&gt;
&lt;br /&gt;
Im einzelnen wären folgende Pakete mit ihren Abhängigkeiten zu installieren : '''gcc ; gcc-c++ ; make ; e2fsprogs-devel''' &lt;br /&gt;
&lt;br /&gt;
Quellcodearchiv downloaden&lt;br /&gt;
  wget http://ext3grep.googlecode.com/files/ext3grep-0.10.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
Archiv auspacken&lt;br /&gt;
 tar -xzf ext3grep-0.10.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
in das Verzeichnis wechseln, dort '''configure''' und '''make''' ausführen.&lt;br /&gt;
 cd ext3grep-0.10.1/&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
Das Ergebnis ist eine ausführbare Datei namens '''ext3grep''' im Unterverzeichnis '''src/''' &amp;lt;br&amp;gt;&lt;br /&gt;
Zu installieren braucht man das Programm nicht unbedingt, es reicht wenn man es in ein Arbeitsverzeichnis kopiert oder man könnte es auch dort an Ort und Stelle ausführen, wo es kompiliert wurde. Dadurch kann es, wenn man es nur einmalig benötigt, anschließend auch schnell wieder gelöscht werden. &lt;br /&gt;
 cp src/ext3grep /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 cd /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 ./ext3grep --help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Hinweise und Beispiele zur Benutzung =====&lt;br /&gt;
&lt;br /&gt;
Es wird dringend empfohlen mit einer Kopie des entsprechenden Filesystems zu arbeiten. Wo das nicht möglich ist, geht es auch mit dem Filesystem selbst, nur sollte es auf keinem Fall in dieser Zeit mit Schreibzugriff eingehängt sein. Wenn man mit einer Image-Kopie vom Filesystem arbeitet, benötigt man keine Rootrechte, kann dann allerdings ohne Rootrechte auch die Dateien nicht mit ihren Orginal Zugriffsberechtigungen erstellen. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Arbeitsverzeichnis sollte genügend freie Plattenkapazität vorhanden sein, da dorthin die wiederhergestellten Dateien geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn ext3grep das Filesystem scannt, legt es im aktuellem Verzeichnis 2 Dateien an. '''FILESYSTEMNAME.ext3grep.stage1 '''und''' FILESYSTEMNAME.ext3grep.stage2'''&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Dateien bitte nicht per Hand manipulieren, auch wenn das noch so verlockend ist. Diese Dateien müssen jedes mal gelöscht werden (damit sie bei erneuter Verwendung von ext3grep wieder neu erzeugt werden) nachdem man das Filesystem wieder schreibend eingehängt hat oder zB  ein anderes Filesystem mit dem selben Kopienamen bearbeiten will. Sonst kommt ext3grep durcheinander.&lt;br /&gt;
&lt;br /&gt;
Die wiederhergestellten Dateien landen in einem Unter-Verzeichnis  '''&amp;quot;RESTORED_FILES/&amp;quot;''' das ext3grep selbst anlegt.&lt;br /&gt;
Es werden für einige Optionen Zeitangaben im Sekundenformat seit 1970 benötigt. Diese kann man zB wie folgt ermitteln, oder in der [http://linux.die.net/man/1/date Manpage von date] nachlesen.&lt;br /&gt;
 date +%s                             #jetzt&lt;br /&gt;
 date -d &amp;quot;&amp;quot; +%s                       #heute 0:00 Uhr&lt;br /&gt;
 date -d &amp;quot;-1 day&amp;quot; +%s                 #gestern um diese Zeit&lt;br /&gt;
 date -d &amp;quot;2009-12-10 15:28:42&amp;quot; +%s&lt;br /&gt;
&lt;br /&gt;
Alle Befehlsoptionen anzeigen lassen, allgemeine Hilfe&lt;br /&gt;
 ./ext3grep --help&lt;br /&gt;
&lt;br /&gt;
Test auf prinzipielle Unterstützung des Filesystems, auslesen des Filesystem Superblocks, ('''test.iso''' ist hier ein Filesystemimage)&lt;br /&gt;
 ./ext3grep test.iso&lt;br /&gt;
&lt;br /&gt;
Ein Histogramm erzeugen, um herauszufinden, wann wie viele Dateien gelöscht wurden, Damit lässt sich der interessante Zeitbereich sehr genau bestimmen (Zeitoptionen wie oben beschrieben)&lt;br /&gt;
 ./ext3grep --histogram=dtime --after=1202351086 --before=1202351129&lt;br /&gt;
&lt;br /&gt;
Alle Dateien wiederherstellen, die ab einer bestimmten Zeit gelöscht wurden&lt;br /&gt;
 ./ext3grep test.iso --restore-all --after=1260399600 &lt;br /&gt;
&lt;br /&gt;
Eine Liste der Dateinamen erzeugen von denen ext3grep annimmt, sie wiederherstellen zu können&lt;br /&gt;
 ./ext3grep test.iso --dump-names&lt;br /&gt;
&lt;br /&gt;
Eine einzelne ganz bestimmte Datei &amp;quot;'''Verzeichnis/Path/dateiname.txt'''&amp;quot; wiederherstellen. Der Path zur Datei beginnt mit dem Wurzelverzeichnis aus der Sicht dieses Filesystems und darf nicht mit '''&amp;quot;/&amp;quot;''' beginnen. Der Dateiname muss in der oben erzeugten Liste enthalten sein. &lt;br /&gt;
 ./ext3grep test.iso --restore-file Verzeichnis/Path/dateiname.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
# '''Das Programm ist und bleibt &amp;quot;Beta&amp;quot;'''&lt;br /&gt;
# Es geht hier nur ext3, wenn ein ext3 Filesystem mit ext4 beschrieben wurde, oder nach ext3 konvertiert wurde, wird es nicht funktionieren oder nur unzureichende Ergebnisse liefern&lt;br /&gt;
# Niemals, und auf gar keinen Fall versuchen, Dateien aus dem selben Filesystem wiederherzustellen, in das man gerade die wiederhergestellten Dateien wieder hinein schreibt :-)&lt;br /&gt;
# Wann immer möglich keinen Filesystemcheck nach dem Löschen und vor dem Recoverversuch durchführen, besonders keinen, wo man Fragen beantworten soll. Wenn der Rechner vor dem Recoverversuch noch rebootet oder ausgeschalten werden muss und man keine Kopie hat, prüfen ob man den Eintrag in der /etc/fstab auf readonly umändern kann und im sechtem&amp;lt;!-- ???? --&amp;gt; Feld mit einer &amp;quot;0&amp;quot; den Filesystemcheck verhindern kann&lt;br /&gt;
# Möglichst den Zeitraum einschränken oder genaue Dateinamen angeben, damit nicht Unmengen uralte Dateien wiederhergestellt werden.&lt;br /&gt;
# Es wird mit diesen hier vorgestellten einfachen Optionen der Stand vor dem letztem Löschvorgang einer Datei hergestellt. &lt;br /&gt;
# Nicht wirklich jede Datei wird sich jederzeit auch so wiederherstellen lassen, Ein Backup ersetzt dieses Tool also keinesfalls &lt;br /&gt;
# Möglichst nicht erst viel im Filesystem weiter schreiben&lt;br /&gt;
# Die wiederhergestellten Dateien sollten gründlich kontrolliert werden, auf Vollständigkeit und ordnungsgemäßen Inhalt&lt;br /&gt;
# je nach Füllstand und Durchsatz können einzelne Dateibestandteile schon ganz oder teilweise neu überschrieben und schon wieder gelöscht sein. Daraus könnte im Einzelfall durchaus auch mal ein scheinbar ganz falscher Inhalt der wiederhergestellten Dateien resultieren.&lt;br /&gt;
# Gerätedateien Pipes u.ä. werden nicht unterstützt&lt;br /&gt;
# Eventuell werden ehemalige Hardlinks jetzt zu selbständigen Dateien (Auch den Hinweis über die Hardlinks im [http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html Howto] lesen.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== extundelete ====&lt;br /&gt;
&lt;br /&gt;
'''Einleitung''': &amp;lt;br&amp;gt;&lt;br /&gt;
[http://extundelete.sourceforge.net/ extundelete] ist eine Überarbeitung der Idee von ext3grep. Im Unterschied zu '''ext3grep''' benutzt '''extundelete''' die Funktionen des [http://e2fsprogs.sourceforge.net/ ext2fs library] zu. Dadurch können recht schnell auch aus großen Filesystemen einzelne Dateien wiederhergestellt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vorteile''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Sehr brauchbare Laufzeiten auch in großen Filesystemen. Flexibel sowohl auf ext3 wie ext4. Analoge Funktionen und ebenfalls weitestgehende analoge Befehls-Optionen zu ext3grep. Durch die Benutzung der Libraryfunktionen erhält es automatisch die notwendige Flexibilität für eine gute Unterstützung des ext3/4 Filesystems. Unterstützung auf für Big Endian. Es können hiermit auch gezielt Verzeichnissbäume und Dateilisten wiederhergestellt werden.&lt;br /&gt;
Das Wiederherstellen von Dateien ist ohne großartige Spezialkenntnisse von jedermann möglich. Für viele Distributionen als Paket erhältlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''kleine Mängel''' : &amp;lt;br&amp;gt;        &lt;br /&gt;
Es sind noch längst nicht alle ursprünglich beabsichtigten Funktionen implementiert. Die Weiterentwicklung scheint mehr oder weniger eingeschlafen zu sein. Derzeit kann nur der reine Dateiinhalt wiederhergestellt werden. Nützliche Zusatzfunktionen, wie in ext3grep, sind leider derzeit nicht implementiert. ''extundelte'' ist derzeit nicht mit den aktuellsten Versionen von libext2fs (1.42) nutzbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fazit''' (des Autor dieses Wikibeitrages) :&amp;lt;br&amp;gt;&lt;br /&gt;
Projekt mit guten Potential. Einfach in der Anwendung und einige Tests und  Wiederherstellungen von Dateien und Verzeichnissen sowohl auf ext3 wie ext4 begeistern jedoch, auch wenn mehr oder weniger &amp;quot;nur&amp;quot; die reinen Dateidaten mit ihrem Namen und Pfad möglich sind. Die Datendateien sind das Wichtigste, das scheint prima zu funktionieren. Leider bleiben Fragen zu Problemen selbst in den offiziellen Mailinglisten oftmals unbeantwortet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Installation von undelete =====&lt;br /&gt;
&lt;br /&gt;
Soweit nicht als Paket erhältlich sein sollte (Einige Distributionen bieten derzeit fertige Installationspakete an), bitte immer die aktuellste Version nehmen, hier wurde die Version 0.1.8 getestet. Kompilieren ist recht einfach, ähnlich ext3grep  &amp;lt;br&amp;gt; &lt;br /&gt;
Benötigt werden genauso die allgemeinen Entwicklertools mit '''C++''' sowie die Header von '''e2fsprogs''' unterstützte Versionen 1.41.9 bis 1.41.14&lt;br /&gt;
&lt;br /&gt;
im Einzelnen wären folgende Pakete mit ihren Abhängigkeiten zu installieren : '''gcc ; gcc-c++ ; make ; e2fsprogs-devel''' &lt;br /&gt;
&lt;br /&gt;
Quellcodearchiv downloaden&lt;br /&gt;
  wget http://sourceforge.net/projects/extundelete/files/extundelete/0.1.8/extundelete-0.1.8.tar.bz2/downl&lt;br /&gt;
&lt;br /&gt;
Archiv auspacken&lt;br /&gt;
 tar -xjf extundelete-0.1.8.tar.bz2&lt;br /&gt;
&lt;br /&gt;
in das Unterverzeichnis &amp;quot;extundelete*/src&amp;quot; wechseln dort '''make''' ausführen. ( bei neueren Versionen erst &amp;quot;./configure&amp;quot;)&lt;br /&gt;
 cd extundelete-0.1.8/src/&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis ist eine ausführbare Datei mit Namen '''extundelete''' im Unterverzeichnis '''src/'''  &amp;lt;br&amp;gt;&lt;br /&gt;
Zu installieren braucht man das Programm nicht unbedingt, es reicht wenn man es in ein Arbeitsverzeichnis kopiert oder man könnte es auch dort an Ort und Stelle ausführen, wo es kompiliert wurde. Dadurch kann es, wenn man es nur einmalig benötigt wird, anschließend auch schnell wieder gelöscht werden. &lt;br /&gt;
 cp extundelete/TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 cd /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 ./extundelete --help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Hinweise und Beispiele zur Benutzung =====&lt;br /&gt;
&lt;br /&gt;
Es wird dringend empfohlen mit einer Kopie des entsprechenden Filesystems zu arbeiten. Wo das nicht möglich ist, geht es auch mit dem Filesystem selbst, nur sollte es auf keinem Fall in dieser Zeit mit Schreibzugriff eingehängt sein. Wenn man mit einer Image-Kopie vom Filesystem arbeitet wird, benötigt man theoretisch keine Rootrechte. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Arbeitsverzeichnis sollte genügend freie Plattenkapazität vorhanden sein, da dorthin die wiederhergestellten Dateien geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Bei '''extundelete''' werden im Gegensatz zu '''ext3grep''' keine &amp;quot;stage&amp;quot;-Dateien angelegt auf die man gegenenfalls achten muss. Abgelegt werden die Dateien ebenfalls in einem Unterverzeichnis des aktuellem Verzeichnisses  mit dem Namen '''&amp;quot;RECOVERED_FILES/&amp;quot;''' &amp;lt;br&amp;gt;&lt;br /&gt;
Im Gegensatz zu '''ext3grep''' werden jedoch Dateien die mehrmals restored werden, dort nicht jedes mal überschrieben, sondern bekommen zusätzlich noch eine Endung &amp;quot;'''.v1 .v2 .v3''' ......&amp;quot; an den Dateinamen angehängt, so das man dann bei mehrere Versuchen auch mehrere Versionen ein und der selben Datei hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Einen Überblick über die derzeit aktuell unterstützten Optionen kann man auch [http://extundelete.sourceforge.net/options.html hier] finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Beispiele:'''&lt;br /&gt;
&lt;br /&gt;
Eine einzelne Datei restoren, es muss auch hier der komplette Path zur Datei wie bei '''ext3grep''' angegeben werden. ''(Das ist im Moment noch etwas schwierig, da die Option ''--dump-names'' noch nicht implementiert ist.)''&lt;br /&gt;
 ./extundelete test.iso --restore-file dir/subdir/filename&lt;br /&gt;
&lt;br /&gt;
Ein komplette Verzeichnis recursiv wiedergewinnen. (Verzeichnis hier &amp;quot;testdir/&amp;quot; im Root des Filesystems)&lt;br /&gt;
 ./extundelete test.iso --restore-directory testdir &lt;br /&gt;
&lt;br /&gt;
Eine Dateiliste wiederherstellen. Die Liste besteht aus Dateinamen mit ihrem Path. Eine Datei pro Zeile. also zB so hier&lt;br /&gt;
&amp;lt;pre&amp;gt;# cat filename.log&lt;br /&gt;
test8/datei_follow.log&lt;br /&gt;
test8/test5&lt;br /&gt;
test8/test5/.Hallo1&lt;br /&gt;
test8/test5/.Hallo2&lt;br /&gt;
test8/test5/.Hallo3&lt;br /&gt;
test8/test5/.Hallo4&lt;br /&gt;
test8/test6&lt;br /&gt;
test8/test6/dir1&lt;br /&gt;
test8/test6/dir1/dir2&lt;br /&gt;
test8/test6/dir1/dir2/dir3&lt;br /&gt;
test8/test6/dir1/dir2/dir3/dir4&lt;br /&gt;
test8/test6/dir1/dir2/dir3/dir4/Testdatei.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
Achtung: Der Befehl ist nicht zu verwechseln mit dem zum restore nur einer einzigen Datei&lt;br /&gt;
 ./extundelete test.iso --restore-files filename.log&lt;br /&gt;
&lt;br /&gt;
Alle als gelöscht zu findende Dateien restoren. &lt;br /&gt;
 ./extundelete test.iso --restore-all&lt;br /&gt;
&lt;br /&gt;
Besser ist es jedoch die Löschzeitpunkt möglichst genau einzuschränken, damit nicht uralte Dateien mit hergestellt werden. Die Zeitangabe auch hier in Sekunden seit 1970. (Hier im Beispiel mal gleich in der Befehlszeile erledigt.) Es sollen alle Dateien die vor mindestens 16 Stunden aber höchstens vor 18 Stunden gelöscht wurden wieder restored werden. &lt;br /&gt;
 ./extundelete test.iso --after $(date -d &amp;quot;-18 hour&amp;quot; +%s) --before $(date -d &amp;quot;-16 hour&amp;quot; +%s) --restore-all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hinweise :'''&lt;br /&gt;
&lt;br /&gt;
Allgemein gilt das selbe wie bei ext3grep.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ext4magic====&lt;br /&gt;
&lt;br /&gt;
Mit [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic ext4magic] entsteht derzeit ein weiteres Konsol Tool, welches das recovern von Dateien aus Journaldaten ermöglicht. Es baut auf den Erfahrungen von ext3grep und extundelete auf, und geht dabei ein paar Schritte weiter. Es ermöglicht auch die Wiederherstellung der User- und Zugriffsrechte, der Zeitstempel, unterstützt mit Ausnahme von Sockets alle Dateitypen und auch Hardlinks. Auch das Wiederherstellen von Dateiattributen ist möglich und kann optional beim compilieren aktiviert werden. Das Wiederherstellen überschriebener Dateien/Verzeichnisse oder älterer Dateiversionen ist in gewissen Masse möglich, soweit die Journaldaten dafür ausreichend sind. Unterstützt wird dabei sowohl ext3 als auch ext4.&lt;br /&gt;
&lt;br /&gt;
Das Programm hat eine Vielzahl von Anzeige Optionen und ermöglicht somit auch Untersuchungen am Filesystem. Somit können über die Nutzung der Journaldaten Manipulationen und Änderungen an Dateien und Verzeichnissen ermittelt und verfolgt werden, soweit sich die Daten dazu noch im Journal befinden. Die Vielzahl der Funktionen macht dieses Programm jedoch in der Anwendung nicht ganz einfach.     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Weitere Möglichkeiten und Funktionen =====&lt;br /&gt;
&lt;br /&gt;
In Entwicklung dort ist ein mehrstufiges Recover welches speziell für den Fall eines versehentlich rekursivem Löschens abgestimmt ist. Wird das Filesystem nach einem solchem Löschvorgang baldmöglichst umountet und nicht weiter benutzt hat man mit den neuen Magic-Funktionen (derzeit verfügbar für ext3 in Versionen 0.2.x und für ext4 in Versionen 0.3.x ) sehr gute Chancen auch Dateien wiederherstellen zu können, von denen keine alte Inodekopie mehr vorhanden sind. Ermöglicht wird das durch ein mehrstufiges Verfahren. Im ersten Schritt werden alle Dateien wiederhergestellt die aus Inodekopien im Journal gewonnen werden können. Nachfolgend wird mit einem neuen sehr speziell auf das Filesystem abgestimmten [http://www.forensicswiki.org/wiki/File_Carving File Carving Verfahren] versucht, auch die Dateien zu finden, von denen keine Inodekopie mehr vorhanden sind. Im Gegensatz zu anderen Recovertools, wie zB PhotoRec, werden in den Magic-Funktionen jedoch nicht alle Datenblöcke des Filesystems untersucht. Es werden aus dem Journaldaten, welche während des Löschens geschrieben wurden, versucht die Datenblöcke gezielt zu ermitteln, die gelöscht worden sind und es werden auch alle Datenblöcke übersprungen die schon durch das Recovern der Inodekopien aus dem Journal ihre Verwendung wieder gefunden haben. Damit ist auch effektives Wiederherstellen der Daten in nur teilweise gelöschten Filesystemen möglich. Diese neuen Funktionen nutzen unter anderem auch filesystemtypischen Metablöcke für das Zusammenbauen der Dateien. Solche Daten werden von den meisten Recovertools weniger bis gar nicht genutzt, da viele dieser Programme darauf abgestimmt wurden, möglichst universell auf viele unterschiedlichen Filesysteme zu arbeiten.&lt;br /&gt;
Im Ergebnis kann ext4magic in der derzeitigen Ausbaustufe auf ext3 auch viele fragmentiert vorhandene Dateien und damit auch sehr große Dateien wiederfinden. Viele andere typische Carving Tools haben mit solchen Dateien Probleme und können sie nicht, nur teilweise oder beschädigt wiederherstellen. Unter ext4 werden Dateien gefunden die unfragmentiert waren, und Dateien die sehr stark fragmentiert vorgelegen haben, zB sehr große Dateien, oder Dateien welche geschrieben wurden als das Filesystem so gut wie voll war. Derzeit können Dateien welche aus 2 bis 4 Fragmenten bestehen noch nicht gefunden werden, es wird noch daran gearbeitet ein Recover auch solcher Dateien für einige Dateitypen möglich zu machen.   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile dieses Verfahrens:'''&lt;br /&gt;
# Verknüpfung und Ergänzung beider Recoververfahren in einem einzigem Tool für das optimale Ergebnis&lt;br /&gt;
# kann auch in nur teilweise gelöschten Filesystemen effizient nur nach den wirklich gelöschten Dateien suchen&lt;br /&gt;
# es wird so gut es geht vermieden solche Datenbereiche auszuwerten, die mit dem letztem Löschvorgang nichts zu tun haben&lt;br /&gt;
# Datenbereiche werden nicht mehrfach recovert und der Datenschrott beim Recovern wird verringert&lt;br /&gt;
# zT werden fragmentiert abgelegte Dateien, die sonst sehr schwierig zu recovern sind, gefunden&lt;br /&gt;
&lt;br /&gt;
ext4magic stellt im optionalen Expert-Mode auch Funktionen zur Verfügung, mit denen aus defekten oder teilweise überschriebenen Filesysteme versucht werden kann, noch Dateien zu retten (funktioniert aber nur bevor versucht wurde ein komplett defektes Filesystem mit fsck wieder zu reparieren).  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===== ext4magic Links und Dokumentation =====&lt;br /&gt;
&lt;br /&gt;
Informationen für das [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic-Installation compilieren aus dem Quellcode], Benutzung sowie Hintergrundinformationen sind über die [http://developer.berlios.de/projects/ext4magic/ Projektseite] oder das [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic Wiki] zu finden.&amp;lt;br&amp;gt;&lt;br /&gt;
Einige ausführliche Howtos für [http://openfacts2.berlios.de/wikien/index.php/BerliosProject:Ext4magic-Howto typische Anwendungsfälle] sind im englischem Wiki zu finden.&lt;br /&gt;
 &lt;br /&gt;
Aktueller Source Download&lt;br /&gt;
:[http://prdownload.berlios.de/ext4magic/ext4magic-0.2.4.tar.gz ext4magic-0.2.4]  mit der Magic-Funktion für ext3&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://prdownload.berlios.de/ext4magic/ext4magic-0.3.0.tar.gz ext4magic-0.3.0]  mit der Magic-Funktion für ext4&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einige Distributionen bieten fertige Community Pakete an. zu finden zB über. [http://pkgs.org/search/?keyword=ext4magic pkgs.org]&amp;lt;br&amp;gt;&lt;br /&gt;
Die ext4magic Entwicklung stellt selbst auch für einige RPM basierende Distributionen fertige Pakete online. Sieht auch [http://openfacts2.berlios.de/wikien/index.php/BerliosProject:Ext4magic#Installation Installationshinweise] im Wiki&lt;br /&gt;
&lt;br /&gt;
'''Neuigkeiten:''' Ein [http://developer.berlios.de/forum/forum.php?forum_id=35219 Front-End für ext4magic] speziell für kleine Rescue Systeme steht derzeit für die ersten Usertests zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Links und Quellen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.nongnu.org/ext2-doc/ext2.html Dokumentation &amp;quot;The Second Extended File System&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Category:Partitionen]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
	<entry>
		<id>https://linupedia.org/wiki/mediawiki/index.php?title=Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28906</id>
		<title>Verlorene Dateien wiederherstellen ext3 ext4</title>
		<link rel="alternate" type="text/html" href="https://linupedia.org/wiki/mediawiki/index.php?title=Verlorene_Dateien_wiederherstellen_ext3_ext4&amp;diff=28906"/>
		<updated>2013-01-24T07:54:43Z</updated>

		<summary type="html">&lt;p&gt;Itu: whitespace wieder raus?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wird eine Datei gelöscht, dann bleiben die Datenblöcke dieser Datei von der Löschung unberührt. Die Löschung der Datei erfolgt in den Verwaltungsdaten ([[Inode]]) der Datei, sowie in den Verzeichnissen, wo die Inodenummer mit dem Dateinamen verknüpft wird. In einem ext3/4 Filesystem werden die Daten in der Inode soweit gelöscht, das es schwierig wird eine versehentliche Löschung wieder rückgängig zu machen. Lange Zeit war das etwas für Spezialisten und dem Filesystem Debugger. [http://linux.die.net/man/8/debugfs debugfs]&lt;br /&gt;
&lt;br /&gt;
Da es trotz größter Vorsicht hin und wieder mal jedem passieren kann, an dieser Stelle ein paar Hinweise und Links was heute auf ext3/4 möglich und machbar ist. Was man wissen sollte, und wie man vorgehen kann. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gelöschte Dateien auf einem ext3 oder ext4 Filesystem wiederherstellen ==&lt;br /&gt;
&lt;br /&gt;
=== Ein paar Einleitende Hintergrundinformationen ===&lt;br /&gt;
&lt;br /&gt;
Um die Probleme und Möglichkeiten die beim Herstellen von gelöschten Dateien bestehen einigermaßen zu verstehen, sollte man folgendes ansatzweise wissen.&lt;br /&gt;
Die Gesamtheit einer normalen Dateien bestehen im ext2/3/4 Filesystem aus mehreren Einzelkomponenten&lt;br /&gt;
; '''die Datenblöcken''' :&lt;br /&gt;
* dieses sind einzelne Blöcke die den Inhalt der Datei, also die reinen Daten, aufnehmen müssen. Je größer die Datei, umso mehr solche Datenblöcke gehören zu dieser Datei.&lt;br /&gt;
&lt;br /&gt;
; '''die [[Inode]]''' :&lt;br /&gt;
* hier stehen die Eigenschaften der Datei, wie Dateityp, Zugriffsrechte, User und Gruppe, Dateigröße usw. Die Inode adressiert aber auch über eine Art Zeigersystem die Datenblöcke. Das bedeutet, über die Inode sind alle Datenblöcke die zur Datei gehören erst auffindbar. Bei großen Dateien reicht die direkte Adressierungsmöglichkeit der Inode nicht aus und es werden zwischen die Datenblöcke weitere Adressblöcke geschrieben, die die Adressierung der Inode durch indirekter Adressierung erweitern. Die Daten von großen Dateien werden so sequentiell auf der Festplatte dann durch gelegentliche zusätzlich eingeschobene Verwaltungsblöcke unterbrochen. Große Dateien stehen also nicht in einem Stück auf der Festplatte, da Verwaltungsdaten dazwischen eingeschoben sind.&lt;br /&gt;
&lt;br /&gt;
; '''der Verzeichnisseintrag''' :&lt;br /&gt;
* das ist ein Eintrag in einer Verzeichnisdatei. In diesen Verzeichnissdateien wird eine Zuordnung von genau einem Dateinamen zu genau einer Inode gemacht. Hier bekommt eine Datei ihren Namen. Die einzelnen Einträge für die Dateien bilden innerhalb der Verzeichnissdateidaten eine verkettete Liste, mit deren Hilfe alle Dateien dieses Verzeichnisses aufgelistet/angesprochen werden können.&lt;br /&gt;
&lt;br /&gt;
; '''die Kette der Verzeichnisse''' :&lt;br /&gt;
* Auch die einzelnen Unterverzeichnisse sind in den Direktories mit einem Namen und der Inode der jeweils eingetragen. So bilden sie eine Art verketter Liste von der Wurzel des Dateisystems bis zum Verzeichnis in dem dann die Dateinamen enthalten sind. Aus den Verzeichnisnamen in dieser Kette wird der Path für diese Datei im Filesystem gebildet, und dieser zusammen mit dem Mountpoint ergibt dann die absolute Adresse einer Datei im gemounteten Filesystem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Änderungen am Filesystem werden in aller Regel nicht momentan ausgeführt. Das System nimmt den Filesystem Cache und buffert die Daten temporär. Automatisch wird ein &amp;quot;sync&amp;quot; alle paar Sekunden dann die Daten wirklich auf die Platte schreiben. Wird zB eine Datei verändert und unmittelbar danach sofort die ganze Datei gelöscht, dann wird die Änderung der Datei eventuell gar nicht erst auf die Platte geschrieben, sondern nur die Löschung. Recovern können wir nur das, was auf der Platte steht und nicht das was niemals auf die Platte geschrieben wurde.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Löschen von Dateien in ext3/4 passiert nun vereinfacht folgendes:&amp;lt;br&amp;gt;&lt;br /&gt;
es werden in der Inode die Zeiger auf die Datenblöcke gelöscht. Die Inode bekommt einen Zeitstempel als Lösch-Markierung, die Datenblöcke werden als &amp;quot;Frei verfügbar&amp;quot; markiert, und in den Verzeichnisdateien werden die Einträge mit dem Dateinamen und der dazugehörigen Inode ausgekettet (nicht gelöscht). Somit sind diese Dateinamen dann im Dateisystem bei normalen Zugriffen nicht mehr sichtbar. Es werden also nicht alle Spuren einer Datei beim Löschen endgültig beseitigt, im Gegenteil es wird gar nicht erst versucht. Es wird nur dafür gesorgt das sie nicht mehr zu sehen und zu finden ist und die belegten Datenbereiche dieser Datei wieder frei verfügbar sind. Bei ext3/4 ist im Gegensatz zu ext2 aber genau die Entfernung der Verlinkung in der Inode zu den Datenblöcken der Datei, ein Problem das ein rückgängig machen einer ausgeführten Löschung, ausgesprochen schwierig gestaltet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wiederherstellen von versehentlich gelöschten offene Dateien  ===&lt;br /&gt;
&lt;br /&gt;
==== Dateien aus dem /proc Verzeichnis wiedergewinnen ====&lt;br /&gt;
&lt;br /&gt;
Gelegentlich kann es vorkommen, und man löscht eine Datei versehentlich und merkt sofort: &amp;quot;Hilfe  diese Datei wird benötigt und ich habe sie auch gerade noch in einem anderem Programm in Benutzung&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Rechtzeitig bemerkt ist so was erst einmal nur Halb so schlimm. Solange eine Datei noch von einem Prozess geöffnet ist, existiert im Rechner noch der Verweis auf die Datei, und der entsprechende Prozess kann weiter mit dieser Datei arbeiten. In den Verzeichnissen ist die Datei schon nicht mehr sichtbar. Andere Prozesse können diese Datei jetzt also auch nicht mehr öffnen weil sie nicht mehr zu finden ist. Sobald der letzte Prozess, der auf eine solche schon gelöschte Datei, zugreift diese Datei schließt, oder dieser Prozess beendet wird, erst dann wird diese Datei dann endgültig im Filesystem gelöscht. Dieses Verhalten kann man zum Beispiel auch bemerken, wenn man versucht eine überlange aktuelle Logdatei zu löschen. Man hat eine riesengroße Datei zwar gelöscht, sieht sie auch nicht mehr mit '''&amp;quot;ls&amp;quot;''', aber der Speicherplatz dieser Datei wird einfach nicht freigegeben. Die Logdatei ist dann immer noch von einem Prozess geöffnet der hier nach wie vor in die scheinbar schon gelöschte Datei weiter schreibt. Die Datei kann also durchaus noch weiter anwachsen. Erst wenn dieser Prozess beendet wird, dann wird der Plattenplatz den diese Datei belegt hat, wirklich freigegeben.&lt;br /&gt;
&lt;br /&gt;
Eine solche Datei kann man mit dem Befehl [http://linux.die.net/man/8/lsof lsof] finden.&lt;br /&gt;
&amp;lt;pre&amp;gt; rob@dhcppc0:~/Dokumente&amp;gt; lsof -a +L1 /home&lt;br /&gt;
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NLINK    NODE NAME&lt;br /&gt;
more    5139  rob    3r   REG    8,6    72830     0 1143264 /home/rob/Dokumente/orig.txt (deleted) &amp;lt;/pre&amp;gt;&lt;br /&gt;
Wir sehen die Datei ist vom Befehl &amp;quot;more&amp;quot; mit der PID 5139  in Arbeit und wird als &amp;quot;deleted&amp;quot; angezeigt. In der Spalte '''FD''' finden wir '''&amp;quot;3r&amp;quot;''' Das Bedeutet: dieser Prozess greift mit dem Filediskriptor Nr '''3''' lesend ('''r''') zu.  &amp;quot;5w&amp;quot; würde dann also Filediskriptor 5 hat schreibenden Zugriff auf diese Datei.&lt;br /&gt;
&lt;br /&gt;
Diese Datei können wir jetzt im /proc Verzeichnis finden. &lt;br /&gt;
&amp;lt;pre&amp;gt;rob@dhcppc0:~/Dokumente&amp;gt; ls -l /proc/5139/fd/*&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/0 -&amp;gt; /dev/pts/0&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/1 -&amp;gt; /dev/pts/0&lt;br /&gt;
lrwx------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/2 -&amp;gt; /dev/pts/0&lt;br /&gt;
lr-x------ 1 rob users 64  9. Dez 19:09 /proc/5139/fd/3 -&amp;gt; /home/rob/Dokumente/orig.txt (deleted)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings, können wir hier auch nicht direkt auf die schon gelöschte Datei zugreifen, aber wir können ihren Inhalt immer noch auslesen und diesen wieder als Datei neu schreiben. Dabei würde jetzt eine neue Datei mit gleichem Namen und gleichem Inhalt angelegt. &lt;br /&gt;
&amp;lt;pre&amp;gt;rob@dhcppc0:~/Dokumente&amp;gt; cat /proc/5139/fd/3 &amp;gt; /home/rob/Dokumente/orig.txt&lt;br /&gt;
rob@dhcppc0:~/Dokumente&amp;gt; ls -l /home/rob/Dokumente/orig.txt&lt;br /&gt;
-rw-r--r-- 1 rob users 72830  9. Dez 19:24 /home/rob/Dokumente/orig.txt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ganze funktioniert auf diese Weise solange wir es mit &amp;quot;nur zum Lesen geöffnet&amp;quot; Dateien haben. Ist diese Datei zum Schreiben geöffnet, können wir so auch jederzeit eine Momentaufnahme dieser Datei erzeugen. Doch danach wird der Prozess eventuell weiterhin in die alte, schon gelöschte Datei, weiter schreiben. Diese Änderungen werden dann natürlich nicht mehr in unsere neu angelegte Datei registriert. Wir haben ja nur eine Momentaufnahme als Kopie. So kann es hier sein, das wir die letzten Änderungen an einer solchen Datei verlieren. ZB bei  Datenbankdateien wäre so etwas dann allerdings fatal. Hier könnte zB [http://linux.die.net/man/1/tail tail] helfen, um die Datei mit allen Änderungen vollständig wieder herzustellen. Siehe auch [http://www.jfranken.de/homepages/johannes/vortraege/lsof_inhalt.de.html#ToC6 Beispiele]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ich habe gerade all meine Daten gelöscht,  Erste Hilfe ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Der ganze Abschnitt gefällt mir noch nicht so richtig , nach mehreren Versuchen bleibt er aber jetzt trotzdem erst mal so stehen ~~~~ --&amp;gt;&lt;br /&gt;
Selbstverständlich hat ja jeder immer ein aktuelles Backup all seiner Betriebssysteme und all seiner Daten und hat es auch schon erfolgreich getestet, dass er damit jederzeit alles wiederherstellen kann. Deshalb das folgende hier nur theoretischer Art. ;-) &amp;lt;br&amp;gt;&lt;br /&gt;
Jeder hat etwas anders auf dem Rechner und nicht jeder Rechner hat die selbe Nutzung, deshalb erstmal allgemeine Vorgehensweise unmittelbar nach dem man bemerkt hat, &amp;quot;hier sind wohl eben versehentlich wichtige Daten gelöscht worden&amp;quot;. Ziel ist es hier sicherzustellen, das man morgen wieder an die Daten kommt, die man heute gelöscht hat, auch wenn man heute noch überhaupt keine Ahnung davon hat, wie das gehen soll.   &lt;br /&gt;
&lt;br /&gt;
# zuerst möglichst keine vorschnellen unüberlegten Aktionen starten. Nicht ausschalten, nicht Platte ziehen, keine größeren Programme, Scripte oder Befehle&amp;lt;!--?--&amp;gt; nach starten   &lt;br /&gt;
# besser erstmals 3 Minuten lang nur den Kopf benutzen und versuchen überhaupt erst mal zu begreifen, was eventuell schief gelaufen sein könnte:  wann ging es noch ; was habe ich &amp;quot;falsch&amp;quot; gemacht ; was könnte betroffen sein? Letzte Befehle anschauen, letzte Fehlermeldungen verstehen.&lt;br /&gt;
# Was hier zuerst einmal ganz wichtig ist: jetzt unbedingt verhindern das dieser Datenstand automatisch als Backup gesichert wird und uns damit vielleicht noch das letzte vollständige Backup überschreibt. &lt;br /&gt;
# als nächstes mit &amp;quot;kleinen Befehlen&amp;quot; möglichst herausfinden: Geht überhaupt noch was? Welches Filesystem, welcher Verzeichnisbaum ist betroffen? was sind/waren dort für Dateien und Daten? Welche Prozesse/User/Dienste/Server greifen dort zu, welche davon könnten dort auch schreiben? Kann/darf ich diese Programme beenden, oder noch schlimmer, muss ich sie etwa beenden, weil ihnen Dateien unter dem Hintern weggelöscht wurden und sie jetzt deshalb nur noch Fehler produzieren und die Logdateien vollmüllen? &lt;br /&gt;
# Wichtig nachdem klar ist was in etwa alles gelöscht wurde: das entsprechenden Filesystem so gut es geht vor weiteren Schreibaktionen schützen: Wenn möglich Rechner beruhigen (zB Singleusermodus wenn man genügend Konsolenrfahrung dafür hat), ansonsten: Programme die schreibend zugreifen möglichst beenden, nicht benötigte Programme und Fenster schließen, keine weiteren Programme starten die auf dieses Filesystem zugreifen könnten. Bei betroffenen Homeverzeichnissen eventuell, neuen User anlegen dessen Home dann auf dem Rootfilesystem angelegt wird und als dieser User weiterarbeiten, Ziel ist möglichst das entsprechende Filesystem auf readonly zu remounten noch besser wenn möglich das Filesystem komplett umounten. Vorsichtshalber in der /etc/fstab Schreiberlaubnis für die betroffene Partition auch vorläufig entfernen.&lt;br /&gt;
# Was oftmals übersehen wird. Es handelt sich um ein Journal&amp;lt;!--ing --&amp;gt;filesystem. Das Journal wird auch weiterhin benutzt auch wenn man nichts in das Filesystem schreibt. ZB. wenn Dateien gelesen werden, dabei wird ein neuer a-time Zeitstempel in die Inode eingetragen. Auch solche Aktionen laufen über das Journal. Würde jetzt zB mit einem &amp;quot;find&amp;quot; der Rest des Filesystems durchsucht werden, würde je nachdem wie viel vom Filesystem nach dem Löschen noch übrig ist, eventuell eine ganze Menge ins Journal geschrieben. Jede dieser Schreibaktionen im Journal wird dabei alte Journaldaten überschreiben. Und es gibt Recoverprogramme die aus alten Journaldaten hervorragend wieder recovern können. Also sollte man sich die alten Journaldaten nicht noch unnötig überschreiben, wenn man ein solches Programm nutzen möchte. Je früher man das Filesystem oder zumindestens das Journal jetzt aushängt und nicht weiter benutzt, desto mehr Dateien werden solche Programme finden können. &lt;br /&gt;
# Informationen sammeln: Parititionsgrößen, Mountpoints, Filesystemtyp, wie viel ist im Moment belegt, wie viel könnte es vorher gewesen sein, Datentypen, Homeverzeichnisse anderer User betroffen? Dann diese auch informieren und auch dort Informationen sammeln. Wenn möglich welche Verzeichnisstruktur war auf der Platte, bzw. was ist davon verschwunden. Wo habe ich im Rechner eventuell noch Platz, um temporär Dateien zwischenzuspeichern. Eventuell muss man sich Prioritäten setzen: was brauche ich an Dateien unbedingt wieder; auf was kann ich notfalls verzichten; was wäre eventuell ganz unwichtig.&lt;br /&gt;
# Ist das betroffene Filesystem soweit beruhigt, dass möglichst nichts mehr neu geschrieben werden kann (auch nicht nach einem eventuellem reboot) und die wichtigsten Informationen eingesammelt sind, erst dann geht es weiter.&lt;br /&gt;
# Möglichst an dieser Stelle jetzt eine Kopie der Partition als Image oder auf eine andere Platte erzeugen. (1 zu 1, nicht komprimiert). Eine solche Kopie kann mit [[dd]] erzeugt werden, wichtig hierbei die Partition sollte möglichst umountet sein, maximal aber Readonly. Mit einer solchen Kopie zB auf einer USB-Platte hat man jetzt theoretisch unendlich viel Zeit und unendlich viele Versuche die wichtigen Dateien wieder herzustellen. Dazu muss aber entweder das Original, oder die Kopie vom Original, von jeglichen Versuchen kategorisch ausgeschlossen werden. Dieses wird immer nur zum Lesen benutzt und zwar um wieder eine neue Kopie davon zu machen, für den nächsten Versuch die Dateien wieder herzustellen.     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zum Datenwiederherstellen benötigt man mindestens 3 Dinge: Internetzugang, um an die richtigen Howtos und die Programme zu kommen, genügend Plattenkapazität, um die wiederhergestellten Dateien schreiben zu können, und reichlich Zeit. Erfahrungsgemäß fehlt einem immer eines. :-) man wird es aber trotzdem brauchen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateien anhand ihres Type mit einem Flächenscan aus den Datenblöcken wieder gewinnen ===&lt;br /&gt;
&lt;br /&gt;
Die nackten Datenblöcke der Dateien bleiben als solche bei den allermeisten Filesystemen auch beim Löschen vollkommen intakt auf der Festplatte zurück. Man muss eine Platte schon gezielt überschreiben, damit man nicht mehr an alte Dateien herankommt. Liest man die gesamte Partition Block für Block aus und schaut sich die einzelnen Blöcke insbesondere den Blockanfang an, wird man dort an bestimmten Eigenschaften den Beginn von bestimmten Dateitypen erkennen können. Ist die Datei größer als die Blockgröße, dann wird man wahrscheinlich im nächsten Block die Fortsetzung dieser Datei finden. Auch das Ende vieler Dateien kann man erkennen. Meist ist der Rest hinter einer Datei mit Nullen bis zum Blockende gefüllt. Es ist also möglich hintereinander liegende Datenblöcke zu Dateien zusammen zu bauen. Wenn das ein einigermaßen intelligentes Tool macht, und dieses auch noch ein bisschen Ahnung vom Filesystem hat, dann hat man sogar die Chance auch Dateien aus Blöcken wiederzufinden und zusammen zu bauen, die auf der Platte fragmentiert vorliegen. Tools die so nach verlorenen Dateien suchen gibt es eine ganze Menge.&lt;br /&gt;
&lt;br /&gt;
Das Problem dabei. Es werden in aller Regel nicht nur die verlorenen Dateien wieder gefunden die man benötigt, sondern auch solche, die man nicht verloren hat, sowie jede Menge Kopien davon und jede Menge Dateien die man schon vor ewiger Zeit gelöscht hat, und auch mehr oder weniger viele, die mittlerweile fehlerhaft oder komplett defekt sind. Ein gutes Tool ist jetzt in der Lage bei einigen Dateitype, insbesondere bei Dateien welche Metadaten in sich bergen den Dateinamen und einige Eigenschaften wieder richtig zu setzen. Für einige Dateitypen wird eventuell noch der gefundenen Datei wieder eine richtige Dateiendung gegeben, die auf den wahrscheinlichsten Datentyp hinweist. Diese Tools sind aber nicht in der Lage den gefundenen Dateien allen ihre ursprünglichen Namen wieder zugeben, geschweige denn zu entscheiden, in welches Verzeichnis gehört die Datei und welchem User hat die Datei gehört. Nach dem Einsatz solcher Tools kann man sich nicht selten Stunden und Tage damit befassen, Dateien zu sichten, zu sortieren und ihnen neue Namen zu geben. Eventuell helfen Scripte dabei. Allerdings sind die Probleme dabei so vielfältig und in jedem Fall anders gelagert, das es dazu nicht wirklich etwas universelles gibt. Dieses Verfahren eignet sich vor allem für gelöschte Datendateien, Bilder, Musik, Dokumente usw. Der Versuch dieses Verfahren auf das Rootfilesystem anzuwenden, würde wahrscheinlich zu nichts weiter als zu Datenschrott führen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== PhotoRec ====&lt;br /&gt;
&lt;br /&gt;
[http://www.cgsecurity.org/wiki/PhotoRec_DE PhotoRec] ist ein Tool aus [http://www.cgsecurity.org/wiki/TestDisk_DE TestDisk] &lt;br /&gt;
Mit seiner Hilfe ist es möglich verlorene oder gelöschte Dateien durch einen Scan des Datenträgers wiederzufinden. '''PhotoRec''' unterstützt viele Dateisysteme und ist nicht mal auf ein funktionierendes Filesystem angewiesen, kann also Dateien auch noch finden wenn das Filesystem schwer beschädigt oder eventuell neu formatiert wurde.&lt;br /&gt;
Es kennt eine ganze Reihe von [http://www.cgsecurity.org/wiki/Wiederherstellbare_Dateiformate_unter_PhotoRec Dateitypen], die es wieder herstellen kann.&lt;br /&gt;
&lt;br /&gt;
Testdisk sollte man in verschiedenen Distributionen und auf verschiedenen Hilfs- CD/DVDs finden. Unter OpenSuse sollten fertige [http://packages.opensuse-community.org/index.jsp?searchTerm=testdisk&amp;amp;distro=openSUSE_111 Pakete bei Packman] zu finden sein.  &lt;br /&gt;
&lt;br /&gt;
Die Benutzung von PhotoRec ist in diesem [http://www.cgsecurity.org/wiki/PhotoRec_Schritt_f%C3%BCr_Schritt HOWTO] wohl gut genug beschrieben, so das wir das hier gar nicht erst versuchen müssten.&lt;br /&gt;
&lt;br /&gt;
Das Hauptproblem dürfte meist erst auftreten, wenn PhotoRec mit seiner Arbeit fertig ist. Es wird oftmals nicht leicht sein all die Dateien zu sortieren die dort gefunden werden. [http://www.cgsecurity.org/wiki/Nach_dem_Gebrauch_von_PhotoRec Hier] und an vielen anderen Stellen i, Netz wird man sicherlich Tipps und Tricks dazu finden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Die Dateien mit Hilfe alter Filesystem-Journaldaten wieder herstellen ===&lt;br /&gt;
&lt;br /&gt;
Das Prinzip dahinter ist folgendes. ext3/4 ist ein Journalfilesystem. Bevor Änderungen an der internen Filesystemstruktur vorgenommen werden, werden diese Änderungen in einer Art Aufgabenbuch, dem sogenanntem Journal, auf die Platte geschrieben. Erst dann werden die Änderungen an dem Filesystem selbst vorgenommen. Ist die Änderung im Filesystem abgeschlossen, werden die Aufgaben im Journal als &amp;quot;erledigt&amp;quot; markiert. Damit wird gesichert, dass auch bei einem Rechnerabsturz das Filesystems konsistent bleibt und ermöglicht eine schnelle Wiederherstellung des Filesystems nach einem Absturz. In diesem Fall müssen dann nur die noch offenen Änderungen im Journal abgearbeitet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Zu den Daten die dort im Journal abgelegt werden gehören die Blöcke in denen die Inode enthalten sind. Dort im Journal befinden sich also Kopien von alten Inodedaten. Und diese stehen dort oftmals einen längeren Zeitraum. Da immer ganze Inode Blöcke dort abgelegt werden, ist die Wahrscheinlichkeit sehr groß, dass man von vielen Dateien dort auch eine alte Inode findet. &lt;br /&gt;
&lt;br /&gt;
Hier sind also genau die Informationen die uns zB. nach dem Löschen von Dateien fehlen würden, um eine Datei komplett wieder herzustellen. Das Problem ist jedoch jetzt die richtige Kopie einer Inode zu finden, die genau die Daten der Inode einer Datei vor dem Löschen enthält. Meist sind von Dateien mehrere, oftmals sehr viele alte Kopien dort zu finden. Gelöschte Dateinamen stehen immer noch mit der ehemaligen Inodenummer in den Datenblöcken der Verzeichnisdateien. Dort müsste der Datenblock nur roh ausgelesen werden um den ehemaligen Dateinamen und die dazugehörige Inode zu ermitteln. Von dieser Inode benötigen wir jetzt aus dem Journal die älteste Kopie die noch keinen Löschzeitstempel hat. Aus den Daten dieser Inodekopie kann jetzt über die Links zu den Datenblöcken, die Datei wieder hergestellt werden. Die anderen Eigenschaften der gelöschten Datei stehen auch in dieser Inode. Die Datenblöcke auf die diese Inodekopie verweist, sind zwar im Filesystem derzeit als &amp;quot;frei verfügbar&amp;quot; markiert, die Wahrscheinlichkeit dass sie jedoch noch nicht anderweitig benutzt wurden, ist groß. Damit könnte jetzt problemlos eine Kopie der gelöschten Datei erzeugt werden. Programme die das können sind '''ext3grep''' ; '''extundelete''' ; '''ext4magic''' &lt;br /&gt;
&lt;br /&gt;
Haben wir uns eine Datei überschrieben, zB weil wir statt mit der Umleitung &amp;quot;''&amp;gt;&amp;gt; Dateiname''&amp;quot; (die soviel bedeutet wie, Ausgabe am Ende der Datei Dateiname weiter schreiben) mit der Umleitung &amp;quot;''&amp;gt; Dateiname''&amp;quot; (Ausgabe in Datei Dateiname schreiben), gearbeitet haben, dann könnte über das Journal auch in diesem Fall die Informationen gewonnen werden, um den alten Dateistand wieder herzustellen. Automatische Funktionen dafür gibt es in den hier vorgestellten Programmen derzeit wohl nun bei '''ext4magic'''. Mit Hilfe von '''ext3grep''' wäre es mit einigem Hintergrundwissen noch manuell möglich. Mit '''extundelete''' scheint das derzeit überhaupt nicht möglich zu sein.     &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ext3grep ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Einleitung''' : &amp;lt;br&amp;gt;&lt;br /&gt;
'''[http://groups.google.com/group/ext3grep/web/ext3grep-source-code-and-overview ext3grep]''' ist ein Konsolenprogramm von Carlo Wood. Es wurde wohl ursprünglich aus der Not heraus entwickelt. Die allgemeine Vorgehensweise und das Prinzip sind in seinem [http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html Howto] sehr schön beschrieben. Carlo Wood hatte die revolutionäre Idee aus dem Filesystem-Journal Backups von früheren Inodeblöcken die Daten zu gewinnen mit deren Hilfe die gelöschten Dateien wieder hergestellt werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vorteile''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Es können gezielt Kopien sowohl von einzelnen gelöschte Dateien, oder auch von allen als gelöscht erkannten des Filesystems mitsamt Dateinamen mit dem Pfad und original Zugriffsrechten und Zeitstempel wieder hergestellt werden. Man kann dabei den Löschzeitraum zeitlich eingrenzen, so das man gezielt nur versucht solche Dateien wieder zu gewinnen, die während diesem Zeitraum gelöscht wurden. Es kann eine Liste aller in Verzeichnisdatenblöcken gefundenen Dateinamen erstellt werden. Möglich sind auch Zeit Histogramme aus den Inodedaten, zB um die Anzahl der Löschvorgänge im zeitlichen Zusammenhang anzuzeigen. Damit ist es möglich den interessanten Löschzeitraum gut einzugrenzen. Eine Reihe von zusätzliche Optionen ermöglichen eine sehr gute und hilfreiche Informationen aus dem Filesystem und aus dem Journal für das Auffinden von gelöschten oder verlorenen Dateien auch in speziellen Problemfällen. Mit diesen Informationen ist es mit etwas Hintergrundwissen auch durchaus möglich per Hand bestimmte ältere Dateistände von Dateien wieder herzustellen. Einfaches normales Wiederherstellen einer erst kürzlich gelöschten Datei ist damit auch ohne spezielle Kenntnisse mit nur wenigen Optionen für die meisten Linuxuser fast problemlos auf der Konsole machbar.       &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
'''kleine Mängel''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Das Programm arbeitet relativ langsam, da es einmalig aufwendige Scans nach allen Dateinamen über das gesamte Dateisystem macht. Größere Filesysteme haben dabei entsprechend sehr lange Laufzeiten, auch wenn nur sehr wenige Dateien wieder hergestellt werden sollen. Bei einem erneutem Aufruf von ext3grep auf dem selben Filesystem ist es dann recht flott, da die Daten nur einmalig gescannt werden brauchen und in Logdateien abgelegt werden. &lt;br /&gt;
Es ist sehr viel im Programm starr einprogrammiert worden. Dadurch ist es nicht flexibel genug, um alle möglichen Eigenschaften des Filesystems zu berücksichtigen. ext4 Filesysteme funktionieren zum Beispiel gar nicht. Unterstützt werden nur [http://de.wikipedia.org/wiki/Byte-Reihenfolge Little Endian] (Intel x86) Systeme. Das Programm wird scheinbar vom Entwickler selbst z.Z. nicht mehr ernsthaft weiterentwickelt und ist auch im Quelltext nicht sonderlich übersichtlich und strukturiert, so das auch andere Entwickler hier nur sehr schwer einen Einstieg für eine Weiterentwicklung finden werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fazit''' (des Autor dieses Wikibeitrages) :&amp;lt;br&amp;gt;&lt;br /&gt;
Einfach genial für Standard ext3, aber leider nicht flexibel genug für ext4. Geeignet für kleine und mittlere Filesysteme wenn viele Dateien wieder hergestellt werden sollen. Sehr gut geeignet auch um Informationen aus dem Filesystem für manuelles Wiederherstellen bei extremen Problemfällen zu gewinnen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Installation von ext3grep =====&lt;br /&gt;
&lt;br /&gt;
Einige Distributionen scheinen es per Paket oder per default zu unterstützen. Für OpenSuse müsste es bei Bedarf selbst kompiliert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Benötigt werden die allgemeinen Entwicklertools mit '''C++''' sowie die Header von  '''e2fsprogs'''&lt;br /&gt;
&lt;br /&gt;
Im einzelnen wären folgende Pakete mit ihren Abhängigkeiten zu installieren : '''gcc ; gcc-c++ ; make ; e2fsprogs-devel''' &lt;br /&gt;
&lt;br /&gt;
Quellcodearchiv downloaden&lt;br /&gt;
  wget http://ext3grep.googlecode.com/files/ext3grep-0.10.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
Archiv auspacken&lt;br /&gt;
 tar -xzf ext3grep-0.10.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
in das Verzeichnis wechseln, dort '''configure''' und '''make''' ausführen.&lt;br /&gt;
 cd ext3grep-0.10.1/&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
Das Ergebnis ist eine ausführbare Datei namens '''ext3grep''' im Unterverzeichnis '''src/''' &amp;lt;br&amp;gt;&lt;br /&gt;
Zu installieren braucht man das Programm nicht unbedingt, es reicht wenn man es in ein Arbeitsverzeichnis kopiert oder man könnte es auch dort an Ort und Stelle ausführen, wo es kompiliert wurde. Dadurch kann es, wenn man es nur einmalig benötigt, anschließend auch schnell wieder gelöscht werden. &lt;br /&gt;
 cp src/ext3grep /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 cd /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 ./ext3grep --help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Hinweise und Beispiele zur Benutzung =====&lt;br /&gt;
&lt;br /&gt;
Es wird dringend empfohlen mit einer Kopie des entsprechenden Filesystems zu arbeiten. Wo das nicht möglich ist, geht es auch mit dem Filesystem selbst, nur sollte es auf keinem Fall in dieser Zeit mit Schreibzugriff eingehängt sein. Wenn man mit einer Image-Kopie vom Filesystem arbeitet, benötigt man keine Rootrechte, kann dann allerdings ohne Rootrechte auch die Dateien nicht mit ihren Orginal Zugriffsberechtigungen erstellen. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Arbeitsverzeichnis sollte genügend freie Plattenkapazität vorhanden sein, da dorthin die wiederhergestellten Dateien geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn ext3grep das Filesystem scannt, legt es im aktuellem Verzeichnis 2 Dateien an. '''FILESYSTEMNAME.ext3grep.stage1 '''und''' FILESYSTEMNAME.ext3grep.stage2'''&amp;lt;br&amp;gt;&lt;br /&gt;
Diese Dateien bitte nicht per Hand manipulieren, auch wenn das noch so verlockend ist. Diese Dateien müssen jedes mal gelöscht werden (damit sie bei erneuter Verwendung von ext3grep wieder neu erzeugt werden) nachdem man das Filesystem wieder schreibend eingehängt hat oder zB  ein anderes Filesystem mit dem selben Kopienamen bearbeiten will. Sonst kommt ext3grep durcheinander.&lt;br /&gt;
&lt;br /&gt;
Die wiederhergestellten Dateien landen in einem Unter-Verzeichnis  '''&amp;quot;RESTORED_FILES/&amp;quot;''' das ext3grep selbst anlegt.&lt;br /&gt;
Es werden für einige Optionen Zeitangaben im Sekundenformat seit 1970 benötigt. Diese kann man zB wie folgt ermitteln, oder in der [http://linux.die.net/man/1/date Manpage von date] nachlesen.&lt;br /&gt;
 date +%s                             #jetzt&lt;br /&gt;
 date -d &amp;quot;&amp;quot; +%s                       #heute 0:00 Uhr&lt;br /&gt;
 date -d &amp;quot;-1 day&amp;quot; +%s                 #gestern um diese Zeit&lt;br /&gt;
 date -d &amp;quot;2009-12-10 15:28:42&amp;quot; +%s&lt;br /&gt;
&lt;br /&gt;
Alle Befehlsoptionen anzeigen lassen, allgemeine Hilfe&lt;br /&gt;
 ./ext3grep --help&lt;br /&gt;
&lt;br /&gt;
Test auf prinzipielle Unterstützung des Filesystems, auslesen des Filesystem Superblocks, ('''test.iso''' ist hier ein Filesystemimage)&lt;br /&gt;
 ./ext3grep test.iso&lt;br /&gt;
&lt;br /&gt;
Ein Histogramm erzeugen, um herauszufinden, wann wie viele Dateien gelöscht wurden, Damit lässt sich der interessante Zeitbereich sehr genau bestimmen (Zeitoptionen wie oben beschrieben)&lt;br /&gt;
 ./ext3grep --histogram=dtime --after=1202351086 --before=1202351129&lt;br /&gt;
&lt;br /&gt;
Alle Dateien recovern, die ab einer bestimmten Zeit gelöscht wurden&lt;br /&gt;
 ./ext3grep test.iso --restore-all --after=1260399600 &lt;br /&gt;
&lt;br /&gt;
Eine Liste der Dateinamen erzeugen von denen ext3grep annimmt, sie wiederherstellen zu können&lt;br /&gt;
 ./ext3grep test.iso --dump-names&lt;br /&gt;
&lt;br /&gt;
Eine einzelne ganz bestimmte Datei &amp;quot;'''Verzeichnis/Path/dateiname.txt'''&amp;quot; recovern. Der Path zur Datei beginnt mit dem Wurzelverzeichnis aus der Sicht dieses Filesystems und darf nicht mit '''&amp;quot;/&amp;quot;''' beginnen. Der Dateiname muss in der oben erzeugten Liste enthalten sein. &lt;br /&gt;
 ./ext3grep test.iso --restore-file Verzeichnis/Path/dateiname.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hinweise:'''&lt;br /&gt;
# '''Das Programm ist und bleibt &amp;quot;Beta&amp;quot;'''&lt;br /&gt;
# Es geht hier nur ext3, wenn ein ext3 Filesystem mit ext4 beschrieben wurde, oder nach ext3 konvertiert wurde, wird es nicht funktionieren oder nur unzureichend Ergebnisse liefern&lt;br /&gt;
# Niemals, und auf gar keinen Fall versuchen, Dateien aus dem selben Filesystem wiederherzustellen, in das man gerade die wiederhergestellten Dateien wieder hinein schreibt :-)&lt;br /&gt;
# Wann immer möglich keinen Filesystemcheck nach dem Löschen und vor dem Recoverversuch durchführen, besonders keinen, wo man Fragen beantworten soll. Wenn der Rechner vor dem Recoverversuch noch rebootet oder ausgeschalten werden muss und man keine Kopie hat, prüfen ob man den Eintrag in der /etc/fstab auf readonly umändern kann und im sechtem Feld mit einer &amp;quot;0&amp;quot; den Filesystemcheck verhindern kann&lt;br /&gt;
# Möglichst den Zeitraum einschränken oder genaue Dateinamen recovern lassen, damit nicht Unmengen uralte Dateien recovert werden.&lt;br /&gt;
# Es wird mit diesen hier vorgestellten einfachen Optionen der Stand vor dem letztem Löschvorgang einer Datei hergestellt. &lt;br /&gt;
# Nicht wirklich jede Datei wird sich jederzeit auch so wieder recovern lassen, Ein Backup ersetzt dieses Tool also keinesfalls &lt;br /&gt;
# Möglichst nicht erst viel im Filesystem weiter schreiben bevor man recovert&lt;br /&gt;
# Die wiederhergestellten Dateien sollten gründlich kontrolliert werden, auf Vollständigkeit und ordnungsgemäßen Inhalt&lt;br /&gt;
# je nach Füllstand und Durchsatz können einzelne Dateibestandteile schon ganz oder teilweise neu überschrieben und schon wieder gelöscht sein. Daraus könnte im Einzelfall durchaus auch mal ein scheinbar ganz falscher Inhalt der wiederhergestellten Dateien resultieren.&lt;br /&gt;
# Gerätedateien Pipes uä werden nicht unterstützt&lt;br /&gt;
# Eventuell werden ehemalige Hardlinks jetzt zu selbständigen Dateien (Auch den Hinweis über die Hardlinks im [http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html Howto] lesen.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== extundelete ====&lt;br /&gt;
&lt;br /&gt;
'''Einleitung''': &amp;lt;br&amp;gt;&lt;br /&gt;
[http://extundelete.sourceforge.net/ extundelete] ist eine Überarbeitung der Idee von ext3grep. Im Unterschied zu '''ext3grep''' benutzt '''extundelete''' die Funktionen des [http://e2fsprogs.sourceforge.net/ ext2fs library] zu. Dadurch können recht schnell auch aus großen Filesystemen einzelne Dateien wiederhergestellt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vorteile''' : &amp;lt;br&amp;gt;&lt;br /&gt;
Sehr brauchbare Laufzeiten auch in großen Filesystemen. Flexibel sowohl auf ext3 wie ext4. Analoge Funktionen und ebenfalls weitest gehende analoge Befehls-Optionen zu ext3grep. Durch die Benutzung der Libraryfunktionen erhält es automatisch die notwendige Flexibilität für eine gute Unterstützung des ext3/4 Filesystems. Unterstützung auf für Big Endian. Es können hiermit auch gezielt Verzeichnissbäume und Dateilisten wiederhergestellt werden.&lt;br /&gt;
Das Wiederherstellen von Dateien ist ohne großartige Spezialkenntnisse von jedermann möglich. Für viele Distributionen als Paket erhältlich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''kleine Mängel''' : &amp;lt;br&amp;gt;        &lt;br /&gt;
Es sind noch längst nicht alle ursprünglich beabsichtigten Funktionen implementiert. Die Weiterentwicklung scheint mehr oder weniger eingeschlafen zu sein. Derzeit können nur der reine Dateiinhalt wiederhergestellt werden. Nützliche Zusatzfunktionen, analog ext3grep, sind leider derzeit nicht implementiert. extundelte ist derzeit nicht mit den aktuellsten Versionen von libext2fs (1.42) nutzbar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fazit''' (des Autor dieses Wikibeitrages) :&amp;lt;br&amp;gt;&lt;br /&gt;
Projekt mit guten Potential. Einfach in der Anwendung und einige Test und  Wiederherstellung von Dateien und Verzeichnissen sowohl auf ext3 wie ext4 begeistern jedoch, auch wenn mehr oder weniger &amp;quot;nur&amp;quot; die reinen Dateidaten mit ihrem Namen und Path möglich sind. Die Datendateien sind das Wichtigste, das scheint prima zu funktionieren. Leider bleiben Fragen zu Problemen selbst in den offiziellen Mailinglisten oftmals unbeantwortet. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Installation von undelete =====&lt;br /&gt;
&lt;br /&gt;
Soweit nicht als Paket erhältlich sein sollte (Einige Distributionen bieten derzeit fertige Installationspakete an), bitte immer die aktuellste Version nehmen, hier wurde die Version 0.1.8 getestet. Kompilieren ist recht einfach, ähnlich ext3grep  &amp;lt;br&amp;gt; &lt;br /&gt;
Benötigt werden genauso die allgemeinen Entwicklertools mit '''C++''' sowie die Header von '''e2fsprogs''' unterstützte Versionen 1.41.9 bis 1.41.14&lt;br /&gt;
&lt;br /&gt;
im Einzelnen wären folgende Pakete mit ihren Abhängigkeiten zu installieren : '''gcc ; gcc-c++ ; make ; e2fsprogs-devel''' &lt;br /&gt;
&lt;br /&gt;
Quellcodearchiv downloaden&lt;br /&gt;
  wget http://sourceforge.net/projects/extundelete/files/extundelete/0.1.8/extundelete-0.1.8.tar.bz2/downl&lt;br /&gt;
&lt;br /&gt;
Archiv auspacken&lt;br /&gt;
 tar -xjf extundelete-0.1.8.tar.bz2&lt;br /&gt;
&lt;br /&gt;
in das Unterverzeichnis &amp;quot;extundelete*/src&amp;quot; wechseln dort '''make''' ausführen. ( bei neueren Versionen erst &amp;quot;./configure&amp;quot;)&lt;br /&gt;
 cd extundelete-0.1.8/src/&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis ist eine ausführbare Datei mit Namen '''extundelete''' im Unterverzeichnis '''src/'''  &amp;lt;br&amp;gt;&lt;br /&gt;
Zu installieren braucht man das Programm nicht unbedingt, es reicht wenn man es in ein Arbeitsverzeichnis kopiert oder man könnte es auch dort an Ort und Stelle ausführen, wo es kompiliert wurde. Dadurch kann es, wenn man es nur einmalig benötigt wird, anschließend auch schnell wieder gelöscht werden. &lt;br /&gt;
 cp extundelete/TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 cd /TEMP/ARBEITS/VERZEICHNIS/&lt;br /&gt;
 ./extundelete --help&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Hinweise und Beispiele zur Benutzung =====&lt;br /&gt;
&lt;br /&gt;
Es wird dringend empfohlen mit einer Kopie des entsprechenden Filesystems zu arbeiten. Wo das nicht möglich ist, geht es auch mit dem Filesystem selbst, nur sollte es auf keinem Fall in dieser Zeit mit Schreibzugriff eingehängt sein. Wenn man mit einer Image-Kopie vom Filesystem arbeitet wird, benötigt man theoretisch keine Rootrechte. &amp;lt;br&amp;gt;&lt;br /&gt;
Im Arbeitsverzeichnis sollte genügend freie Plattenkapazität vorhanden sein, da dorthin die wiederhergestellten Dateien geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Bei '''extundelete''' werden im Gegensatz zu '''ext3grep''' keine &amp;quot;stage&amp;quot;-Dateien angelegt auf die man gegenenfalls achten muss. Abgelegt werden die Dateien ebenfalls in einem Unterverzeichnis des aktuellem Verzeichnisses  mit dem Namen '''&amp;quot;RECOVERED_FILES/&amp;quot;''' &amp;lt;br&amp;gt;&lt;br /&gt;
Im Gegensatz zu '''ext3grep''' werden jedoch Dateien die mehrmals restored werden, dort nicht jedes mal überschrieben, sondern bekommen zusätzlich noch eine Endung &amp;quot;'''.v1 .v2 .v3''' ......&amp;quot; an den Dateinamen angehängt, so das man dann bei mehrere Versuchen auch mehrere Versionen ein und der selben Datei hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Einen Überblick über die derzeit aktuell unterstützten Optionen kann man auch [http://extundelete.sourceforge.net/options.html hier] finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Beispiele:'''&lt;br /&gt;
&lt;br /&gt;
Eine einzelne Datei restoren, es muss auch hier der komplette Path zur Datei wie bei '''ext3grep''' angegeben werden. ''(Das ist im Moment noch etwas schwierig, da die Option ''--dump-names'' noch nicht implementiert ist.)''&lt;br /&gt;
 ./extundelete test.iso --restore-file dir/subdir/filename&lt;br /&gt;
&lt;br /&gt;
Ein komplette Verzeichnis recursiv wiedergewinnen. (Verzeichnis hier &amp;quot;testdir/&amp;quot; im Root des Filesystems)&lt;br /&gt;
 ./extundelete test.iso --restore-directory testdir &lt;br /&gt;
&lt;br /&gt;
Eine Dateiliste wiederherstellen. Die Liste besteht aus Dateinamen mit ihrem Path. Eine Datei pro Zeile. also zB so hier&lt;br /&gt;
&amp;lt;pre&amp;gt;# cat filename.log&lt;br /&gt;
test8/datei_follow.log&lt;br /&gt;
test8/test5&lt;br /&gt;
test8/test5/.Hallo1&lt;br /&gt;
test8/test5/.Hallo2&lt;br /&gt;
test8/test5/.Hallo3&lt;br /&gt;
test8/test5/.Hallo4&lt;br /&gt;
test8/test6&lt;br /&gt;
test8/test6/dir1&lt;br /&gt;
test8/test6/dir1/dir2&lt;br /&gt;
test8/test6/dir1/dir2/dir3&lt;br /&gt;
test8/test6/dir1/dir2/dir3/dir4&lt;br /&gt;
test8/test6/dir1/dir2/dir3/dir4/Testdatei.txt &amp;lt;/pre&amp;gt;&lt;br /&gt;
Achtung: Der Befehl ist nicht zu verwechseln mit dem zum restore nur einer einzigen Datei&lt;br /&gt;
 ./extundelete test.iso --restore-files filename.log&lt;br /&gt;
&lt;br /&gt;
Alle als gelöscht zu findende Dateien restoren. &lt;br /&gt;
 ./extundelete test.iso --restore-all&lt;br /&gt;
&lt;br /&gt;
Besser ist es jedoch die Löschzeitpunkt möglichst genau einzuschränken, damit nicht uralte Dateien mit hergestellt werden. Die Zeitangabe auch hier in Sekunden seit 1970. (Hier im Beispiel mal gleich in der Befehlszeile erledigt.) Es sollen alle Dateien die vor mindestens 16 Stunden aber höchstens vor 18 Stunden gelöscht wurden wieder restored werden. &lt;br /&gt;
 ./extundelete test.iso --after $(date -d &amp;quot;-18 hour&amp;quot; +%s) --before $(date -d &amp;quot;-16 hour&amp;quot; +%s) --restore-all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hinweise :'''&lt;br /&gt;
&lt;br /&gt;
Allgemein gilt das selbe wie bei ext3grep.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====ext4magic====&lt;br /&gt;
&lt;br /&gt;
Mit [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic ext4magic] entsteht derzeit ein weiteres Konsol Tool, welches das recovern von Dateien aus Journaldaten ermöglicht. Es baut auf den Erfahrungen von ext3grep und extundelete auf, und geht dabei ein paar Schritte weiter. Es ermöglicht auch die Wiederherstellung der User- und Zugriffsrechte, der Zeitstempel, unterstützt mit Ausnahme von Sockets alle Dateitypen und auch Hardlinks. Auch das Wiederherstellen von Dateiattributen ist möglich und kann optional beim compilieren aktiviert werden. Das Wiederherstellen überschriebener Dateien/Verzeichnisse oder älterer Dateiversionen ist in gewissen Masse möglich, soweit die Journaldaten dafür ausreichend sind. Unterstützt wird dabei sowohl ext3 als auch ext4.&lt;br /&gt;
&lt;br /&gt;
Das Programm hat eine Vielzahl von Anzeige Optionen und ermöglicht somit auch Untersuchungen am Filesystem. Somit können über die Nutzung der Journaldaten Manipulationen und Änderungen an Dateien und Verzeichnissen ermittelt und verfolgt werden, soweit sich die Daten dazu noch im Journal befinden. Die Vielzahl der Funktionen macht dieses Programm jedoch in der Anwendung nicht ganz einfach.     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Weitere Möglichkeiten und Funktionen =====&lt;br /&gt;
&lt;br /&gt;
In Entwicklung dort ist ein mehrstufiges Recover welches speziell für den Fall eines versehentlich rekursivem Löschens abgestimmt ist. Wird das Filesystem nach einem solchem Löschvorgang baldmöglichst umountet und nicht weiter benutzt hat man mit den neuen Magic-Funktionen (derzeit verfügbar für ext3 in Versionen 0.2.x und für ext4 in Versionen 0.3.x ) sehr gute Chancen auch Dateien wiederherstellen zu können, von denen keine alte Inodekopie mehr vorhanden sind. Ermöglicht wird das durch ein mehrstufiges Verfahren. Im ersten Schritt werden alle Dateien wiederhergestellt die aus Inodekopien im Journal gewonnen werden können. Nachfolgend wird mit einem neuen sehr speziell auf das Filesystem abgestimmten [http://www.forensicswiki.org/wiki/File_Carving File Carving Verfahren] versucht, auch die Dateien zu finden, von denen keine Inodekopie mehr vorhanden sind. Im Gegensatz zu anderen Recovertools, wie zB PhotoRec, werden in den Magic-Funktionen jedoch nicht alle Datenblöcke des Filesystems untersucht. Es werden aus dem Journaldaten, welche während des Löschens geschrieben wurden, versucht die Datenblöcke gezielt zu ermitteln, die gelöscht worden sind und es werden auch alle Datenblöcke übersprungen die schon durch das Recovern der Inodekopien aus dem Journal ihre Verwendung wieder gefunden haben. Damit ist auch effektives Wiederherstellen der Daten in nur teilweise gelöschten Filesystemen möglich. Diese neuen Funktionen nutzen unter anderem auch filesystemtypischen Metablöcke für das Zusammenbauen der Dateien. Solche Daten werden von den meisten Recovertools weniger bis gar nicht genutzt, da viele dieser Programme darauf abgestimmt wurden, möglichst universell auf viele unterschiedlichen Filesysteme zu arbeiten.&lt;br /&gt;
Im Ergebnis kann ext4magic in der derzeitigen Ausbaustufe auf ext3 auch viele fragmentiert vorhandene Dateien und damit auch sehr große Dateien wiederfinden. Viele andere typische Carving Tools haben mit solchen Dateien Probleme und können sie nicht, nur teilweise oder beschädigt wiederherstellen. Unter ext4 werden Dateien gefunden die unfragmentiert waren, und Dateien die sehr stark fragmentiert vorgelegen haben, zB sehr große Dateien, oder Dateien welche geschrieben wurden als das Filesystem so gut wie voll war. Derzeit können Dateien welche aus 2 bis 4 Fragmenten bestehen noch nicht gefunden werden, es wird noch daran gearbeitet ein Recover auch solcher Dateien für einige Dateitypen möglich zu machen.   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
'''Die Vorteile dieses Verfahrens:'''&lt;br /&gt;
# Verknüpfung und Ergänzung beider Recoververfahren in einem einzigem Tool für das optimale Ergebnis&lt;br /&gt;
# kann auch in nur teilweise gelöschten Filesystemen effizient nur nach den wirklich gelöschten Dateien suchen&lt;br /&gt;
# es wird so gut es geht vermieden solche Datenbereiche auszuwerten, die mit dem letztem Löschvorgang nichts zu tun haben&lt;br /&gt;
# Datenbereiche werden nicht mehrfach recovert und der Datenschrott beim Recovern wird verringert&lt;br /&gt;
# zT werden fragmentiert abgelegte Dateien, die sonst sehr schwierig zu recovern sind, gefunden&lt;br /&gt;
&lt;br /&gt;
ext4magic stellt im optionalen Expert-Mode auch Funktionen zur Verfügung, mit denen aus defekten oder teilweise überschriebenen Filesysteme versucht werden kann, noch Dateien zu retten (funktioniert aber nur bevor versucht wurde ein komplett defektes Filesystem mit fsck wieder zu reparieren).  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===== ext4magic Links und Dokumentation =====&lt;br /&gt;
&lt;br /&gt;
Informationen für das [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic-Installation compilieren aus dem Quellcode], Benutzung sowie Hintergrundinformationen sind über die [http://developer.berlios.de/projects/ext4magic/ Projektseite] oder das [http://openfacts2.berlios.de/wikide/index.php/BerliosProject:Ext4magic Wiki] zu finden.&amp;lt;br&amp;gt;&lt;br /&gt;
Einige ausführliche Howtos für [http://openfacts2.berlios.de/wikien/index.php/BerliosProject:Ext4magic-Howto typische Anwendungsfälle] sind im englischem Wiki zu finden.&lt;br /&gt;
 &lt;br /&gt;
Aktueller Source Download&lt;br /&gt;
:[http://prdownload.berlios.de/ext4magic/ext4magic-0.2.4.tar.gz ext4magic-0.2.4]  mit der Magic-Funktion für ext3&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://prdownload.berlios.de/ext4magic/ext4magic-0.3.0.tar.gz ext4magic-0.3.0]  mit der Magic-Funktion für ext4&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einige Distributionen bieten fertige Community Pakete an. zu finden zB über. [http://pkgs.org/search/?keyword=ext4magic pkgs.org]&amp;lt;br&amp;gt;&lt;br /&gt;
Die ext4magic Entwicklung stellt selbst auch für einige RPM basierende Distributionen fertige Pakete online. Sieht auch [http://openfacts2.berlios.de/wikien/index.php/BerliosProject:Ext4magic#Installation Installationshinweise] im Wiki&lt;br /&gt;
&lt;br /&gt;
'''Neuigkeiten:''' Ein [http://developer.berlios.de/forum/forum.php?forum_id=35219 Front-End für ext4magic] speziell für kleine Rescue Systeme steht derzeit für die ersten Usertests zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Links und Quellen ===&lt;br /&gt;
&lt;br /&gt;
* http://www.nongnu.org/ext2-doc/ext2.html Dokumentation &amp;quot;The Second Extended File System&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Category:Partitionen]]&lt;/div&gt;</summary>
		<author><name>Itu</name></author>
		
	</entry>
</feed>