Grundlegende Ueberarbeitung
This commit is contained in:
@@ -63,7 +63,8 @@ done
|
||||
echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen
|
||||
\end{listing}
|
||||
\normalsize
|
||||
TODO!!!
|
||||
|
||||
TODO!!! Daten aus Subshell hochreichen
|
||||
|
||||
Achtung! while ist eine Subshell - Daten m<>ssen hochgereicht werden.
|
||||
|
||||
@@ -339,8 +340,7 @@ Wenn \texttt{case} eine andere Parameterzahl feststellt, wird eine Meldung mit d
|
||||
\index{trap=\texttt{trap}|)}\index{Signal|)}
|
||||
|
||||
|
||||
\section{Chaoten: Dateien in zuf<75>llige Reihenfolge
|
||||
bringen}\label{chaoten}\index{Zufallszahlen|(}
|
||||
\section{Chaoten: Dateien in zuf<75>llige Reihenfolge bringen}\label{chaoten}\index{Zufallszahlen|(}
|
||||
|
||||
Wir wollen uns einen MP3-Player programmieren, der Alle MP3-Dateien aus einem
|
||||
bestimmten Verzeichnisbaum in zuf<75>lliger Reihenfolge abspielt. Damit dieses
|
||||
@@ -354,7 +354,7 @@ Das Problem ist, da
|
||||
k<EFBFBD>nnen. Auf Systemen, in denen die Datei \texttt{/dev/urandom} existiert,
|
||||
liefert uns der Kernel aber schon sehr zuf<75>llige Zeichenfolgen. Diese Folgen
|
||||
k<EFBFBD>nnen alle Zeichen enthalten, daher m<>ssen sie vor der Benutzung f<>r unsere
|
||||
Zwecke noch etwas 'bereinigt' werden.
|
||||
Zwecke noch etwas `bereinigt' werden.
|
||||
|
||||
Wie das aussieht, wenn es fertig ist, sieht man im folgenden Skript:
|
||||
|
||||
@@ -379,13 +379,13 @@ ignorieren Gro
|
||||
\end{listingcont}
|
||||
\normalsize
|
||||
\begin{flushright}
|
||||
Hier ist der 'magische Teil'. Mit dem \texttt{echo} wird die Ausgabe einer Pipe
|
||||
Hier ist der `magische Teil'. Mit dem \texttt{echo} wird die Ausgabe einer Pipe
|
||||
ausgegeben, gefolgt von dem aktuellen Dateinamen. Diese Pipe enth<74>lt ein
|
||||
\texttt{tr}, der alle ungewollten Zeichen (alles, was kein Textzeichen ist) aus
|
||||
einem Datenstrom entfernt. Die Daten erh<72>lt \texttt{tr} durch die
|
||||
\texttt{<}-Umleitung aus oben genannter Datei.
|
||||
|
||||
Diese Datei liefert 'ohne Ende' Zeichen. Wir wollen aber nur acht Zeichen
|
||||
Diese Datei liefert `ohne Ende' Zeichen. Wir wollen aber nur acht Zeichen
|
||||
haben, die wir unserem Dateinamen voranstellen k<>nnen. Dazu benutzen wir das
|
||||
Kommando \texttt{dd} mit den angegebenen Parametern. Damit die Erfolgsmeldung
|
||||
von \texttt{dd} nicht die Ausgabe verunstaltet, lenken wir sie nach
|
||||
@@ -424,3 +424,79 @@ done
|
||||
\end{listingcont}
|
||||
\normalsize
|
||||
\index{Zufallszahlen|)}
|
||||
|
||||
|
||||
|
||||
\section{Wer suchet, der findet}\label{beispiele_suchen}\index{grep=\texttt{grep}|(textbf}
|
||||
|
||||
|
||||
\subsection{Prozesse suchen}\label{beispiele_suchen_prozesse}\index{ps=\texttt{ps}|(textbf}\index{pgrep=\texttt{pgrep}|(textbf}
|
||||
|
||||
Im Zusammenhang mit grep st<73><74>t fast jeder Shell-Skripter fr<66>her oder sp<73>ter auf
|
||||
das Problem, da<64> er irgendwas davon abh<62>ngig machen will, ob ein bestimmter
|
||||
Proze<EFBFBD> l<>uft oder nicht. Im Normalfall wird er zuerst folgendes ausprobieren,
|
||||
was aber oft (nicht immer) in die Hose gehen wird:
|
||||
|
||||
\texttt{ps aux | grep }\textit{prozessname}\texttt{ \&\& echo \dq}\textit{l<EFBFBD>uft
|
||||
schon}\texttt{\dq}
|
||||
|
||||
Der Grund daf<61>r ist, da<64> unter Umst<73>nden in der Ausgabe von \texttt{ps} auch
|
||||
das \texttt{grep}-Kommando samt Parameter (\textit{prozessname}) aufgelistet
|
||||
wird. So findet das \texttt{grep}-Kommando sich quasi selbst.
|
||||
|
||||
Abhilfe schafft entweder \texttt{pgrep} (\ref{pgrep}) oder das folgende
|
||||
Konstrukt:
|
||||
|
||||
\texttt{ps aux | grep \dq}\textit{[p]rozessname}\texttt{\dq~\&\& echo
|
||||
\dq}\textit{l<EFBFBD>uft schon}\texttt{\dq}
|
||||
|
||||
Das p ist jetzt als eine Zeichenmenge (regul<EFBFBD>rer Ausdruck) angegeben worden.
|
||||
Jetzt sucht \texttt{grep} also nach dem String \textit{prozessname}, in der
|
||||
Ausgabe von \texttt{ps} erscheint das \texttt{grep}-Kommando allerdings mit
|
||||
\textit{[p]rozessname} und wird somit ignoriert.
|
||||
|
||||
\index{ps=\texttt{ps}|)textbf}\index{pgrep=\texttt{pgrep}|)textbf}
|
||||
|
||||
|
||||
\subsection{Dateiinhalte suchen}\label{beispiele_suchen_dateien}\index{find=\texttt{find}|(textbf}
|
||||
|
||||
Ein weiterer wertvoller Trick, diesmal im Zusammenhang mit \texttt{find} ist
|
||||
folgendes Szenario: Es gibt ein Verzeichnis mit vielen Unterverzeichnissen,
|
||||
<EFBFBD>berall liegen Perl-Skripte und andere Dateien. Gesucht sind alle Dateien, in
|
||||
denen eine Zeile mit dem Inhalt `strict' vorkommt. Man k<>nnte jetzt
|
||||
folgendes versuchen:
|
||||
|
||||
\texttt{grep -r strict *}
|
||||
|
||||
Das f<>hrt allerdings dazu, da<64> alle Dateien durchsucht werden, nicht nur die
|
||||
Perl-Skripte. Diese tragen nach unserer Konvention\footnote{Perl-Skripte m<>ssen
|
||||
keine spezielle Extension haben, es sei aber um des Beispiels Willen mal
|
||||
angenommen.} die Extension `.pl'. Wir starten also eine rekursive Suche <20>ber
|
||||
alle Dateien, die dem Muster entsprechen:
|
||||
|
||||
\texttt{grep -r strict *.pl}
|
||||
|
||||
Das f<>hrt wieder nicht zu dem gew<65>nschten Ergebnis. Da die Unterverzeichnisse
|
||||
nicht die Extension `*.pl' tragen, werden sie nicht ber<65>cksichtigt. F<>r die
|
||||
Suche in Unterverzeichnissen ziehen wir \texttt{find} (Siehe Abschnitt
|
||||
\ref{find}) heran:
|
||||
|
||||
\texttt{find . -name \textbackslash*.pl -exec grep \{\} \textbackslash;}
|
||||
|
||||
Dieser Befehl gibt uns zwar die gefundenen Zeilen aus, nicht aber die Namen der
|
||||
Dateien. Es sieht f<>r \texttt{grep} so aus als ob nur eine Datei durchsucht
|
||||
w<EFBFBD>rde, da besteht keine Notwendigkeit den Namen anzugeben. Das ginge mit dem
|
||||
Parameter \texttt{-l}, allerdings w<>rden uns dann nur noch die Dateinamen
|
||||
angezeigt. Eine Ausgabe mit beiden Informationen erhalten wir mit dem folgenden
|
||||
Konstrukt:
|
||||
|
||||
\texttt{find . -name \textbackslash*.pl -exec grep strict /dev/null \{\} \textbackslash;}
|
||||
|
||||
Hier durchsucht \texttt{grep} nicht nur die gefundenen Dateien, sondern bei
|
||||
jedem Aufruf auch \texttt{/dev/null}, also den digitalen M<>lleimer der per
|
||||
Definition leer ist. Da es f<>r \texttt{grep} so aussieht als ob mehr als eine
|
||||
Datei durchsucht w<>rden, wird bei jeder Fundstelle sowohl der Dateiname als
|
||||
auch die gefundene Zeile ausgegeben.
|
||||
|
||||
\index{find=\texttt{find}|)textbf}
|
||||
\index{grep=\texttt{grep}|)textbf}
|
||||
|
||||
Reference in New Issue
Block a user