Angenommen, ich habe die folgende Datei:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
Standardmäßig wird grep
jede Zeile zurückgegeben, die den Suchbegriff enthält:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Durch Übergeben des --color
Parameters an grep
wird der Teil der Zeile hervorgehoben, der dem Suchausdruck entspricht, es werden jedoch nur Zeilen zurückgegeben, die den Ausdruck enthalten. Gibt es eine Möglichkeit, grep
jede Zeile in der Quelldatei auszugeben, aber die Übereinstimmungen zu markieren?
Mein derzeitiger schrecklicher Hack, um dies zu erreichen (zumindest bei Dateien, die nicht mehr als 10000 aufeinanderfolgende Zeilen ohne Übereinstimmungen enthalten), ist:
$ grep -B 9999 -A 9999 test test
Wenn grep
dies nicht möglich ist, gibt es ein anderes Befehlszeilentool, das dieselbe Funktionalität bietet? Ich habe damit herumgespielt ack
, aber es scheint auch keine Option dafür zu geben.
quelle
-C 9999
anstelle von verwenden.-A 9999 -B 9999
Ich mache immer:grep -C 9999 pattern file
Antworten:
Was wir hier machen, ist die Übereinstimmung mit dem
$
Muster und dem Testmuster, offensichtlich$
gibt es nichts zu färben, so dass nur das Testmuster Farbe bekommt. Das-E
schaltet gerade den erweiterten Regex-Abgleich ein.Sie können leicht eine Funktion daraus erstellen:
quelle
highlight () { grep --color -E "$1|$" $2 ; }
. Verwendung:highlight test yourfile
"$2"
sollte auch zitiert werden.highlight () { grep --color -E "$1|$" "$@" }
das erlaubt Dateien mit Leerzeichen im Namen und mehrere Dateien."$1"
in den Dateien haben. Verwenden Siehighlight () { grep --color -E "$1|$" "${@:1}" }
Verwenden Sie für Ubuntu und Debian ack-grep anstelle von ack
quelle
--regexp string
; das ack / ack-grep-äquivalent ist--match string
ack --passthru
mit Perl:grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
ack --passthru
Funktioniert auch auf Streams! Zum Beispielifconfig | ack --passthru inet
Ein anderer Weg , dies zu tun richtig und portabel mit
grep
(außer mit zwei regulären Ausdrücke mit Wechsel , wie in der akzeptierten Antwort) über die Null - Muster (bzw. Null - String).Es sollte mit beiden
-E
und-F
Switches gleich gut funktionieren, da laut Standard :und
Es geht also nur ums Laufen
bzw.
quelle
grep -F -e '' -e 'string'
.seq 3 | grep -F -e '' -e 2
gibt nur 2 in 2,27 (und 2,26, aber nicht 2,25 und nicht im Git-Kopf). Nur mit-F
(nicht ohne oder mit -E). IOW, nur 2.26 und 2.27 scheinen den Bug zu haben und nur mit -F.seq 3 | grep -F -e '' -e '' -e 2
dies auch mit 2.27-F
, so dass Sie sich keine Gedanken mehr darüber machen müssen, in welchen Zeichen sie vorkommenstring
. Sie möchten vielleicht erwähnen--color
; Wenn diese Antwort auf der Seite auftaucht (wenn sie nach Stimmen sortiert ist), werden möglicherweise mehr Personen sie vor den anderen Antworten lesen.Ich habe die folgende Funktion, die ich für solche Dinge benutze:
Intern sieht es irgendwie hässlich aus, es ist schön und einfach zu bedienen, wie folgt:
oder, für ein etwas realeres Beispiel:
Sie können die Farben nach Belieben ändern (was bei grep möglicherweise schwierig ist - da bin ich mir nicht sicher), indem Sie die Werte für
1
und31
und43
(danach\e[
) in unterschiedliche Werte ändern . Die Codes zu verwenden sind alle über den Ort , aber hier ist eine kurze Einführung: die 1 bolds der Text, das31
macht es rot, und das43
gibt einen gelben Hintergrund.32
oder33
würde verschiedene Farben haben, und44
oder45
würde verschiedene Hintergründe haben: Sie bekommen die Idee. Sie können es sogar zum Blinken bringen (mit einem5
), wenn Sie dazu neigen.Dies verwendet keine spezielle Perl - Module und Perl ist fast allgegenwärtig, also würde ich erwarten , dass es so gut wie überall zu arbeiten. Die grep-Lösung ist sehr clever, aber der --color-Schalter für grep ist nicht überall verfügbar. Ich habe diese Lösung beispielsweise gerade auf einer Solaris-Box mit bash und einer anderen mit ksh sowie auf meinem lokalen Mac OS X-Computer mit zsh ausprobiert. Alles hat gut funktioniert. Solaris erstickte jedoch an der
grep --color
Lösung.Außerdem ist ack großartig und ich empfehle es jedem, der es noch nicht entdeckt hat, aber ich hatte einige Probleme, es auf einigen der vielen Server zu installieren, auf denen ich arbeite. (Ich vergesse, warum: Ich denke, im Zusammenhang mit Perl-Modulen ist es erforderlich.)
Da ich nicht glaube , habe ich jemals gearbeitet auf einer Unix - Box , die nicht hat Perl installiert ist (mit Ausnahme von Embedded-Systemen des Typs, Linksys - Router, und so) würde ich sagen , dass dies so ziemlich eine universell einsetzbare Lösung ist .
quelle
Anstelle von Grep können Sie auch Less verwenden:
Suche so:
/pattern
EnterDieser Wille:
So blättern Sie zur nächsten übereinstimmenden Zeile:
n
So blättern Sie zur vorherigen übereinstimmenden Zeile:
N
So schalten Sie die Hervorhebung um: Esc
u
Sie können auch die Hervorhebungsfarbe ändern, wenn Sie möchten.
quelle
Du kannst es versuchen:
Nicht sehr portabel, und selbst wenn Perl installiert ist, müssen Sie möglicherweise ein anderes Modul herunterladen. Außerdem färbt es die gesamte Zeile und nicht nur das Suchwort.
quelle
ripgrep
Verwenden Sie
ripgrep
mit seinem--passthru
Parameter:Es ist eines der schnellsten Grepping-Tools , da es auf Rusts Regex-Engine aufbaut , die endliche Automaten, SIMD und aggressive wörtliche Optimierungen verwendet, um die Suche sehr schnell zu machen.
quelle
Es gibt einen viel einfacheren Weg, dies für GNU grep zu tun, aber ich denke nicht, dass es portabel ist (dh BSD grep):
In einer Pipe:
cat <file> | grep --color=always -z <query>
In einer Datei:
grep --color=always -z <query> <file>
Hier geht es um Cyrus 'Antwort .
quelle
--color
ist kein Standard .)Keine der bisher gegebenen Antworten bietet eine tragbare Lösung.
Hier ist eine portable 1 Shell - Funktion ich bereits geschrieben in einem geschlossenen als doppelte Frage , die nicht Nicht - Standard - Tools oder Nicht - Standard - Verlängerungen erfordert mit
perl
,ack
,ggrep
,gsed
,bash
und die Gleichen , sondern braucht nur ein POSIX - Shell und die POSIX - Pflicht Dienstprogrammesed
undprintf
:Du kannst es so benutzen:
Die Hervorhebungsfarbe kann mithilfe eines der folgenden Codes im sed-Befehlsargument angepasst werden (32 m sind hier grün):
1 Solange Ihr Terminal ANSI-Farben-Escape-Sequenzen unterstützt.
quelle
Eine
sed
Version, die auf beidenbash
und funktioniertash
.quelle
OP gefragt
grep
, und das ist, was ich EMPFEHLEN ; Aber nachdem Sie sich bemüht haben, ein Problem zu lösensed
, finden Sie hier eine einfache Lösung:oder
Wird
main
in rot malen .\E[31m
: rote Farbe Startreihenfolge\E[0m
: fertige Farbmarke&
: das passende Muster/g
: alle Wörter in einer Zeile, nicht nur die ersten$'string'
Bash-Strings mit Escape-Zeichen werden interpretiertIn Bezug auf grep funktioniert es auch mit
^
(Zeilenanfang) anstelle von$
(Zeilenende). Beispiel:Und nur um diesem verrückten Alias zu zeigen, dass ich es NICHT EMPFEHLE , können Sie sogar die offenen Zitate lassen:
Alle Arbeit! :) Mach dir keine Sorgen, wenn du vergisst, das Zitat zu schließen, wird dich bash mit einem "fortlaufenden Linienzeichen" erinnern.
quelle