Wie würde ich einen Befehl an grep weiterleiten, um nach einer bestimmten Zeichenfolge zu suchen, wenn ein Teil dieser Zeichenfolge unbekannt ist?

485
user4493605

Das Programm, an dem ich arbeite, verwendet grepein Systemprotokoll nach einer bestimmten Warnung. Das Element des Syslog-Eintrags, nach dem ich suche, wird sich jedoch speziell auf diesen Eintrag beziehen und daher effektiv "zufällig" sein.

Ein Beispiel für das, wonach ich suche, wäre:

tail -f log | grep "string string" 

Danke im Voraus.

0
Verwenden Sie ". *" Dort, wo Sie "" für einen Platzhalter für "alles" eingefügt haben. dsstorefile1 vor 6 Jahren 0

1 Antwort auf die Frage

-2
C0deDaedalus

Sie müssen WildCards (oder Globbing Patterns) im grepBefehl wie folgt verwenden :

 tail -f log | grep "some_string.*some_string" 

Wobei .*(In den Kommentaren wird auch auf @ dsstorefile1 hingewiesen) das hier verwendete Globbing-Muster. Weitere Informationen zu Globbing-Mustern finden Sie auf den Hilfeseiten.


man 7 glob 

Was wird das zeigen:

 . (dot) : will match any single character (except end of line),  equivalent to ? (question mark) in standard wildcard expressions.  * (asterisk) : the proceeding item is to be matched zero or more times. ie. n* will match n, nn, nnnn, nnnnnnn but not na or any other character. 

Wenn Sie beide kombinieren, erhalten Sie:

.* (dot and asterisk) : match any string, equivalent to * in standard wildcards. 

Wie von @Bob in Kommentaren dargelegt, ist die Verwendung .*?viel besser als.*

`. *` ist gierig und erfasst möglicherweise mehr, als Sie möchten. `. *?` ist normalerweise besser. Bob vor 6 Jahren 2
Das hat nichts mit "`? "Anstelle von". "Zu tun. Lesen Sie meinen Kommentar noch einmal - das "?" Ist ein Modifikator für "*" und macht ihn faul anstatt der gierigen Standardeinstellung. Angenommen, PCRE. Bob vor 6 Jahren 1
Ich sollte auch darauf hinweisen, dass dies Regex ist (grep tut standardmäßig POSIX-Regex), kein Shell-Glob. Bob vor 6 Jahren 2
@ Bob bearbeitete meine Antwort und Könnten Sie bitte mehr darüber erklären, wie `. *` Gieriger ist und stattdessen `. *?` Verwendet. C0deDaedalus vor 6 Jahren 0
Lesen Sie dies: https://www.regular-expressions.info/repeat.html, insbesondere die "Watch Out for The Gieriness!" Amd Abschnitte "Faulheit statt Gier". Siehe auch https://stackoverflow.com/questions/2301285/what-do-lazy-and-greedy-mean-in-the-context-unabhängige-Ausdrücke Bob vor 6 Jahren 0
[globbing] (https://en.wikipedia.org/wiki/Glob_ (Programmierung))! = [regex] (https://en.wikipedia.org/wiki/Regular_expression) Cyrus vor 6 Jahren 1