채색 된 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' ...

더 나은 판독 h을 less -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.