컬러 그렙 출력 : 별칭이 아닌 GREP_OPTIONS가 아님


10

의 컬러 출력을 원합니다 grep.

.... 그러나

  • 전략 1 : GREP_OPTIONS. 그러나 이것은 더 이상 사용되지 않습니다. http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html을 참조 하십시오
  • Stragegy 2 : GREP_COLORS는 첫눈에 솔루션처럼 보이지만 다른 점이 있습니다.
  • 전략 3 : 별칭. find ... | xargs grepxargs는 별칭을 평가하지 않기 때문에이 기능은 작동 하지 않습니다.
  • 전략 4 : 간단한 래퍼 스크립트를 작성하십시오. 아니요, 이것이 너무 더럽고 해결하는 것보다 더 많은 문제를 일으킨다 고 생각합니다.
  • 전략 5 : 소스 코드 패치
  • 전략 6 : grep 개발자에게 문의하여 GREP_OPTIONS의 교체를 요청하십시오.
  • 전략 NICE-and-EASY : ... 이것은 빠졌습니다. 나는 단서가 없다.

이것을 해결하는 방법?

도와 주셔서 감사합니다!

...하지만 현상금을 줄 수 없습니다

무례하고, 거만하고, 모욕적이고, 욕설을 불러주세요 ....

해결책이 없습니다. 해결책이 없습니다. 대답이 그 질문을 만족시키지 못했습니다.

당신의 노력에 감사드립니다.


1
랩퍼 스크립트 (전략 4)를 "실제로 대답하지 않음"으로 사용하기위한 두 가지 제안을 거부했습니다. "더러운", "고생스러운"또는 "정말 답이 아닌"것이 무엇인지 설명 할 수 있습니까? 어쩌면 그것은 해결할 수있는 별도의 문제 일 수 있습니다.
JigglyNaga

2
전략 5는 소스 코드를 패치하고 다음과 같이 설정 color_option합니다2 .
don_crissti

2
@JigglyNaga 다음은 래퍼 스크립트가 솔루션이 아닌 이유에 대한 설명입니다. 우리 팀은 여러 서버를 관리합니다. 현재 1,000 명 미만이지만 카운트가 증가하고 있습니다. 예, 우리는 구성 관리를 사용하며 모든 스크립트를 쉽게 배포 할 수 있습니다. 그러나 저는 쉽고 간단하게 일하기를 원합니다 (팀의 새로운 구성원을 생각하십시오. 혼동하고 싶지 않습니다). --color옵션은 이미 값을 가진다 auto. 기본적으로 활성화 할 수없는 이유를 모르겠습니다.
guettli

전략 4 또는 5를 사용해야합니다 exec grep --color=auto "$@". 선택적으로 다른 이름 ( grepc또는 colorgrep) 으로 최소 대시 / sh 스크립트 ( )를 사용 하는 전략 4를 선호합니다 . 이는 무시할 수있는 오버 헤드가 있으며 런타임시 추가 동시 프로세스가 없습니다. "충분히 쉽지 않다" 라고 표시 한 이유 는이 기능이 구현하기 위해 한 번의 노력으로 (상대적으로 적은) 노력을 기울이고 다른 사람이 대신해 줄 수있을만큼 유용하지 않기 때문입니다. 이 때문에 게시 된 답변에 대한 "정말 답변이 아님" 의견은 매우 무례합니다.
공칭 동물

1
@NominalAnimal 예, "정말 답변이 아닙니다"라는 말이 무례하게 들립니다. 나는 원어민이 아닙니다. 어느 쪽이 같은 메시지를 전하는 것이 더 좋을까요?
guettli

답변:


13

OP가 옵션이 부적절하다고 말한 이유 중 일부는 실제로 근거가 없습니다. 다음은 OP 전략 4를 사용한 효과의 종류를 보여줍니다.


대부분의 배포 grep에서 /bin(일반) 또는 /usr/bin(OpenSUSE, 기타)에 설치되며 기본값 PATH은 또는 /usr/local/bin앞에 포함 됩니다. 이것은 당신 이/bin/usr/bin/usr/local/bin/grep

#!/bin/sh
exec /bin/grep --color=auto "$@"

여기서 /bin/sh배포판에서 제공하는 POSIX 호환 쉘 (대개 bash 또는 dash)이 있습니다. 경우 grep/usr/bin, 다음 있는지 확인

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"

이 스크립트의 오버 헤드는 최소입니다. exec스크립트 인터프리터가 교체되는 문 수단 grep진; 이는 grep실행 중에 쉘이 메모리에 남아 있지 않음을 의미합니다 . 따라서, 유일한 오버 헤드는 스크립트 인터프리터의 하나의 추가 실행, 즉 벽시계 시간에서의 작은 대기 시간이다. 대기 시간은 거의 일정하며 ( 페이지 캐시 에 있는지 여부 grepsh이미 사용 가능한 I / O 대역폭 에 따라 달라짐 ) grep실행 시간 또는 처리하는 데이터 양 에 따라 달라지지 않습니다 .

그렇다면 래퍼 스크립트가 추가 한 오버 헤드, 즉 대기 시간이 얼마나 걸립니까?

찾으려면 위의 스크립트를 작성하고 실행하십시오.

time /bin/grep --version
time /usr/local/bin/grep --version

내 컴퓨터에서 전자는 실시간으로 0.005 초가 걸리고 (수 많은 실행에서) 후자는 0.006 초 실시간으로 걸립니다. 따라서 내 컴퓨터에서 랩퍼를 사용하는 오버 헤드는 호출 당 0.001 (또는 그 이하)입니다.

이것은 중요하지 않습니다.

많은 일반적인 응용 프로그램과 유틸리티가 동일한 접근 방식을 사용하기 때문에 이것에 대해 "더러운"것도 보지 못합니다. 당신의 컴퓨터에 등의 목록을 보려면 /bin하고 /usr/bin바로 실행

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'

내 컴퓨터에서 위의 출력을 포함 egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, 그리고 xfig, 나는 꽤 자주 사용하는. 랩퍼 스크립트에 의존하여 전체 분배 "더러운"을 고려하지 않는 한, 랩퍼 스크립트를 "더러운"것으로 간주 할 이유가 없습니다.


이러한 래퍼 스크립트는 다음과 같은 문제를 일으킬 수 있습니다.

출력이 터미널 인 경우 사용자 지원 (스크립트와 반대) 만 기본적으로 색상 지원을 지원하는 grep 버전을 사용하는 경우 랩퍼 스크립트의 이름을 지정 colorgrep하거나 cgrepOP에 적합한 항목을 지정할 수 있습니다 .

동작 grep이 전혀 변경되지 않기 때문에 가능한 모든 호환성 문제를 피할 수 있습니다 .


grep랩퍼 스크립트를 사용하여 옵션을 사용 하지만 새로운 문제점을 피하는 방법 :

지원 되지 않는 GREP_OPTS경우에도 GREP_OPTIONS(이미 사용되지 않으므로) 사용자 정의를 지원하도록 랩퍼 스크립트를 쉽게 다시 작성할 수 있습니다 . 이 방법으로 사용자는 단순히 export "GREP_OPTIONS=--color=auto"자신의 프로필을 추가 하거나 유사 하게 만들 수 있습니다 . /usr/local/bin/grep그렇다면

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"

주위 $GREP_OPTIONS에 따옴표가 없으므로 사용자가 둘 이상의 옵션을 지정할 수 있습니다.

내 시스템에서 empty 또는 with로 실행 time /usr/local/bin/grep --version하는 것은 이전 버전의 래퍼 스크립트만큼 빠릅니다. 즉, 일반보다 실행하는 데 일반적으로 1 밀리 초가 걸립니다 .GREP_OPTIONSGREP_OPTIONS=--color=autogrep

이 마지막 버전은 개인적으로 사용하기를 권장하는 버전입니다.


요약하면, OP의 전략 4 :

  • grep개발자 가 권장하는 영역 입니다.

  • 구현하기가 쉽지 않습니다 (2 줄).

  • 오버 헤드가 미미 함 (이 특정 랩톱에서 호출 당 1 밀리 초 추가 대기 시간; 각 시스템에서 쉽게 확인)

  • GREP_OPTS지원 을 추가하는 래퍼 스크립트로 구현 가능 (더 이상 사용되지 않거나 지원되지 않음 GREP_OPTIONS)

  • 스크립트 또는 기존 사용자에게 전혀 영향을 미치지 않는 ( colorgrep/로 cgrep) 구현 가능

이미 Linux 배포판에서 널리 사용되는 기술이므로 "더러운"것이 아니라 일반적인 기술입니다.

별도의 래퍼 ( colorgrep/ cgrep) 로 구현하면 grep동작에 전혀 영향을 미치지 않으므로 새로운 문제를 만들 수 없습니다 . GREP_OPTS지원 을 추가하는 래퍼 스크립트로 구현 된 경우를 사용 GREP_OPTS=--color=auto하면 기본값 추가시 업스트림을 추가 --color=auto할 때와 동일한 위험 (기존 스크립트의 문제) 이 발생합니다. 따라서 이것이 "해결하는 것보다 더 많은 문제를 일으킨다"는 의견은 완전히 잘못된 것입니다. 추가적인 문제는 없습니다.


3

첫 번째 전략과 함께 제공되는 설명서는 다음과 같습니다.

대신 별명이나 스크립트를 사용하십시오. 예를 들어, grep이 '/ usr / bin'디렉토리에 있으면 $ HOME / bin을 PATH 앞에 추가하고 다음을 포함하는 $ HOME / bin / grep 실행 스크립트를 작성할 수 있습니다.

#! /bin/sh
export PATH=/usr/bin
exec grep --color=auto --devices=skip "$@"

따라서 별명이 불가능한 경우 랩퍼 스크립트가 유일한 방법입니다.


그것은 전략 4입니다 ... 실제로 대답은 아닙니다.
guettli

3

GREP_OPTIONS변수가 더 이상 사용되지 않는 이유는 grep스크립트의 어딘가에서 호출 될 때 문제를 일으키는 경향이 있고 스크립트가 변수에서 제공되는 대체 옵션과 작동하지 않기 때문입니다. 래퍼 스크립트를 작성 하면 다른 이름을 지정하지 않으면grep 동일한 문제가 발생 합니다.

$ cat ~/bin/cgrep
#!/bin/sh
exec grep --color=always "$@"
$ find  -exec cgrep  {} +

또는 선호하는 옵션을 변수에 저장하십시오. zsh 이외의 쉘에서는 옵션에 와일드 카드 문자 ( \[*?)가 포함되어 있으면 번거롭지 만, 따옴표없는 변수를 사용하여 인수가있는 명령을 얻을 수 있습니다.

cgrep=(grep --color=always)
find  -exec $cgrep  {} +

GNU와 BSD grep은 디렉토리 트리를 재귀 적으로 처리 할 수 ​​있으므로, 대부분의 경우 find와 함께 필요를 완화시킵니다 grep.


1
그것은 전략 4입니다 ... 실제로 대답은 아닙니다.
guettli

@guettli, 정답입니다. 동작이 다른 명령을 원하면 grep이름이 다른 명령이 필요하거나 같은 이름을 유지하면 원래 / 표준 동작을 예상하는 스크립트가 중단됩니다. 그것은 가장 깨끗하며 추가적인 문제를 일으키지 않습니다 .
Stéphane Chazelas

@ StéphaneChazelas 그렇습니다. 이것은 당신의 관점에 따른 정답입니다.
guettli

1

가장 쉬운 방법은 별칭 (전략 3)을 사용하는 것입니다. 실제로 xargs명령에 신경 쓰면 bash 함수로 명령을 무시할 수 있습니다.

alias grep='grep --color'
xargs() {
    local args
    for ((i=1; i<=$#; i++))
    do
            if [[ "-E -L -P -I -s -d" == *"${!i}"* ]]; then
                    ((i=i+1))
            elif [[ ${!i:0:1} != "-" ]]; then
                    if [[ ${!i} == "grep" ]]; then
                            args="--color"
                    fi
                    /usr/bin/xargs ${@:1:i} $args ${@:i+1}
                    return;
            fi
    done
}

그러나 이것은 grep팀 이 권장하는 솔루션 인 것처럼 보이는 래퍼 명령을 사용하는 것보다 낫지 않습니다 .

/usr/local/bin/grep:

#!/bin/bash
/bin/grep --color "$@"

겸손한 견해로는 grep개발자 팀에 문의하여 GREP_OPTIONS변수에 대한 간단한 대체를 제공하여 grep환경 변수 에 따라 색상을 활성화 하도록 요청해야 합니다.

기본적으로 color옵션을 설정하거나 설정 한 경우 매우 간단합니다 GREP_COLORS.


1
"... grep 개발자 팀에 문의해야합니다 ..." 이것은 나에게 긍정적 인 피드백을 제공합니다. 이제 나는 여기서 무언가가 빠졌다고 생각하는 유일한 사람이 아니라는 것을 알고 있습니다.
guettli

질문에 전략 6으로 "... grep 개발자 팀에 문의해야합니다 ..."라는 의견을 추가했습니다. 지금까지 이것은 내가 가장 좋아하는 답변입니다.
guettli

0

이것은 @NominalAnimal의 최고 답변에서 해결책이지만 일반적인 grep: ...경고 () 대신에 /bin/grep: ...있습니다.

#!/bin/bash
exec -a grep /bin/grep --color=auto "$@"

래퍼를 작성하는 방법을 알고 있습니다. 이 컨텍스트에서 랩퍼는 솔루션이 아닙니다.
guettli

@guettli 글쎄, 대답은 당신의 상황을 정확하게 다루기위한 것이 아닙니다. (저는 원작자 나 다른 사람이 의도하지 않은 것과 비슷한 편집을 거부했습니다.) 귀하의 상황에 대한 귀하의 질문에 대한 적절한 문자 답변은 다른 "Strategy NICE-and-EASY"가 존재하지 않는다는 것입니다.
Kirill Bulygin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.