1019 Stimmen

Kann grep nur Wörter anzeigen, die dem Suchmuster entsprechen?

Gibt es eine Möglichkeit, grep dazu zu bringen, "Wörter" aus Dateien auszugeben, die dem Suchausdruck entsprechen?

Wenn ich alle Instanzen von, sagen wir, "th" in einer Reihe von Dateien finden will, kann ich das tun:

grep "th" *

aber die Ausgabe wird in etwa so aussehen (Fettdruck von mir);

some-text-file : **the** cat sat on **the** mat  
some-other-text-file : **the** quick brown fox  
yet-another-text-file : i hope **this** explains it **thoroughly** 

Ich möchte mit der gleichen Suche Folgendes ausgeben:

the
the
the
this
thoroughly

Ist dies mit grep möglich? Oder mit einer anderen Kombination von Tools?

1443voto

Dan Midwood Punkte 16935

Versuchen Sie grep -o :

grep -oh "\w*th\w*" *

Edit: passend zum Kommentar von Phil.

Von die Dokumente :

-h, --no-filename
    Suppress the prefixing of file names on output. This is the default
    when there is only  one  file  (or only standard input) to search.
-o, --only-matching
    Print  only  the matched (non-empty) parts of a matching line,
    with each such part on a separate output line.

116voto

PicoCreator Punkte 9448

Distributionsübergreifende sichere Antwort (einschließlich Windows minGW?)

grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"

Wenn Sie ältere Versionen von grep verwenden (wie 2.4.2), die die Option -o nicht enthalten, dann verwenden Sie die obige Version. Andernfalls verwenden Sie die einfacher zu wartende Version unten.

Linux distributionsübergreifende sichere Antwort

grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'

Zusammengefasst: -oh gibt den regulären Ausdruck aus, der auf den Inhalt der Datei (und nicht auf den Dateinamen) passt, genau so, wie man es von einem regulären Ausdruck in vim/etc. erwarten würde. Nach welchem Wort oder regulären Ausdruck Sie dann suchen, bleibt Ihnen überlassen! Solange Sie sich an POSIX und nicht an die Perl-Syntax halten (siehe unten)

Mehr aus dem Handbuch für grep

-o      Print each match, but only the match, not the entire line.
-h      Never print filename headers (i.e. filenames) with output lines.
-w      The expression is searched for as a word (as if surrounded by
         `[[:<:]]' and `[[:>:]]';

Der Grund, warum die ursprüngliche Antwort nicht für alle gilt

Die Verwendung von \w variiert von Plattform zu Plattform, da es eine erweiterte "Perl"-Syntax ist. Daher verwenden diejenigen grep-Installationen, die auf die Arbeit mit POSIX-Zeichenklassen beschränkt sind [[:alpha:]] und nicht sein Perl-Äquivalent von \w . Siehe die Wikipedia-Seite über reguläre Ausdrücke für mehr

Letztendlich wird die obige POSIX-Antwort unabhängig von der Plattform viel zuverlässiger sein (da sie das Original ist) für grep

Was die Unterstützung von grep ohne die Option -o betrifft, so gibt das erste grep die relevanten Zeilen aus, das tr teilt die Leerzeichen in neue Zeilen auf, das letzte grep filtert nur nach den entsprechenden Zeilen.

(PS: Ich weiß, dass die meisten Plattformen inzwischen mit Patches für \w.... aber es gibt immer welche, die zurückbleiben)

Lob für die "-o"-Umgehung von @AdamRosenfields Antwort

70voto

Abhinandan prasad Punkte 951

Es ist einfacher als Sie denken. Versuchen Sie dies:

egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)

egrep -iwo 'th.[a-z]*' filename.txt  ### (Case Insensitive)

Wo,

 egrep: Grep will work with extended regular expression.
 w    : Matches only word/words instead of substring.
 o    : Display only matched pattern instead of whole line.
 i    : If u want to ignore case sensitivity.

52voto

Adam Rosenfield Punkte 373807

Sie könnten Leerzeichen in Zeilenumbrüche umwandeln und dann grep verwenden, z. B.:

cat * | tr ' ' '\n' | grep th

44voto

ghostdog74 Punkte 305138

Einfach awk keine Kombination von Werkzeugen erforderlich.

# awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file
the
the
the
this
thoroughly

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X