Wie kann ich Übereinstimmungen mit GNU grep hervorheben?

18

Ich habe unter Linux gesehen, dass grepso konfiguriert ist , dass die Übereinstimmung hervorgehoben und die übereinstimmende Datei gedruckt wird.

Wie kann ich grepdie Hervorhebung von Übereinstimmungen konfigurieren ?

Elmarco
quelle

Antworten:

10
alias cgrep='grep -nR --color'

Verwendung:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

Auch einer meiner Favoriten:

$ pgrep some-hanging-process

listet alle Pids von Prozessen auf, die mit dem Namen eines hängenden Prozesses übereinstimmen, den Sie in der folgenden Situation verwenden können:

$ kill $(pgrep some-hanging-process)
Eimantas
quelle
12
es gibt einen pkill befehl für den letzten
diega 10.08.10
1
Mit dem jüngsten Versionen von GNU grep, grep -rsollte in der Regel bevorzugt über sein grep -Rwie die ehemaligen Symlinks nicht durchqueren.
Stéphane Chazelas
19

Ich habe festgestellt, dass der beste Weg, grep zu pimpen , die Verwendung von ack ist , das im Wesentlichen rekursives grep mit einer intelligenten Ignorierliste (z. B. durchsucht keine .svn-Verzeichnisse, ignoriert Sicherungsdateien usw.), farbliche Hervorhebung von Ergebnissen und Perl reguliert. Es ist das, was grep in 98,6% der Fälle tun soll.

Kai
quelle
5
+1 für die Erwähnung von ack. Vergessen Sie nicht, die Option --pager = "less -R" einzufügen, um die Hervorhebung für paginierte Ergebnisse beizubehalten. Erwähnenswert ist auch, dass es unter Ubuntu als "ack-grep" bezeichnet wird, da "ack" verwendet wird.
Shawn Chin
Ich benutze auch ack, aber manchmal haben Sie es nicht zur Verfügung ..
Elmarco
2
Da ack nur ein Perl-Skript ist, können Sie es überall dort verfügbar machen, wo Sie Perl installiert haben. Dies ist kein Reck.
Kai
Ack ist gut für die Standardeinstellungen, aber in der Zeit, die Sie für die Installation von ack benötigen, könnten Sie einige Standardeinstellungen für grep konfiguriert haben - siehe meine Antwort an anderer Stelle auf dieser Seite. Ich habe das einmal in den 1980ern gemacht, und seitdem hat grep alles gemacht, was ack macht. (nur grep ist eigentlich schneller, trotz acks lautem gegenteiligen behaupten)
Jonathan Hartley
7

Ich habe dies in meinem .bashrc festgelegt, anstatt grep mit einem Alias ​​neu zu definieren:

    export GREP_OPTIONS="--color=auto"

Für mich funktioniert das unter Linux, MacOSX & FreeBSD.

Stefan Lasiewski
quelle
GREP_OPTIONSsollte als schädlich angesehen werden. Ich empfehle aliasstattdessen zu verwenden . Siehe hier: bugs.launchpad.net/ubuntu/+bug/67141
lesmana
Ich bin damit einverstanden, dass GREP_OPTIONS in bestimmten Skripten ein Problem darstellen kann. Aber wie ich in Fehler 67141 argumentiert habe , erlaubt GREP_OPTIONS dem Benutzer, eine Option für viele Formen von grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep usw.) festzulegen, während für ein Alias ​​festgelegt werden muss jede Form von * grep, und es gibt viele Arten von grep.
Stefan Lasiewski
Ich habe GREP_OPTIONS jahrelang (nein, Jahrzehnte) benutzt, aber der Schaden, den es verursacht, ist sehr real. Alle Tools, die grep mit dieser env var-Gruppe aufrufen, erben Ihr geändertes Standardverhalten, und dies wird diese Tools beschädigen. Vermeiden Sie dieses Problem vollständig, indem Sie stattdessen einen Alias ​​oder ein ausführbares Wrapper-Skript definieren.
Jonathan Hartley
Skripte müssen ihre Umgebung bereinigen. Kein Wenn, Aber oder Wie auch immer erlaubt. Zeitraum. (Ja, es ist ein königlicher Schmerz im unteren Rücken ...).
Vonbrand
3

Ich würde empfehlen, die Umgebungsvariable GREP_OPTIONS zu vermeiden. Sie wirkt sich auf jeden Aufruf von grep aus, auch auf diejenigen, die in anderen Tools eingebettet sind. Wenn diese Tools erwarten, dass sich grep auf eine Weise verhält, und Sie dieses Verhalten ändern, werden diese Tools beschädigt.

Stattdessen können Sie einen Alias ​​erstellen, der gut funktioniert. Dies wirkt sich nur auf Grep-Aufrufe aus Ihrer interaktiven Shell aus (dh, die Sie selbst eingeben).

Die letzte Option, die mir am besten gefällt, ist die Erstellung eines Wrapper-Skripts, das grep aufruft. Ich bevorzuge dies einem Alias, da ich diesen Wrapper von anderen Programmen aus aufrufen kann. ZB in vim, indem Sie vimgrep so einstellen, dass sich meine Suchvorgänge in vim genauso verhalten wie die Suchvorgänge in der Befehlszeile.

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

Rufen Sie dies auf mit:

$ grp pattern dir

z.B

$ grp pattern .

sucht in allen Textdateien im aktuellen Verzeichnis und in den Unterverzeichnissen nach Instanzen von 'pattern'.

Beachten Sie, dass ich mein Skript "grp" nenne, anstatt "grep" zu schattieren, damit ich immer weiß, ob ich grep mit meinen benutzerdefinierten Standardeinstellungen aufrufe oder nicht.

Standardmäßig schließe ich ein:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

Ich denke, jeder würde Quellcodeverwaltungsverzeichnisse überspringen wollen: .hg .git .bzr .svn

Das Überspringen von 'build' und 'dist' sind Python-Ismen und treffen wahrscheinlich auf die meisten Menschen nicht zu. Zweifellos werden Sie während Ihrer Arbeit Ihre eigenen Besonderheiten entwickeln.

'tags' ist die Ausgabe von ctags, die ich für 'Gehe zur Funktionsdefinition' und dergleichen in Tools wie vim verwende. Als solches enthält es mindestens eine Kopie jedes Wortes und Symbols aus meinem Quellcode. Es lohnt sich also, aus Ihren Suchergebnissen auszuscheiden.

"$ *" am Ende ist die Bash-Syntax für "und alle anderen Parameter von der Befehlszeile", sodass Sie Muster und Verzeichnis übergeben können, um wie gewohnt zu suchen und alle anderen Befehlszeilenflags zu überschreiben, die Sie möchten .

Jonathan Hartley
quelle
2

Die --colorOption wurde bereits mehrmals erwähnt, aber ich möchte hinzufügen, dass es möglich ist, die Farbe, in der die Übereinstimmungen hervorgehoben werden, mithilfe einer Umgebungsvariablen zu konfigurieren

export GREP_COLOR="1;33"

Die Farbe sollte zu Referenzzwecken mit ANSI-Farbcodes codiert werden

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37
Adam Byrtek
quelle
1
GREP_COLORist veraltet. Verwenden Sie GREP_COLORSstattdessen.
g33kz0r
2

Da ich keine Beispiele für das tatsächliche Festlegen von Farben gesehen habe, ist hier ein einfaches Setup für GNU grep:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

Sei vorsichtig damit GREP_OPTIONS; Verwenden Sie es nicht für etwas anderes als Dinge wie --color=autooder es wird alle Skripte durcheinander bringen, die grep auf Ihrem System verwenden.

docwhat
quelle