Blog

Grep lernen - Suche nach Inhalten auf Linux/Mac

Dennis Vriend

Aktualisiert Oktober 21, 2025
5 Minuten

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 und die GNU-Version heißt . Die folgenden Beispiele verwenden die GNU-Version von grep, daher sollten Mac-Benutzer den Befehl 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

Contact

Let’s discuss how we can support your journey.