GNU/Linux >> LINUX-Kenntnisse >  >> Linux

3 unverzichtbare Linux-Befehle zur Textbearbeitung

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:

  1. grep :Laut Wikipedia stammt der Name "vom ed 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 ).
  2. sed :Der Name kommt von seiner Hauptverwendung als s behandeln ed itor.
  3. 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 sagt awk 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 hat
  • NF :Die Anzahl der Felder im aktuellen Eingabedatensatz
  • FS :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).


Linux
  1. Meine Lieblings-Linux-Befehle zum Optimieren von Webbildern

  2. 20 wichtige Linux-Befehle für jeden Benutzer

  3. 3 wichtige Linux-Spickzettel für mehr Produktivität

  4. Spickzettel für allgemeine Linux-Befehle

  5. Linux – Wie kann man nach einem bestimmten Wort suchen und Text greifen?

Grep-Befehl in Linux (Text in Dateien suchen)

Die wichtigsten Linux-Befehle für Systemadministratoren

eSpeak NG – Ein Text-to-Speech-Synthesizer für Linux

Finden Sie Text in Dateien unter Linux mit grep

Befehle für das Prozessmanagement in Linux

Textterminal-Hardware (für Linux)