Blog
Grep lernen - Suche nach Inhalten auf Linux/Mac

Global Regular Expression Print oder Grep ist ein Tool, das Textdateien nach dem Vorkommen eines bestimmten regulären Ausdrucks durchsucht und jede Zeile, die eine Übereinstimmung enthält, auf der Standardausgabe ausgibt. Grep verwendet reguläre Ausdrücke oder Regex für den Abgleichsalgorithmus. Regex ist eine symbolische Notation zur Erkennung von Mustern in Text und wird häufig zur Textverarbeitung verwendet. Es ist an der Zeit, 'grep' zu lernen!
Grep auf Linux und Mac
Bei der Verwendung des Terminals ändert sich, dass Sie Linux und Mac verwenden und zwischen ihnen hin und her wechseln. Lassen Sie uns zunächst erklären, dass der Grep-Befehl unter Linux anders ist als auf dem Mac. Der Mac wird mit der BSD-Version von Grep ausgeliefert, die Sie durch Eingabe des Befehls überprüfen können:
$ grep -V
grep (BSD grep) 2.5.1-FreeBSD
Linux verwendet die GNU-Version von Grep, die durch Eingabe überprüft werden kann:
$ docker run -it ubuntu
root@d5b72371f815:/# grep -V
grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
GNU Grep auf dem Mac
GNU grep kann auf dem Mac mit Hilfe von homebrew installiert werden. Nachdem brew grep installiert hat, stehen Ihnen zwei Versionen des Befehls zur Verfügung. Die BSD-Version heißt ggrep verwenden.
# brew install grep
$ ggrep -V
ggrep (GNU grep) 3.1
Packaged by Homebrew
Copyright (C) 2017 Free Software Foundation, Inc.
Posix und PCRE Regex
Der Unterschied zwischen der BSD- und der GNU-Version von Grep besteht in der Regex-Engine, die er verwendet. Die BSD-Version verwendet die POSIX-kompatiblen regulären Ausdrücke und die GNU-Version verwendet die Perl-kompatiblen regulären Ausdrücke (PCRE). Die kurze Erklärung für den Unterschied ist, dass die GNU-Version von grep viel einfacher zu benutzen ist. Einen Überblick über die Unterschiede finden Sie in diesem Spickzettel.
Grep verwenden
Meistens verwenden wir grep, um die Ausgabe über die Pipeline zu leiten. Auf diese Weise fungiert grep z.B. als Filter:
# take the first 3 lines from the history, filtered by grep
$ history | grep "git" | head -3
157 git status
158 git status
159 git add .
Standardmäßig unterscheidet grep zwischen Groß- und Kleinschreibung:
$ history | grep "TEST" | head -3
399 touch TEST_1.txt
400 touch TEST_2.txt
401 touch TEST_3.txt
Wenn Sie die Option -i hinzufügen, wird bei der Suche die Groß- und Kleinschreibung nicht berücksichtigt:
$ history | grep -i "TEST" | head -3
302 find . -type f -name test*
303 find . -type f -name test*.*
304 find . -type f -name test1.txt
Mit der Option -w können wir auch auf exakte Wörter abgleichen:
$ history | grep -w "git status" | head -3
157 git status
158 git status
279 git status
Wir können die Optionen kombinieren, so dass -iw nach einem exakten Wort sucht, unabhängig von der Groß- und Kleinschreibung:
history | grep -iw "TEST_1" | head -3
399 touch TEST_1.txt
545 history | grep -iw "TEST_1" | head -3
Suche innerhalb einer Datei
Ich habe ein Beispielprojekt vorbereitet, das Sie verwenden können, um grep zu lernen. Grep kann verwendet werden, um Dateien nach Inhalten zu durchsuchen. Um zum Beispiel nach dem Text 'Dennis' in der Datei LICENSE zu suchen, geben Sie ein:
grep "boto3" Pipfile
"boto3" = "*"
Die Option -n zeigt die Zeilennummer des Treffers an:
$ grep -n "boto3" Pipfile
10:"boto3" = "*"
Durchsuchen von Dateien
Grep kann auch verwendet werden, um mehrere Dateien durch Tippen zu durchsuchen:
grep -n "boto3" ./*
./Pipfile:10:"boto3" = "*"
grep: ./config: Is a directory
grep: ./lambdas: Is a directory
grep: ./templates: Is a directory
grep: ./tests: Is a directory
Grep kann nur Dateien durchsuchen, deshalb sehen wir die Meldung 'Ist ein Verzeichnis'. Um alle Dateien in allen Ordnern zu durchsuchen, müssen wir die rekursive Option -r verwenden:
$ grep -r "handler" .
./lambdas/log_lambda.py:def handler(event, ctx):
./lambdas/cloudwatch_subscription_lambda.py:def handler(event, ctx) -> None:
./templates/cloudwatch.yaml: Handler: index.handler
./templates/cloudwatch.yaml: def handler(event, ctx):
./templates/cloudwatch.yaml: Handler: index.handler
./templates/cloudwatch.yaml: def handler(event, ctx) -> None:
Grep muss die Ausgabe nicht anzeigen, sondern kann mit der Option -l auch melden, welche Datei einen Treffer enthält:
$ grep -rl "handler" .
./lambdas/log_lambda.py
./lambdas/cloudwatch_subscription_lambda.py
./templates/cloudwatch.yaml
Grep kann auch den Kontext rund um den Treffer anzeigen. Verwenden Sie die Option -A, um Zeilen nach dem Treffer zu sehen. Verwenden Sie -B, um Zeilen vor dem Treffer zu sehen und -C, um Zeilen vor und nach dem Treffer zu sehen:
$ grep -r -C 2 "handler" .
./lambdas/log_lambda.py:def handler(event, ctx):
./lambdas/log_lambda.py- print(event)
--
--
./lambdas/cloudwatch_subscription_lambda.py- return decode_record(event['awslogs'])
./lambdas/cloudwatch_subscription_lambda.py-
./lambdas/cloudwatch_subscription_lambda.py:def handler(event, ctx) -> None:
./lambdas/cloudwatch_subscription_lambda.py- print(json.dumps(decode_event(event)))
--
--
./templates/cloudwatch.yaml- Type: AWS::Lambda::Function
./templates/cloudwatch.yaml- Properties:
./templates/cloudwatch.yaml: Handler: index.handler
./templates/cloudwatch.yaml- Runtime: python3.6
./templates/cloudwatch.yaml- Role: !GetAtt 'LambdaBasicExecutionRole.Arn'
--
--
./templates/cloudwatch.yaml- Code:
./templates/cloudwatch.yaml- ZipFile: |-
./templates/cloudwatch.yaml: def handler(event, ctx):
./templates/cloudwatch.yaml- print(event)
./templates/cloudwatch.yaml-
--
--
./templates/cloudwatch.yaml- Type: AWS::Lambda::Function
./templates/cloudwatch.yaml- Properties:
./templates/cloudwatch.yaml: Handler: index.handler
./templates/cloudwatch.yaml- Runtime: python3.6
./templates/cloudwatch.yaml- Role: !GetAtt 'LambdaBasicExecutionRole.Arn'
--
--
./templates/cloudwatch.yaml- return decode_record(event['awslogs'])
./templates/cloudwatch.yaml-
./templates/cloudwatch.yaml: def handler(event, ctx) -> None:
./templates/cloudwatch.yaml- print(json.dumps(decode_event(event)))
./templates/cloudwatch.yaml- CloudWatchSubscriptionLambdaLogGroup:
Regex-Suche
Grep ist ein globaler regulärer Ausdruck und kann auf der Grundlage einer Regex suchen. Beachten Sie, dass Mac-Benutzer ggrep verwenden müssen und die Option -P nutzen, um nach PCRE Regex zu suchen:
$ grep -rl -P "decode_event([.]*)" .
./lambdas/cloudwatch_subscription_lambda.py
./tests/.pytest_cache/v/cache/nodeids
./tests/test_cloudwatch_subscription_lambda.py
./templates/cloudwatch.yaml
Fazit
Grep oder Global Regular Expression Print kann auf der Grundlage eines Wortes oder einer Regex nach Dateiinhalten suchen. Grep kann auch verwendet werden, um die Ergebnisse eines Befehls mit Hilfe einer Pipe zu filtern. Grep ist ein unverzichtbares Werkzeug in Ihrem Werkzeugkasten!
Verfasst von
Dennis Vriend
Unsere Ideen
Weitere Blogs
Contact



