So verwenden Sie awk, um Text oder Zeichenfolgen mit musterspezifischen Aktionen zu filtern

So verwenden Sie awk, um Text oder Zeichenfolgen mit musterspezifischen Aktionen zu filtern

Im dritten Teil der awk -Befehlsreihe werden wir einen Blick auf Filtertext oder Zeichenfolgen ansehen, die auf bestimmten Mustern basieren, die ein Benutzer definieren kann.

Manchmal möchten Sie beim Filtern von Text bestimmte Zeilen aus einer Eingabedatei oder Zeilen von Zeichenfolgen angeben, die auf einer bestimmten Bedingung basieren oder ein bestimmtes Muster verwenden, das übereinstimmt werden kann. Tun dies mit Awk ist sehr einfach, es ist eine der großartigen Merkmale von Awk dass Sie hilfreich finden werden.

Schauen wir uns ein Beispiel unten an und sagen Sie, Sie haben eine Einkaufsliste für Lebensmittel, die Sie kaufen möchten, heißt Essenspreise.Liste. Es hat die folgende Liste von Lebensmitteln und deren Preisen.

$ cat food_prices.Liste  NO item_name Mengenpreis 1 Mangos 10 $ 2.45 2 Äpfel 20 $ 1.50 3 Bananen 5 $ 0.90 4 Ananas 10 $ 3.46 5 Orangen 10 $ 0.78 6 Tomaten 5 $ 0.55 7 Zwiebeln 5 $ 0.45 

Und dann möchten Sie a angeben (*) Melden Sie sich für Lebensmittel an, deren Preis größer ist als $ 2, Dies kann durch Ausführen des folgenden Befehls erfolgen:

$ awk '/ *$ [2-9] \.[0-9] [0-9] */ Print $ 1, $ 2, $ 3, $ 4, " *";  / *$ [0-1] \.[0-9] [0-9] */ print; ' Essenspreise.Liste 
Druckartikel, deren Preis größer als 2 US -Dollar ist

Aus der obigen Ausgabe können Sie sehen, dass es ein gibt (*) Unterschreiben Sie am Ende der Linien mit Lebensmitteln, Mangos Und Ananas. Wenn Sie ihre Preise überprüfen, sind sie oben oben $ 2.

In diesem Beispiel haben wir zwei Muster verwendet:

  1. der erste: / *\ $ [2-9] \.[0-9] [0-9] */ erhält die Leitungen, die den Lebensmittelpreis höher haben als $ 2 Und
  2. der Zweite: /*\ $ [0-1] \.[0-9] [0-9] */ sucht nach Linien mit dem Preis von Lebensmitteln weniger als $ 2.

Dies passiert, es gibt vier Felder in der Datei, wenn Muster eins eine Linie mit einem höheren Lebensmittelpreis trifft als $ 2, es druckt alle vier Felder und a (*) unterschreiben am Ende der Linie als Flagge.

Das zweite Muster druckt einfach die anderen Linien mit dem Lebensmittelpreis weniger als $ 2 wie sie in der Eingabedatei erscheinen, Essenspreise.Liste.

Auf diese Weise können Sie Musterspezifische Aktionen verwenden, um die oben genannten Lebensmittel herauszufiltern $ 2, Obwohl es ein Problem mit der Ausgabe gibt, die Linien, die die haben (*) Das Zeichen ist nicht wie der Rest der Linien formatiert, was die Ausgabe nicht genug löscht.

Wir haben das gleiche Problem in Teil 2 der AWK -Serie gesehen, aber wir können es auf zwei Arten lösen:

1. Verwendung printf Befehl, der ein langer und langweiliger Weg mit dem folgenden Befehl ist:

$ awk '/ *$ [2-9] \.[0-9] [0-9] */ printf " %-10s %-10s %-10s %-10s \ n", $ 1, $ 2, $ 3, $ 4 " *";  / *$ [0-1] \.[0-9] [0-9] */ printf " %-10s %-10s %-10s %-10s \ n", $ 1, $ 2, $ 3, $ 4; ' Essenspreise.Liste 
Filtern und Druckelemente mit awk und printf filtern und drucken

2. Verwendung $ 0 Feld. Awk Verwendet die Variable 0 Die gesamte Eingangslinie speichern. Dies ist nützlich, um das obige Problem zu lösen, und es ist einfach und schnell wie folgt:

$ awk '/ *$ [2-9] \.[0-9] [0-9] */ print $ 0 " *";  / *$ [0-1] \.[0-9] [0-9] */ print; ' Essenspreise.Liste 
Filtern und Druckelemente mit awk und variabler filtern und drucken

Abschluss

Das ist es für den Moment und dies sind einfache Möglichkeiten, Text mit musterspezifischer Aktion zu filtern, die bei der Markierung von Text- oder Saitenzeilen in einer Datei helfen können Awk Befehl.

Ich hoffe, Sie finden diesen Artikel hilfreich und denken Sie daran, den nächsten Teil der Serie zu lesen, der sich darauf konzentriert.