Systemadministratoren verwenden eine ungezählte Anzahl von Befehlszeilentools, und Sie verwenden wahrscheinlich regelmäßig die drei in diesem Artikel besprochenen:grep
, sed
, und awk
. Aber kennen Sie alle Möglichkeiten, wie Sie sie verwenden können, um Text zu manipulieren? Wenn nicht (oder Sie sich nicht sicher sind), lesen Sie weiter.
Bevor ich anfange, hier sind die Ursprünge der Befehlsnamen:
grep
:Laut Wikipedia stammt der Name "vomed
Befehl g/re/p (g global nach einem r suchen zB e xpression und p übereinstimmende Zeilen ausgeben), was den gleichen Effekt hat."ed
ist ein "zeilenorientierter Texteditor". Selbst für jemanden, der die Befehlszeile mag, scheint das zeilenweise Bearbeiten von Dateien zu altmodisch, aber die Leute mussten in alten Zeiten mit etwas anfangen ).sed
:Der Name kommt von seiner Hauptverwendung als s behandeln ed itor.awk
:Sein Name kommt von den Initialen seiner Autoren (Aho, Weinberger und Kernighan). Wenn Ihnen der Name Kernighan bekannt vorkommt (Wortspiel beabsichtigt), dann deshalb, weil dieser kanadische Informatiker zur Entwicklung von Unix beigetragen und das erste Buch über die Sprache C mitverfasst hat.
Es ist hervorragend, den Stammbaum der Befehle zu verfolgen, aber was wirklich zählt, ist, dass diese Befehle für die Textmanipulation ziemlich hilfreich sind.
In den folgenden Beispielen verwende ich eine Datei namens quotes.txt
um zu veranschaulichen, wie die Befehle verwendet werden. Hier sind die Inhalte dieser Datei:
$ cat quotes.txt
"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
"Not only does God play dice but... he sometimes throws them where they cannot be seen."
- Stephen Hawking
"I regard consciousness as fundamental..."
- Max Planck
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan
"[T]he atoms or elementary particles themselves are not real; they form a world of potentialities or possibilities rather than one of things or facts."
- Werner Heisenberg
grep
Der einfachste Weg, grep
zu verwenden ist:
$ grep universe quotes.txt
"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
Dieses Beispiel enthält die Zeichenfolge, nach der gesucht werden soll (Universum), und den Ort, an dem danach gesucht werden soll (quotes.txt).
Wenn der zu durchsuchende String Leerzeichen enthält, müssen Sie ihn in Anführungszeichen setzen:
$ grep "the universe" quotes.txt
"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
Einige häufige Variationen bei der Verwendung von grep
sind:
- Groß-/Kleinschreibung ignorieren:
grep -i string-to-search filename
- Suche in mehreren Dateien:
grep -i string-to-search *.txt
Sie können nach einem regulären Ausdruck suchen:
$ grep "191[0-9]" quotes.txt
- Albert Einstein, The Born-Einstein Letters 1916-55
Wenn Sie erweiterte Regexp-Muster aktivieren möchten, um Symbole wie +
zu verwenden , ?
, oder |
, können Sie den egrep
verwenden Befehl, der eine Abkürzung zum Hinzufügen des -E
ist Flag an grep
. Dadurch können Sie auch nach mehreren Zeichenfolgen suchen:
$ egrep -i "albe|hawk" quotes.txt
- Albert Einstein, The Born-Einstein Letters 1916-55
- Stephen Hawking
So zeigen Sie Zeilen an, die das Wort "Universum" plus die nächste Zeile enthalten (um den Namen des Autors einzufügen):
$ grep -i universe -A 1 quotes.txt
"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
--
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan
Wie Sie wahrscheinlich erraten können, könnten Sie mehr anzeigen Zeilen, indem Sie eine andere Nummer übergeben. Oder Sie können die Zeilen zuvor anzeigen, indem Sie das Flag -B
verwenden .
Bisher habe ich grep
gezeigt allein läuft, aber es ist sehr üblich, es in einer Befehlskette zu haben:
$ echo "Authors who mentioned 'universe'"; cat quotes.txt | grep -i universe -A 1 | grep "^-"
- Albert Einstein, The Born-Einstein Letters 1916-55
- Carl Sagan
[ Sie könnten auch daran interessiert sein, 11 Linux-Befehle zu lesen, ohne die ich nicht leben kann. ]
gesendet
Meine Lieblingsanwendung für sed
ist das Ersetzen von Zeichenfolgen in Dateien. Zum Beispiel:
$ cat quotes.txt | sed 's/universe/Universe/g'
Dies wird universe
ersetzen mit Universe
und sende das Ergebnis an stdout . Das g
Flag bedeutet "alle Vorkommen der Zeichenkette in jeder Zeile ersetzen."
Einige Variationen hierfür sind:
- Ersetzen Sie die Zeichenfolge nur, wenn sie in den ersten drei Zeilen gefunden wird:
sed '1,3 s/universe/Universe/g' quotes.txt
- Ersetzen Sie das n -tes Vorkommen eines Musters in einer Zeile (zB das zweite Vorkommen):
sed 's/universe/Universe/2' quotes.txt
Diese Beispiele verändern die Originaldatei nicht. Wenn Sie sed
möchten Um die Datei an Ort und Stelle zu ändern, verwenden Sie -i
:
$ sed -i 's/universe/Universe/g' quotes.txt
Wenn Sie das -i
verwenden stellen Sie sicher, dass Sie genau wissen, was und wie oft vorkommt davon betroffen, da die Originaldatei geändert wird. Um das herauszufinden, können Sie ein grep
ausführen und suchen Sie zuerst nach dem Muster.
[ Möchten Sie Ihre Fähigkeiten als Systemadministrator testen? Machen Sie noch heute einen Kompetenztest. ]
awk
Das awk
Utility ist sehr leistungsfähig und bietet viele Optionen für die Verarbeitung von Textdateien.
Die meisten Situationen, in denen ich awk
verwende beinhalten die Verarbeitung von Dateien mit einer einigermaßen vorhersehbaren Struktur (Spalten), einschließlich des als Spaltentrennzeichen verwendeten Zeichens.
Wenn awk
eine Datei verarbeitet, trennt es jede Zeile mit dem "Feldtrenner" (interne Variable FS
, was standardmäßig das Leerzeichen ist). Jedes Feld ist Positionsvariablen zugewiesen ($1
enthält das erste Feld, $2
enthält die zweite, und so weiter. $0
stellt die vollständige Zeile dar).
Sie können auch Filter auf jede Zeile anwenden. Zum Beispiel:
$ cat quotes.txt | awk '/universe/ { print NR " - " $0 }'
1 - "God does not play dice with the universe."
10 - "The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
Die an awk
übergebenen Befehle Verwenden Sie einfache Anführungszeichen (es ist wie das Übergeben eines zu interpretierenden Miniprogramms):
- Das
/universe/
Teil sagtawk
um nur die Zeilen auszuwählen, die diesem Muster entsprechen. - Das "Haupt"-Programm steht zwischen den geschweiften Klammern.
NR
ist die interne Variable, die die Nummer des aktuellen Datensatzes enthält, zB die aktuelle Zeilennummer.- Ich habe den
" -"
hinzugefügt Saite für Ästhetik.
Die internen Variablen in awk
sind:
NR
:Die Gesamtzahl der Eingabedatensätze, die der Befehl bisher gesehen hatNF
:Die Anzahl der Felder im aktuellen EingabedatensatzFS
:Das Eingabefeld-Trennzeichen (standardmäßig ein Leerzeichen)
Hier ist ein Beispiel mit einem "vorhersehbareren" Dateiformat:
$ cat /etc/passwd | awk '/nologin/ { FS=":"; print $1 }'
(output omitted)
...
redis
akmods
cjdns
haproxy
systemd-oom
In diesem letzten Beispiel:
/nologin/
wählt nur die Zeilen aus, die dieses Muster enthalten.FS=": ";
setzt das Feldtrennzeichen auf:
anstelle der Vorgabe (Leerzeichen).print $1
druckt das erste Feld in jeder Zeile (unter Berücksichtigung, dass das Trennzeichen:
ist ).
Weitere Informationen
Das waren einige einfache Beispiele für die Verwendung von grep
, sed
, und awk
.
Wenn Sie den man
lesen Seiten für jeden finden Sie viele zusätzliche Parameter und Verwendungsmöglichkeiten für diese praktischen Befehle.
Für einfache Anwendungsfälle und Dinge, die Sie nur gelegentlich tun, ist es immer gut, solche Tools in Ihrer Toolbox zu haben.
Wenn die erforderliche Aktion komplexer ist, sollten Sie überlegen, ob diese Tools für Sie immer noch sinnvoll sind. Für einen Unternehmensanwendungsfall oder die Verwaltung von „Alles-als-Code“ empfehle ich die Verwendung von Ansible. Ansible-Module haben ähnliche Funktionen, mit denen Sie die oben beschriebenen Operationen emulieren können, mit dem Vorteil, dass Ansible-Module normalerweise Idempotenz haben und dass der vollständige Prozess irgendwo dokumentiert wird (z. B. in Ihrem internen Git-Repo).