Linux Colorize Find?

7

Ist es möglich, die Ausgabe von find zu "kolorieren"?

Ich habe einen Fund, der auf allen meinen Servern / home sucht und bestimmte Dateien ausführt. Da diese unter anderem mit meinen anderen Suchergebnissen gemischt sind, möchte ich sie kolorieren.

Ist das möglich?

JPerkSter
quelle

Antworten:

6

Mit GNU find können Sie -printfanstelle von -printanpassen, wie ein Dateiname gedruckt wird. (Sie können dies auch mit der Standardsuche tun, jedoch auf Umwegen -exec sh -c 'echo ...' {}.) Mit dem folgenden Befehl werden beispielsweise ausführbare Dateien in Grün und andere reguläre Dateien in der Standardfarbe gedruckt:

find . -type f \( -perm +100 -printf '\033[32m%p\033[0m\n' -or -print \)
Gilles 'SO - hör auf böse zu sein'
quelle
Gibt es eine Möglichkeit, nur das drucken zu lassen, wonach wir suchen?
JPerkSter
[root @ server / home] # find. (-maxdepth 1 -iname "cpmove- *" -printf '\ 033 [32m% p \ 033 [0m \ n' -oder -print)
JPerkSter
Dies passt zu allem, aber nur zum Färben von 'cpmove'-Dateien
JPerkSter
@ JPerkSter: Das war die Absicht meines Beispiels. Wenn Sie nicht alles drucken möchten, entfernen Sie -or -print.
Gilles 'SO - hör auf böse zu sein'
6

Was ich normalerweise mache, um das Scrollen von Befehlszeilentexten hervorzuheben, ist die Verwendung dieser Bash + Perl-Funktion:

highlight() { perl -pe "s/$1/\e[1;31;43m$&\e[0m/g"; }

so wie:

command | highlight "desired text"

violett
quelle
1
Auf meinen eigenen Boxen habe ich diese Funktion in .bashrc eingefügt. Wenn ich an den Boxen anderer Leute arbeite, füge ich sie einfach als Einzeiler ein.
Violett
Nett. Aber warum nicht grep --color verwenden? :) Es ist seit vielen Jahren auf allen Plattformen auf gnu grep verfügbar.
Nicht jetzt
1
grep verwirft auch nicht übereinstimmende Zeilen :( Dennis Williamsons Antwort ist jedoch ungefähr gleichwertig: D
violett
3
find ... | grep -E --color 'words of interest|more good stuff|$'

Das Dollarzeichen stimmt mit dem Ende jeder Zeile überein, hat jedoch nichts hervorzuheben, sodass auch Zeilen ohne Übereinstimmungen ausgegeben werden, während andere von Ihnen aufgelistete Elemente hervorgehoben werden.

Bis auf weiteres angehalten.
quelle
+1 Das gefällt mir sehr gut! Wenn die Farbe für grep standardmäßig aktiviert ist (oder auf eingestellt ist auto), handelt es sich um eine sehr kurze Pipe zum Hervorheben, die praktisch überall verfügbar ist : grep -E 'word|$'. Dies sollte mehr Aufmerksamkeit bekommen!
Levite
Selbst export GREP_OPTIONS='--color=auto'wenn Sie EINMAL tippen (z. B. in Feldern anderer Personen, in denen standardmäßig keine Grep-Farben aktiviert sind), grep -E 'i|$'ist dies immer noch kürzer als bei den meisten anderen Lösungen.
Levite
2

Dies ähnelt der Antwort von @jrods, erfordert jedoch kein Perl. Dies funktioniert mit GNU grep, das unter Darwin, Linux & FreeBSD installiert ist.

Sie können grepmit Farben verwenden und Ihren Befehl durch grep leiten:

export GREP_OPTIONS="--color=auto"

Um den Text hervorzuheben, gehen Sie einfach wie folgt vor:

find / -name "perl" |grep "your_string_here"
Stefan Lasiewski
quelle
1

Ich habe eine, die ich zum Beispiel verwende, um als (Alias-) Ersatz für ls -d */ .*/die Verzeichnisse .und zu arbeiten ..:

finden . -mindepth 1 -maxdepth 1 -type d -exec ls --color = auto -d {} \;

Auf diese Weise erhalte ich nicht nur Hervorhebungen, sondern auch die gleiche Systemhervorhebung, die normalerweise angewendet wird.

roberto tomas
quelle
0

Ich verwende die folgende Funktion (definiert in ~ /. {Ba, z} shrc):

HLCOLOR="\x1b[30;47m"
NOCOLOR="\x1b[0m"

#Usage: find [dir] [mask1] [mask2]...
#where maskN will become <<-iname '*maskN*'>> param for 'find'
#'dir' should be an existing directory. otherwise it will be recognized as mask.
function findm {
        local it cl sp;
        [ -d "$1" ] && cl="'$1'" && shift;
        for it in "$@"; do
                cl="${cl} -iname '*${it}*' -or";
                sp="${sp}${it}\\|";
        done;   
        cl="${cl%-or}";
        sp="s/\\(${sp%\\|}\\)/${HLCOLOR}\\0${NOCOLOR}/ig";
        eval find ${cl} | sed -e "${sp}";
}

quelle
0

Wenn die Farben in grep aktiviert oder automatisch aktiviert sind, können Sie einfach eine kurze grep-Pipe mit der Option für den erweiterten regulären Ausdruck und dem Dollarzeichen erstellen (um weiterhin jede Zeile anzuzeigen).

grep -E 'word|$'

Zum Beispiel mit einer Suchsuche:

find . -type f | grep -E 'readme|$'

Dadurch wird jedes Vorkommen von "Readme" hervorgehoben und die gesamte Ausgabe von find angezeigt.

Nebenbemerkung: Wenn grep die Farben deaktiviert hat, können Sie entweder die Option --color hinzufügen ( grep -E --color ...), wie Dennis Williamson vorschlägt, oder sie für die Sitzung festlegen ( export GREP_OPTIONS="--color=auto").

Levit
quelle