Kolorowy grep-przeglądanie całego pliku z podświetlonymi dopasowaniami

Uważam, że flaga grep jest niezwykle przydatna. Jednak grep drukuje tylko wiersze z dopasowaniami (chyba że poprosisz o wiersze kontekstu). Biorąc pod uwagę, że każda drukowana linia ma dopasowanie, podświetlenie nie dodaje tyle możliwości, ile mogłoby.

Naprawdę chciałbym cat plik i zobaczyć cały plik z podświetlonym wzorcem dopasowania.

Czy jest jakiś sposób, aby powiedzieć grepowi, aby wydrukował każdą czytaną linię, niezależnie od tego, czy jest dopasowanie? Wiem, że mógłbym napisać scenariusz. uruchamianie grepa na każdym wierszu pliku, ale byłem ciekaw, czy jest to możliwe ze standardowym grep.

15 answers

Oto kilka sposobów, aby to zrobić:

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
 643
Author: Ryan Oberoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 06:53:45

Tutaj jest coś w tym samym stylu. Jest szansa, że i tak będziesz używał mniej, więc spróbuj tego: {]}

less -p pattern file

Podświetli wzorzec i przeskoczy do pierwszego wystąpienia go w pliku.

 70
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 22:53:21

Chciałbym polecić ACK -- lepsze niż grep, Narzędzie power search dla programistów .

$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}"
$ ack --passthru pattern files

Uwielbiam go, ponieważ domyślnie przeszukiwaÄ ‡ rekurencyjne katalogi (i robi to o wiele mądrzej niż grep -r), wspiera peĹ' ne wyrażenia regularne Perla (a nie POSIXish regex(3)), i ma znacznie ładniejszy wyświetlacz kontekstowy podczas wyszukiwania wielu plików.

 43
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-17 18:05:04

Można również utworzyć alias. Dodaj tę funkcję w swoim .bashrc (or .bash_profile na osx)

function grepe {
    grep --color -E "$1|$" $2
}

Możesz teraz używać aliasu w następujący sposób: "ifconfig | grepe inet " lub " grepe css index.html".

Bashrc jest jednym z najbardziej rozpoznawalnych systemów bazodanowych na świecie.]}
 17
Author: Fabien Sa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-30 13:13:07

Możesz użyć mojego highlight skryptu z https://github.com/kepkin/dev-shell-essentials

Jest to lepsze niż grep, ponieważ każdy mecz można podświetlić własnym kolorem.

$ command_here | highlight green "input" | highlight red "output"

Zrzut ekranu z projektu Github

 15
Author: kepkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-26 13:27:01

Użyj colout program: http://nojhan.github.io/colout/

Jest przeznaczony do dodawania kolorowych podświetleń do strumienia tekstowego. Ze względu na wyrażenie regularne i kolor (np." czerwony") odtwarza strumień tekstowy z podświetlonymi dopasowaniami. e. G:

# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile

Możesz łączyć wiele wywołań, aby dodać wiele różnych kolorów:

tail -f /var/log/nginx/access.log | \
    colout ' 5\d\d ' red | \
    colout ' 4\d\d ' yellow | \
    colout ' 3\d\d ' cyan | \
    colout ' 2\d\d ' green

Lub możesz osiągnąć to samo, używając wyrażenia regularnego z N grupami (nawiasowymi częściami wyrażenia regularnego), po którym następuje oddzielona przecinkami lista N colors=

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red
 10
Author: user2683246,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 21:19:59

Używam rcg z "Linux Server Hacks", O ' Reilly. Jest idealny do tego, co chcesz i może wyróżniać wiele wyrażeń, z których każdy ma różne kolory.

#!/usr/bin/perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print "Usage: rcg [regex] [color] [regex] [color] ...\n";
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}
 6
Author: dave1010,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-08 13:44:41

Dodałem to do mojego .bash_aliases:

highlight() {
  grep --color -E "$1|\$"
}
 5
Author: uronce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 13:58:33

Ok, to jest jeden sposób,

wc -l filename

Poda ci liczbę linii-powiedz NN, wtedy możesz zrobić

grep -C NN --color=always filename
 1
Author: nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 15:30:24

Oto skrypt powłoki, który używa funkcji Gsub Awk, aby zastąpić szukany tekst odpowiednią sekwencją ucieczki, aby wyświetlić go w jasnej czerwieni:

#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2

Użyj go tak:

$ ./cgrep pattern [file]

Niestety, nie posiada wszystkich funkcji grep.

Więcej informacji można znaleźć w Artykule " So You Like Color " W Linux Journal

 1
Author: Wernsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 15:38:03

Inna odpowiedź wspominała o przełączniku grep-Cn, który zawiera n linii kontekstu. Czasami robię to z n = 99 jako szybki i brudny sposób uzyskania [przynajmniej] screenfull kontekstu, gdy wzór egrep wydaje się zbyt skrzypiący, lub gdy jestem na komputerze, na którym nie zainstalowałem rcg i / lub ccze.

Niedawno odkryłem ccze który jest mocniejszym koloryzatorem. Moją jedyną skargą jest to, że jest zorientowany na ekran (jak less, którego nigdy nie używam z tego powodu), chyba że podasz-A przełącznik wyjścia "raw ANSI".

+ 1 za rcg wzmiankę powyżej. Jest to nadal mój ulubiony, ponieważ jest tak prosty do dostosowania w aliasie. Coś takiego jest zazwyczaj w moim~/.bashrc:

Alias tailc= 'tail - f / my / app / log / file / RCG send "BOLD GREEN" receive "CYAN" error " RED "'

 1
Author: MarkHu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 22:20:20

Another dirty way:

grep -A80 -B80 --color FIND_THIS IN_FILE

I did an

alias grepa='grep -A80 -B80 --color'

W bashrc.

 1
Author: fly_a320,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-17 14:19:11

Alternatywnie możesz użyć Silver Searcher i zrobić

ag <search> --passthrough
 0
Author: Andrew Magee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 01:55:58

Jeśli chcesz podświetlić kilka wzorów różnymi kolorami, zobacz Ten skrypt bash.

Użycie podstawowe:

echo warn error debug info 10 nil | colog

Możesz zmieniać wzory i kolory podczas pracy naciskając jeden klawisz, a następnie klawisz enter.

 0
Author: Edoot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 21:24:17

Aby wyróżnić wzorce podczas przeglądania całego pliku, h może to zrobić.

Plus używa różnych kolorów dla różnych wzorów.

cat FILE | h 'PAT1' 'PAT2' ...

Możesz również przekierować wyjście h na less -R dla lepszego odczytu.

Aby grep i użyć 1 koloru dla każdego wzoru, cxpgrep może być dobrym dopasowaniem.

 0
Author: treulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-06 21:05:28