Markieren Sie die Konsolensuchausgabe, während die gesamte Befehlsausgabe angezeigt wird

19

Wenn ich z. B. benutze cat file.txt | grep --color=tty "pattern", wird das von mir gesuchte Muster hervorgehoben. Als ich um jeden Treffer etwas mehr Kontext will, hat grep die -A, -Bund -CParameter.

Ich möchte jedoch die gesamte Datei (oder eine beliebige Befehlsausgabe) anzeigen und ein bestimmtes Muster hervorheben. Existiert ein solcher Markierungsbefehl oder ein solches Werkzeug?

DerMike
quelle
Was möchten Sie jetzt anders machen als das, was Sie bereits tun?
Benjamin Bannier

Antworten:

22

Auf unix.stackexchange.com gab es eine Antwort , die diesen tollen Trick hatte:

grep -E --color 'pattern|$' file.txt

oder

grep --color 'pattern\|$' file.txt

welches Ihrem Muster oder dem Zeilenende in jeder Zeile entspricht. Nur das Muster wird hervorgehoben.

Bis auf weiteres angehalten.
quelle
+1 Einfach und leicht anpassbar an zgrep, bzgrep, etc. Nice!
Stefan Lasiewski
Gibt es eine Möglichkeit, nicht ständig --color einzugeben? Ich denke, es ist ziemlich einfach, die Farboption in grep einzubetten, nicht sicher, warum wir jedes Mal explizit Farbe eingeben. Ich habe versucht, Skripte zu erstellen, die besagen, dass grepd files eine Bash hat, die grep --color $ 1 $ 2 sagt, aber es funktioniert nicht. Irgendwelche Hinweise hier, um dies zu beheben, bitte
Srujan Kumar Gulla
1
@lordlupine: Fügen Sie GREP_OPTIONS='--color'zu Ihrer hinzu ~/.bashrc(oder ändern Sie die Einstellung, um sie einzuschließen --color). Sie müssen ein neues Terminal starten oder diese Zuweisung in der Befehlszeile des aktuellen Terminals ausführen, damit sie wirksam wird.
Bis auf weiteres angehalten.
9

Ich mag ack .

ack --passthru somepattern filename

Es ist wie grep, aber besser. Es wird standardmäßig hervorgehoben und mit der --passthruOption wird die gesamte Datei (oder Standardeingabe) anstatt nur der übereinstimmenden Zeilen angezeigt .

Adam Batkin
quelle
1
Wenn Sie versuchen, die Ausgabe in ack zu leiten, z. B. von tail, müssen Sie auch die --filterOption verwenden. Zum Beispiel:tail -f myLogFile | ack --filter --passthru pattern
Spatz 28.11.13
5

Ich empfehle auch die Verwendung von less(oder so), aber ich möchte Ihnen eine didaktischere Lösung zeigen. Nachdem Sie diese Funktion definiert haben:

Funktionshighlight ()
{
    sed "s / $ 1 /" tput smso "&" tput rmso "/ g" "$ {2: -}"
}

Sie können es folgendermaßen verwenden:

command | highlight pattern
highlight pattern file.txt

Hinweis: Diese Version ist Groß- und Kleinschreibung, zu , dass nur Anfügen zu ändern , inachdem gin dem sedAusdruck.

cYrus
quelle
1
Ich würde tputdie Werte aufrufen, anstatt sie fest zu codieren. Auf diese Weise vermeiden Sie auch die Verwendung echo -e, die andere Auswirkungen haben kann.
Ignacio Vazquez-Abrams
Du hast vollkommen recht, ich habe es ohne Glück gesucht. Vielen Dank.
CYRUS
Diese Version benötigt keine prog | highlight "pattern"highlight "pattern" filehighlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
aufzeichnenden
Meine sedFähigkeiten sind im Grunde nicht vorhanden. Wie müsste ich das ändern, um das Muster case sensitive anzupassen. Wie auch immer, ich werde das zu meinen bash_functions hinzufügen. Vielen Dank.
DerMike
@DerMike: Jetzt wird zwischen Groß- und Kleinschreibung unterschieden.
CYRUS
3

Vorbei -Can grepmit einem ausreichend hohen Wert wird dies zu tun.

Ignacio Vazquez-Abrams
quelle
Ich hätte schwören können, dass ich beim letzten Versuch noch etwas anderes habe. (Jedes passt zum Kontext mit '-----' Trennzeichen dazwischen.) Nun, da Sie es mir gesagt haben, läuft es gut :-) Danke.
DerMike
Es wird jede Übereinstimmung getrennt, wenn nicht genügend Kontext vorhanden ist.
Ignacio Vazquez-Abrams
3

less hebt Muster hervor, also

less -p 'mypattern' file.txt

oder

ridiculously | long | pipe | less

und dann in weniger /, um nach einem Muster zu suchen, das hervorgehoben wird.

Randnotiz:

Sie können Ihren Befehl verbessern, z. B.
einen Alias ​​festlegen alias grep="grep --color=tty"und ihn folgendermaßen verwenden:

grep 'mypattern' file.txt;
Casual Coder
quelle
1
Sie sollten GREP_OPTIONS nicht verwenden, sondern stattdessen Alias. Siehe: bugs.launchpad.net/ubuntu/+bug/67141
lesmana
Primum non nocere. entfernt.
Casual Coder
GREP_OPTIONS wird von vielen Formen von grep(zgrep, bzgrep, bzfgrep usw.) verwendet. Wenn Sie also möchten, dass sich alle Formen von grep konsistent verhalten, müssen Sie für jede Form von grep einen Alias ​​festlegen. @ Casuals neue Antwort oben ist nichts für etwas wie bzgrep pattern /var/log/messages.?.gz, was ein Beispiel ist, bei dem die Hervorhebung von Farben SEHR hilfreich ist.
Stefan Lasiewski
1

Es gibt ein nettes Supercat- Tool, das genau diesen Zweck erfüllt . Es kann sowohl die Konsolenausgabe einfärben als auch einen "hervorgehobenen" HTML-Code aus Ihrer Eingabe erzeugen.

Ivan Tarasov
quelle
Danke, das sieht vielversprechend aus. Allerdings kann ich es im Moment nicht zum Laufen bringen.
DerMike
1
/etc/supercatWerfen Sie einen Blick auf die Konfigurationsdateien (in Ubuntu), in denen die Farbregeln festgelegt sind. Es handelt sich im Grunde um Farb- / Regexp-Paare (mit einigen zusätzlichen Regeln). Manpage ist auch kurz und nett.
Ivan Tarasov
Ich habe eine spcrcvim- Syntaxdatei
DerMike,