채색 된 grep-강조 표시된 일치 항목으로 전체 파일보기


509

grep--color=always깃발이 엄청나게 유용하다는 것을 알았습니다 . 그러나 grep은 문맥 행을 요청하지 않는 한 일치하는 행만 인쇄합니다. 인쇄하는 각 줄에 일치하는 항목이 있으면 강조 표시에 가능한 한 많은 기능이 추가되지 않습니다.

cat파일 을 정말로보고 싶습니다 . 패턴 일치가 강조 표시된 전체 파일을 봅니다.

일치하는지 여부에 관계없이 grep에게 읽은 모든 행을 인쇄하도록 지시 할 수있는 방법이 있습니까? 파일의 모든 줄에서 grep을 실행하는 스크립트를 작성할 수 있다는 것을 알고 있지만 이것이 표준으로 가능했는지 궁금합니다 grep.


1
하나 이상의 패턴 (예 : 오류, 경고, 정보 등의 메시지)에 대해 둘 이상의 색상을 원하는 경우을 사용하십시오sed . 이 sed솔루션은 복잡한 추가 비용으로 약 30 자 대신 60 자 정도의 다양한 색상을 제공합니다.
Trevor Boyd Smith

sed 를 사용하면 종료 코드를 강조 표시하고 리턴 할 수도 있습니다 (예 : askubuntu.com/a/1200851/670392
Noam Manos

답변:


797

몇 가지 방법이 있습니다.

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file

152
그 | $ 트릭은 깔끔합니다! 잘 했어, 나는 그것을 기억해야 할 것이다. 정규 표현식에 정통하지 않은 사용자의 경우 "pattern | $"은 검색하려는 패턴이있는 라인과 끝이있는 라인, 즉 모든 라인과 일치합니다. 줄의 끝은 실제로 문자가 아니기 때문에 출력의 색상 부분은 패턴 일뿐입니다. 고마워 라이언!
zslayton 2016 년

55
"$"를 생략 할 수도 있습니다 : egrep --color "pattern|" file(credit stackoverflow.com/a/7398092/50979 )
13ren December

15
@Zack, "|" 연산자는 AND가 아닌 OR 연산자입니다.
JBoy

16
@JBoy, 부울 논리 방식이 아닌 일반적인 영어 방식으로 'AND'를 사용했습니다. 맞습니다. 실제로 '또는'연산자입니다. 이것과 저것과 일치합니다. : P 명확한 설명.
zslayton 2015

12
하나 이상의 패턴과 일치하는 경우 "$"가 필요합니다. egrep --color "pattern1|pattern2|$". 그렇지 않으면 색상 강조 표시가 발생하지 않습니다.
ZaSter

91

같은 줄을 따라 뭔가가 있습니다. 어쨌든 덜 사용하게 될 것이므로 다음을 시도하십시오.

less -p pattern file

패턴을 강조 표시하고 파일에서 처음 나타나는 패턴으로 이동합니다.


4
또한 다음을 사용하여 배관 (정독에서 읽음)과 함께 작동합니다 -.… | less -p pattern -
phk

3
@phk : 대시를 생략 할 수도 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

또한 -i옵션을 추가하면 에서와 같이 대소 문자를 구분하지 않습니다 less -ip pattern file.
steveb

... 및 ANSI 색상 입력으로 배관하는 경우 스위치를 제공 less하십시오 -R.… | less -Rip introduction -
Abdull

48

프로그래머를위한 파워 검색 도구 인 grep보다 ack 을 추천하고 싶습니다 .

$ ack --color --passthru --pager = "$ {PAGER : -less -R}"패턴 파일
$ ack --color --passthru 패턴 파일 | 적은 -R
$ 내보내기 ACK_PAGER_COLOR = "$ {PAGER : -less -R}"
$ ack --passthru 패턴 파일

디렉토리의 재귀 적 검색 (및 훨씬 더 똑똑한 )으로 기본 설정되고 grep -rPOSIXish 대신 전체 Perl 정규 표현식을 지원하며 regex(3)많은 파일을 검색 할 때 컨텍스트 표시가 훨씬 우수 하기 때문에 나는 그것을 좋아 합니다.


2
그러나 때때로 나는 그것이 있어야한다고 확신 할 때 내가 원하는 것을 찾지 못합니다. ack똑똑하지만 때로는 너무 똑똑해서 적중 한 파일 형식을
제외 시켰

4
@MPi ack -a는 모든 파일 형식을 검색하지만 여전히 제외합니다..git/ .svn/ .
ephemient

1
그러나 ack내 이미지를 검색하지 않는 것이 시원합니다 -a. 예를 들어서에 추가 --type-set=freemarker=.ftl했습니다 ~/.ackrc.
Michael Piefel

3
구성을 약간 조정하면 grep은 이미 ack의 모든 작업을 수행하고 더 빠르며 ack의 화이트리스트와 같은 결과를 절대로 생략하지 않습니다. 아마도 원하는 grep 설정을 .bashrc에 저장하십시오. 내 읽기 : function grp () {GREP_OPTIONS = "-rI --color --exclude-dir = \. git --exclude = tags"grep "$ @"
Jonathan Hartley

22

https://github.com/kepkin/dev-shell-essentialshighlight 에서 내 스크립트를 사용할 수 있습니다

그건 이상 grep당신은 각 경기를 강조 할 수 있기 때문에 자신의 색을 .

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

Github 프로젝트의 스크린 샷


3
이 질문 grep은 * nix를 실행하는 머신의 표준 유틸리티 인를 사용하여 솔루션을 명시 적으로 요청했습니다 .
zslayton

1
이 스크립트는 훌륭하지만 colout다른 답변에서 언급 한 것처럼 좋지 않습니다 .
Jonathan Hartley

@JonathanHartley 그리고 왜 그렇습니까? 그럴 이유가 없습니다. 또한이 스크립트는보다 간단한 구현을 사용하므로 수행하는 작업 colout을 검사하려는 경우 좋습니다.
HelloGoodbye

@HelloGoodbye 그래, 충분합니다. 나는 판단을 보류해야한다. colout은 더 철저하고 강력하지만, 그에 따라 사용하고 리버스 엔지니어링하는 것이 더 복잡하다는 것이 맞습니다.
Jonathan Hartley

@JonathanHartley 더 강력하다는 것이 합리적입니다!
HelloGoodbye

19

별명을 작성할 수도 있습니다. 이 함수를 .bashrc (또는 osx의 .bash_profile)에 추가하십시오

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

이제 " ifconfig | grepe inet"또는 " grepe css index.html" 와 같은 별칭을 사용할 수 있습니다 .

(PS : source ~/.bashrc현재 세션에서 bashrc를 다시로드 하는 것을 잊지 마십시오 )


시스템에서 egrep을 사용할 수 있다면 그냥 사용할 수도 있습니다.
Tom

1
이 결과를 덜 파이핑하면 색상 정보가 손실됩니다. 어떻게 방지 할 수 있습니까?
코너 클라크

5
@Hoten --color=always대신 사용--color
limp_chimp

3
그리고, 만들려면 less, 사용을 색상 코드를 해석 less -R.
Eliah Kagan

인용되지 않은 $ 2의 사용은 공란이 아닙니다. bash에서 나는 grepe () {local pattern = "$ 1"shift egrep --color "$ pattern | ^" "$ @"} 기능을 수행하고 싶습니다.
Robert Klemme

16

colout프로그램 사용 : http://nojhan.github.io/colout/

텍스트 스트림에 색상 하이라이트를 추가하도록 설계되었습니다. 정규 표현식과 색상 (예 : "빨간색")이 있으면 일치 항목이 강조 표시된 텍스트 스트림을 재생성합니다. 예 :

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

여러 호출을 연결하여 여러 가지 다른 색상 강조 표시를 추가 할 수 있습니다.

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

또는 N 그룹 (정규식의 괄호로 묶은 부분)이있는 정규식을 사용하고 쉼표로 구분 된 N 색상 목록을 사용하여 동일한 작업을 수행 할 수 있습니다.

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red

1
다른 곳에서 언급했듯이 질문은 * nix를 실행하는 머신의 표준 유틸리티 인 grep을 사용한 솔루션을 명시 적으로 요구했습니다.
zslayton

4
@Zack ok, 죄송합니다. 실제로 문제를 넘어 확장하고 grep이미 답변에서 확장 된 경우, colout내가 알고있는 최선의 해결책입니다. 유닉스 철학에 따르면, 프로그램은 한 가지 일을 잘 수행하도록 작성되어야합니다. 들어 grep그 텍스트 스트림을 필터링한다. 들어 colout그것을 색상 화 또는 텍스트 스트림을 강조한다.
user2683246 2016 년

여러 가지 다른 색상의 강조 표시를 적용 할 수 있기 때문에 가장 colout유용한 대답이며 널리 사용되는 도구입니다. 한 번만 배우고 여러 상황에서 로그 파일을 강조하거나 다른 도구를 사용하여 테스트 결과를 강조하는 등 많은 상황에서 사용하십시오.
Jonathan Hartley

9

O'Reilly의 "Linux Server Hacks"에서 rcg를 사용합니다. 원하는 것에 완벽하며 각기 다른 색상으로 여러 표현을 강조 할 수 있습니다.

#!/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
}

7

-z그렙에 대한 옵션도 꽤 빠르입니다!

cat file1 | grep -z "pattern"

이게 무슨 짓이야? -z는 grep에게 ASCII NUL을 줄 구분자로 사용하도록 지시합니다.
vy32

6

나는 이것을 .bash_aliases에 추가했다.

highlight() {
  grep --color -E "$1|\$"
}

3

전체 파일을 보면서 패턴을 강조 표시하려면 h 를 수행하면됩니다.

또한 패턴마다 다른 색상을 사용합니다.

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

더 나은 판독 hless -R위해 출력을 에 파이프 할 수도 있습니다 .

각 패턴에 대해 하나의 색상을 그렙하고 사용하려면 cxpgrep 이 적합 할 수 있습니다.


1

좋아요, 이것은 한 가지 방법입니다.

wc -l filename

줄 수를 줄 것입니다-NN이라고 말하면 할 수 있습니다.

grep -C NN --color=always filename

3
먼저 화장실을 원하지 않으면 "-C 2147483647"입니다. 여기에 많은 수를 사용한다고해서 속도가 느려지지는 않습니다.
barrycarter

1

다음은 Awk의 gsub 함수를 사용하여 검색중인 텍스트를 적절한 이스케이프 시퀀스로 바꾸어 밝은 빨간색으로 표시하는 쉘 스크립트입니다.

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

다음과 같이 사용하십시오.

$ ./cgrep pattern [file]

불행히도, grep의 모든 기능을 갖추고 있지는 않습니다.

자세한 내용 은 Linux Journal의 " So You Like Color " 기사를 참조하십시오.


1

다른 답변은 n 줄의 Context를 포함하는 grep의 -Cn 스위치를 언급했습니다. 예를 들어 egrep 패턴이 너무 어리 석거나 rcg를 설치하지 않은 컴퓨터에있을 때 컨텍스트가 가득한 화면을 얻는 가장 빠르고 더러운 방법으로 n = 99로이 작업을 수행하는 경우가 있습니다. 및 / 또는 ccze.

최근 ccze에 더 강력한 착색제를 발견했습니다 . 내 유일한 불만은 less"원시 ANSI"출력에 -A 스위치를 지정하지 않는 한 화면 지향적입니다 (예 : 그런 이유로 절대 사용하지 않음).

rcg위에서 언급 한 경우 +1 별칭으로 사용자 정의하기가 너무 간단하기 때문에 여전히 내가 좋아하는 것입니다. 이와 같은 것이 보통 ~ / .bashrc에 있습니다.

별명 tailc = 'tail -f / my / app / log / file | rcg 보내기 "BOLD GREEN"수신 "CYAN"오류 "RED" '


1

또 다른 더러운 방법 :

grep -A80 -B80 --color FIND_THIS IN_FILE

나는

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

bashrc에서.


1
당신이 찾고있는 것이 없다면 문제가됩니다. 오류로 인해 말하면 아무것도 얻지 못할 것입니다.
Paul Rubel


0

색상 다른 여러 패턴을 강조 표시하려면 bash 스크립트를 .

기본 사용법 :

echo warn error debug info 10 nil | colog

하나의 키를 누른 상태에서 키를 입력하는 동안 패턴과 색상을 변경할 수 있습니다.


0

비슷한 목적으로 다음 명령을 사용합니다.

grep -C 100 searchtext file

강조 표시된 검색 텍스트 앞뒤에 100 * 2 줄의 컨텍스트를 인쇄하는 grep이 표시됩니다.


0

@kepkin의 솔루션에서 영감을 얻은 내 접근 방식은 다음과 같습니다 .

# Adds ANSI colors to matched terms, similar to grep --color but without
# filtering unmatched lines. Example:
#   noisy_command | highlight ERROR INFO
#
# Each argument is passed into sed as a matching pattern and matches are
# colored. Multiple arguments will use separate colors.
#
# Inspired by https://stackoverflow.com/a/25357856
highlight() {
  # color cycles from 0-5, (shifted 31-36), i.e. r,g,y,b,m,c
  local color=0 patterns=()
  for term in "$@"; do
    patterns+=("$(printf 's|%s|\e[%sm\\0\e[0m|g' "${term//|/\\|}" "$(( color+31 ))")")
    color=$(( (color+1) % 6 ))
  done
  sed -f <(printf '%s\n' "${patterns[@]}")
}

여러 인수를 허용하지만 색상을 사용자 정의 할 수는 없습니다. 예:

$ noisy_command | highlight ERROR WARN

-1

일치하는지 여부에 관계없이 grep에게 읽은 모든 행을 인쇄하도록 지시 할 수있는 방법이 있습니까?

옵션 -C999은 모든 컨텍스트 라인을 표시하는 옵션이없는 경우 트릭을 수행합니다. 대부분의 다른 grep 변형도이를 지원합니다. 그러나 : 1) 일치하는 것이 없으면 출력이 생성되지 않으며 2)이 옵션은 grep의 효율성에 부정적인 영향을 미칩니다. -C값이 클 때 grep을 위해 많은 행을 메모리에 임시 저장하여 컨텍스트의 행을 판별해야합니다. 일치하는 경우 표시합니다. grep 구현은 입력 파일을로드하지 않고 입력을 통해 몇 줄을 읽거나 슬라이딩 윈도우를 사용합니다. 일치하는 것이 발견 될 때 "이전"컨텍스트 라인을 나중에 출력하기 위해서는 컨텍스트의 "이전"이 윈도우 (메모리)에 유지되어야한다.

그 문제에 대한 패턴과 같은 ^|PATTERN또는 PATTERN|$빈 일치 하위 패턴과 같은 패턴 [^ -~]?|PATTERN은 좋은 트릭입니다. 그러나 1) 이러한 패턴은 문맥으로 강조된 일치하지 않는 선을 표시하지 않으며 2) -F및 같은 다른 grep 옵션과 함께 사용할 수 없습니다-w , 예를 들면.

따라서이 접근법 중 어느 것도 나에게 만족스럽지 않습니다. 나는 ugrep 과 강화 grep 옵션 -y을 사용하여 일치하지 않는 모든 출력을 색상이 강조된 컨텍스트 라인으로 효율적으로 표시합니다. ag 및 ripgrep와 같은 다른 grep 같은 도구도 패스 스루 옵션을 제공합니다. 그러나 ugrep는 GNU / BSD의 그렙 및 제공 등 그렙 옵션의 상위 호환 -y-Q. 예를 들어, 다음은 (대화식 쿼리 UI -y와 결합하여 -Q패턴을 입력 할 때) 옵션이 표시 하는 것입니다 .

ugrep -Q -y FILE ...

의견을 남기지 않고 왜 투표하지 않습니까? 다른 답변과 마찬가지로 대체 grep 도구를 언급하는 것이 이상합니다.
Dr. Alex RE
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.