So grep für Text in Bash -Skripten korrekt Grep

So grep für Text in Bash -Skripten korrekt Grep

Grep ist ein vielseitiges Linux -Dienstprogramm, das einige Jahre dauern kann, um gut zu meistern. Auch erfahrene Linux -Ingenieure können den Fehler machen, eine bestimmte Eingabetxtdatei anzunehmen, die ein bestimmtes Format hat. Grep kann auch direkt in Kombination mit verwendet werden Wenn Basierte Suchanfragen zum Scannen nach Vorhandensein einer Zeichenfolge in einer bestimmten Textdatei. Ermitteln -Q Option zum SMS zur Stringpräsenz und mehr!

In diesem Tutorial lernen Sie:

  • So durchführen Sie korrekte Zeichen-SET-unabhängige Textsuche mit Grep
  • So verwenden Sie erweiterte GREP -Anweisungen aus Skripten oder Terminal Oneliner -Befehlen
  • So testen Sie für die String -Präsenz mit dem -Q Option zu Grep
  • Beispiele, die die GREP -Verwendung für diese Anwendungsfälle hervorheben
So grep für Text in Bash -Skripten korrekt Grep

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Linux-Verteilungsunabhängige
Software BASH -Befehlszeile, Linux -basiertes System
Andere Jedes Dienstprogramm, das standardmäßig nicht in der Bash -Shell enthalten ist sudo apt-Get Installieren Sie den Dienstprogramm (oder yum install Für Redhat -basierte Systeme)
Konventionen # - Erfordert, dass Linux -Commands mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden sudo Befehl
$-erfordert, dass Linux-Commands als regulärer nicht privilegierter Benutzer ausgeführt werden

Beispiel 1: Richtige Zeichen-Set-unabhängige Textsuche mit Grep korrekt

Was passiert, wenn Sie eine Datei durchlaufen, die Text/Zeichen basiert, aber Sonderzeichen außerhalb des normalen Bereichs enthält? Dies kann möglicherweise auftreten, wenn die Datei komplexe Zeichensätze enthält oder binäre Inhalte enthalten scheint. Um dies besser zu verstehen, müssen wir zunächst verstehen, was binäre Daten sind.

Die meisten (aber nicht alle) Computer verwenden auf der grundlegendsten Ebene nur zwei Zustände: 0 und 1. Vielleicht über vereinfacht können Sie darüber nachdenken, wie ein Schalter: 0 ist kein Volt, keine Leistung und 1 ist „ein gewisses Spannungsniveau“ oder angetrieben. Moderne Computer können Millionen dieser 0 und 1 in einem Bruchteil einer Sekunde verarbeiten. Dies ist 0/1 Status wird als "Bit" bezeichnet und ist ein numerisches Basissystem (genau wie unser 0-9-Dezimalsystem ist ein numerisches Basissystem). Es gibt andere Möglichkeiten, um bit/binärbasierte Daten wie Oktal (8-Basis: 0-7) und Hexadezimal (16-Base: 0-F) darzustellen.

Wenn Sie zu 'Binary' (Bin, Dual) zurückkehren, können Sie feststellen, wie häufig alle Arten von Daten beschrieben werden, die von Menschen nicht leicht erkannt werden können, aber von binären Computern verstanden werden können. Es ist vielleicht nicht die beste Analogie, da Binary normalerweise auf zwei Zustände (wahr/falsch) bezieht, während es in gemeinsamer Jargon 'Binärdaten' zu bedeuten, die nicht leicht zu interpretieren sind.

Beispielsweise enthält eine Quellcodedatei, die mit einem Compiler kompiliert ist Binärdaten Meistens unlesbar von Menschen. Beispielsweise enthält eine Quellcodedatei, die mit einem Compiler kompiliert ist Binärdaten Meistens unlesbar für das menschliche Auge. Ein weiteres Beispiel könnte eine verschlüsselte Datei oder eine Konfigurationsdatei sein, die in einem Angemeldungsformat geschrieben wurde.

Wie sieht es aus, wenn Sie versuchen, binäre Daten anzusehen?

Normalerweise sehen Sie beim Anzeigen von Binärdaten für ausführbare Daten einige reale Binärdaten (alle seltsam aussehenden Zeichen - Ihr Computer zeigt Binärdaten in den begrenzten Ausgangsformatfunktionen an, die Ihr Terminal unterstützt) sowie einige textbasierte Ausgaben). Im Fall von ls Wie hier zu sehen, scheinen sie Funktionsnamen innerhalb der ls Code.

Um binäre Daten korrekt anzuzeigen, benötigen Sie wirklich einen binären Datei -Viewer. Solche Zuschauer formatieren Daten einfach in ihrem nativen Format zusammen mit einer textbasierten Seitenspalte. Dies vermeidet Einschränkungen der Textausgabe und ermöglicht es Ihnen, den Computercode für das zu sehen, was er wirklich ist: 0 und 1, obwohl sie häufig in hexadezimaler Formatierung formatiert (0-F oder 0-F wie unten gezeigt).

Schauen wir uns zwei Sätze mit 4 Zeilen des Binärcode von an ls um zu sehen, wie das aussieht:

$ hexdump -c /bin /ls | Kopf -n4; echo '...'; Hexdump -c /bin /ls | Tail -n131 | Kopf -N4 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.Elf… | 00000010 03 00 3E 00 01 00 00 00 D0 67 00 00 00 00 00 00 |…>… G… | 00002020 40 00 00 00 00 00 00 00 C0 23 02 00 00 00 00 00 |@… #… | 00000030 00 00 00 00 40 00 38 00 0d 00 40 00 1e 00 1d 00 |… @ @.8… @… |… 00022300 75 2e 76 65 72 73 69 6f 6e 00 2e 67 6e 75 2e 76 | u.Version… GNU.v | 00022310 65 72 73 69 6f 6e 5f 72 00 2e 72 65 6c 61 2e 64 | ersion_r… rela.d | 00022320 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 00 2e 69 6e | yn… rela.PLT… in | 00022330 69 74 00 2e 70 6c 74 2e 67 6f 74 00 2e 70 6c 74 | Es… PLT.Ich habe ... PLT | 


Wie können Sie all dies (abgesehen davon mehr darüber erfahren, wie Computer funktionieren), das richtig zu verstehen? Grep Verwendung? Kommen wir zu unserer ursprünglichen Frage zurück: Was passiert, wenn Sie eine Datei durchgehen, die Text/Zeichen basiert, aber spezielle Zeichen außerhalb des normalen Bereichs enthält?

Wir können dies jetzt zu Recht auf "Was passiert, wenn Sie durch eine binäre Datei durchlaufen"? Ihre erste Reaktion kann sein: Warum sollte ich eine binäre Datei durchsuchen wollen??. Zum Teil zeigt die Antwort im oben genannten ls Beispiel schon; Oft enthalten binäre Dateien noch textbasierte Zeichenfolgen.

Und es gibt einen viel wichtigeren und Hauptgrund; Grep Standardmäßig werden viele Dateien angenommen, die binäre Daten enthalten, sobald sie Sonderzeichen enthalten, und möglicherweise, wenn sie bestimmte binäre Escape -Sequenzen enthalten, obwohl die Datei an sich möglicherweise datenbasierte ist. Schlimmer ist, dass Grep standardmäßig fehlschlägt und diese Dateien abbricht, sobald solche Daten gefunden werden:

$ head -n2 test_data.SQL erstellen Tabelle T1 (ID int); In T1 -Werte einfügen (1); $ grep 'einfügen' test_data.sql | Tail -n2 in T1 -Werte (1000) einfügen; Binärdatei test_data.SQL -Übereinstimmungen 

Als zwei herausragende Beispiele aus persönlicher Erfahrung mit Datenbankarbeit, wenn Sie Datenbankserver -Fehlerprotokolle scannen, die problemlos solche Sonderzeichen wie Fehlermeldungen, Datenbank, Tabellen- und Feldnamen enthalten können, können es zum Fehlerprotokoll erfolgen, und solche Nachrichten sind regelmäßig in regionspezifischen Zeichensätzen.

Ein weiteres Beispiel ist das Test -SQL aus Datenbanktestsuiten (im obigen Beispiel gezeigt). Solche Daten enthalten häufig spezielle Zeichen für das Testen und Stresstieren des Servers auf vielfältige Weise. Das Gleiche gilt für die meisten Website -Testdaten und andere Domänentestdatensätze. Da Grep gegen solche Daten standardmäßig fehlschlägt, ist es wichtig, dass wir Grep eine Option hinzufügen, um diese abzudecken.

Die Option ist --Binärdateien = Text. Wir können sehen, wie unser Grep jetzt richtig funktioniert:

$ grep 'einfügen' test_data.sql | WC -L 7671 $ Grep 'Einfügen' test_data.sql | Tail -n1 Binärdatei test_data.SQL entspricht $ grep--Binärdateien = Text 'Einfügen' test_data.sql | WC -L 690427 

Was für ein Unterschied! Sie können sich vorstellen, wie viele automatisiert sind Grep Skripte auf der ganzen Welt können nicht alle Daten scannen, die sie scannen sollten. Was schlimmer ist und das Problem erheblich verbessert, ist das Grep In beiden Fällen ist der Fehlercode zu 100% stillschweigend ausfällt: Der Fehlercode beträgt 0 (Erfolg):

$ grep -q 'einfügen' test_data.SQL; echo $? 0 $ Grep -Binär -Files = Text -q 'einfügen' test_data.SQL; echo $? 0 


Die Fehlermeldung wird noch mehr angemeldet Stdout Ausgabe und nicht auf Stderr Wie man erwarten könnte. Wir können dies überprüfen, indem wir umleiten Stderr zum Null -Gerät /dev/null, nur Anzeigen Stdout Ausgang. Die Ausgabe bleibt bleibt:

$ grep 'einfügen' test_data.SQL 2>/dev/null | Tail -n1 Binärdatei test_data.SQL -Übereinstimmungen 

Dies bedeutet auch, dass wenn Sie Ihre GREP -Ergebnisse in eine andere Datei umleiten (> Einige Dateien.txt Nach dem GREP -Befehl), dass die 'Binärdatei… übereinstimmte' nun Teil dieser Datei, außer dass alle Einträge nach einem solchen Problem aufgetreten sind.

Ein weiteres Problem ist der Sicherheitsaspekt: ​​Nehmen wir eine Organisation, die zu Access -Protokollprotokoll -Greps verfügt, um Berichte an Sysadmins zu senden, wenn ein Schurkenagent (wie ein Hacker) versucht. Wenn ein solcher Hacker vor seinem Zugriffsversuch einige binäre Daten in das Zugriffsprotokoll einfügen kann, ist der Grep von ungeschützt durch --Binärdateien = Text, Es werden nie solche E -Mails gesendet.

Auch wenn das Skript gut genug entwickelt ist, um nach dem zu überprüfen Grep Code beenden, wird noch niemand einen Skriptfehler bemerken, da GREP zurückkehrt 0, oder mit anderen Worten: Erfolg. Erfolg, es ist jedoch nicht 🙂

Es gibt zwei einfache Lösungen; hinzufügen --Binärdateien = Text an alle deine Grep Anweisungen, und Sie möchten möglicherweise das Scannen von GREP -Ausgaben (oder den Inhalt einer umgeleiteten Ausgabedatei) für die reguläre Ausdrucksdatei in Betracht ziehen.*Streichhölzer'. Weitere Informationen zu regulären Ausdrücken finden Sie in Bash Regexps für Anfänger mit Beispielen und erweiterten Bash Regex mit Beispielen. Entweder würde es jedoch bevorzugt oder nur die erste, da die zweite Option nicht zukunftssicher ist. Der Text "Binärdatei ... übereinstimmt" kann sich ändern.

Beachten Sie schließlich, dass, wenn eine Textdatei beschädigt wird (Scheibenfehler, Netzwerkausfall usw.) Inhalt kann Teil des Textes und Teil-Binärer sein. Dies ist ein weiterer Grund, Ihre immer zu schützen Grep Aussagen mit der --Binärdateien = Text Möglichkeit.

Tl; dr: Verwenden --Binärdateien = Text für alle deine Grep Aussagen, auch wenn sie derzeit gut funktionieren. Sie wissen nie, wann diese binären Daten auf Ihre Datei klicken können.

Beispiel 2: Testen Sie auf das Vorhandensein einer bestimmten Zeichenfolge in einer Textdatei

Wir können benutzen Grep -q in Kombination mit einem Wenn Anweisung, um das Vorhandensein einer bestimmten Zeichenfolge in einer Textdatei zu testen:

$ if grep -Binärfilme = text -qi "test_data einfügen".SQL; dann Echo "gefunden"!"; sonst echo" nicht gefunden!"; fi gefunden! 

Lassen Sie uns dies ein wenig aufschlüsseln, indem wir zuerst überprüfen, ob die Daten wirklich vorhanden sind:

$ grep --Binärdateien = Text -i "einfügen" test_data.sql | Kopf -N1 In T1 -Werte (1) einfügen; 

Hier haben wir die fallen lassen Q (leise) Option, um Ausgabe zu erhalten und zu sehen, dass die Zeichenfolge 'Einfügung' - in fälschlichem unempfindlicher Weise eingenommen wurde (indem die Angabe der angegeben wird -ich Option zu Grep existiert in der Datei als "Einfügen ...".

Notiere dass der Q Option ist nicht speziell a testen Möglichkeit. Es ist eher ein Ausgangsmodifikator, der sagt Grep "ruhig" sein, ich.e. nichts ausgeben. Wie macht das also das? Wenn Anweisung wissen, ob eine bestimmte Zeichenfolge in einer Textdatei vorhanden ist? Dies geschieht durch die Grep Code beenden:

$ grep --Binärdateien = Text -i "einfügen" test_data.SQL 2> & 1>/dev/null; echo $? 0 $ Grep -Binär -Files = Text -i "Das existiert wirklich nicht" test_data.SQL 2> & 1>/dev/null; echo $? 1 


Hier haben wir eine manuelle Umleitung von allen gemacht Stderr Und sdtout Ausgabe an /dev/null durch Umleitung Stderr (2>) Zu Stdout (& 1) und alle umleiten Stdout Ausgabe an das Nullgerät (>/dev/null). Dies entspricht im Grunde genommen dem -Q (leise) Option zu Grep.

Als nächstes haben wir den Ausgabescode überprüft und festgestellt, dass wenn die Zeichenfolge gefunden wird, 0 (Erfolg) wird zurückgegeben, während 1 (Fehler) wird zurückgegeben, wenn die Zeichenfolge nicht gefunden wird. Wenn kann diese beiden Exit -Codes verwenden, um entweder die auszuführen Dann oder der anders darauf angegebene Klauseln.

Zusammenfassend können wir verwenden Wenn Grep -q Um das Vorhandensein einer bestimmten Zeichenfolge in einer Textdatei zu testen. Die vollständig korrekte Syntax, wie bereits in diesem Artikel zu sehen ist, ist Wenn Grep -Binär -Files = Text -qi "such_term" your_file.sql für unempfindliche Suchanfragen und Wenn Grep -Binär -Files = text -q "Search_term" your_file.sql für Fallsensitive Suchvorgänge.

Abschluss

In diesem Artikel haben wir die vielen Gründe gesehen, warum es wichtig ist, sie zu verwenden --Binärdateien = Text Bei fast allen Grep -Suchen. Wir haben auch untersucht Grep -q in Kombination mit Wenn Aussagen zum Testen auf das Vorhandensein einer bestimmten Zeichenfolge in einer Textdatei. Genießen Sie es zu benutzen Grep, und hinterlassen Sie uns einen Kommentar mit Ihrem größten Grep Entdeckungen!

Verwandte Linux -Tutorials:

  • Dinge zu installieren auf Ubuntu 20.04
  • Umgang mit Benutzereingaben in Bash -Skripten
  • Mastering -Bash -Skriptschleifen beherrschen
  • So finden Sie eine Zeichenfolge oder einen Text in einer Datei unter Linux
  • Verwenden Sie WPSCAN, um WordPress nach Sicherheitslücken auf Kali zu scannen
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • So rufen Sie Hardwareinformationen mit DMideCode unter Linux ab
  • Verschachtelte Schleifen in Bash -Skripten
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux