Was ist falsch am „grep“-Befehl in Ubuntu-18.04.6?

Was ist falsch am „grep“-Befehl in Ubuntu-18.04.6?

Ich habe 'grep' jahrzehntelang genossen, aber ich habe Linux Jahre später verlassen und bin wieder zurückgekommen, wobei ich festgestellt habe, dass 'grep' anders funktioniert als vorher. Ich habe seine Verwendung im Internet überprüft und bestätigt, dass mein Speicher nicht beschädigt ist.

Ich bin sicher, dass sich einige *.hDateien *.cppin tieferen Unterverzeichnissen befinden. Ich habe die folgenden Befehle verwendet und unerwartet ähnliche Ergebnisse erhalten:

grep 44738 -r -l *.h
grep 44738 -r -l *.c
grep 44738 -r -l *.c*

Ich habe das Ergebnis von

 grep: *.h: No such file or directory
 ./daemons/snmpcd/snmpcd.cpp
 ./.svn/pris.......svn-base

 grep: *.c: No such file or directory
 ./daemons/snmpcd/snmpcd.cpp
 ./.svn/pris.......svn-base

 grep: *.c*: No such file or directory
 ./daemons/snmpcd/snmpcd.cpp
 ./.svn/pris........svn-base

jeweils.

  • Wenn ich command: verwendet habe grep 44738 -r -l ., habe ich das gleiche Ergebnis erhalten, mit Ausnahme der ersten Zeile vongrep: ...
  • Wenn ich den Befehl „“ verwendet habe grep 44738 -r -l *.c*, kam ich grep: ...ohne Dateien aus.
  • Wenn ich command: verwendet habe grep 44738 -r -l -file *.c* ., bekomme ich nurgrep: *.c*: No such file or directory

Das Ergebnis widerspricht fast meiner Erfahrung vor einigen Jahren. Meine Fragen sind:

  1. Gab es bei Ubuntu 18.04.6 viele Änderungen grep?
  2. Wie kann ich Dateimuster in grep angeben? Warum kann ich keine Muster wie verwenden *.c, *.h *.c*wie ich es vor Jahren getan habe?
  3. Mein Kollege hat mir vorgeschlagen, zu verwenden ack, aber ich habe fast das Gleiche gefunden. Welche Befehle sollte ich wie zuvor für die globale Zeichenfolgensuche verwenden grep?

Antwort1

Hier gibt es zwei Probleme. Erstens können Sie die Flags -roder nicht kombinieren -Rund gleichzeitig Zieldateinamen als Argumente angeben. Das -r/ -Raktiviert die rekursive Suche, was bedeutet, dass „alle Dateien in den angegebenen Verzeichnissen durchsucht werden“, sodass grepdas Argument als Verzeichnis behandelt wird, in dem nach Dateien gesucht werden soll. Da es kein Verzeichnis gibt, dessen Name mit dem *.c*Glob übereinstimmt, erhalten Sie den angezeigten Fehler. Soweit ich mich erinnern kann, war dies immer der Fall, zumindest seit ich Linux verwende, was nun fast 25 Jahre her ist.

Sie können Globs beliebig verwenden, wenn Sie die -r/ -R-Flags nicht verwenden.AberSie müssen sie in Anführungszeichen setzen, das ist unbedingt erforderlich. Wenn Sie sie nicht in Anführungszeichen setzen, wie Sie es getan haben, wird der Glob von der Shell auf alle übereinstimmenden Dateien erweitert und grepsieht nicht den Glob, sondern nur das Ergebnis der Erweiterung durch die Shell, also nur alle Dateien oder Verzeichnisse im aktuellen Verzeichnis, deren Namen mit dem Glob übereinstimmen.

GNU grep, die Standardeinstellung unter Linux, bietet zwar eine Möglichkeit, das Gewünschte zu tun, die Syntax ist jedoch anders:

grep 44738 -r -l --include='*.h'

Sehen man grep:

  --include=GLOB
          Search only files whose base name matches GLOB (using  wildcard
          matching  as  described  under  --exclude).   If  contradictory
          --include and --exclude options are given,  the  last  matching
          one  wins.   If no --include or --exclude options match, a file
          is included unless the first such option is --include.

verwandte Informationen