`하이라이트`명령


11

전체 문자열을 stdout에 전달하면서 stdin에서 특정 문자열을 쉽게 강조 표시하는 데 사용할 수있는 명령이 있습니까? 나는 그것을 구축하려고 생각하고 있지만 이미 존재하는 경우 오히려 사용하고 싶습니다. 몇 가지 바람직한 기능 :

  1. 별도의 강조 표시 문자열은 자동으로 다르게 강조 표시됩니다. 예를 들어, 첫 번째 문자열은 빨간색으로, 두 번째 문자열은 녹색으로, 세 번째 문자열은 수동 구성없이 파란색으로 강조 표시됩니다 .
  2. 색상 지원을 감지하고 가능한 경우 굵게 / 반전 / 기타 강조 표시 방법으로 넘어갑니다.
  3. 정규식과 리터럴 문자열을 일치시킬 수 있습니다.
  4. "foobar"및 "barbar"와 같이 일치 항목이 겹치는 경우 스마트 한 작업을 수행하는 것이 좋습니다.
  5. 색상 코드 추가를 제외하고 stdin과 stdout 사이에는 아무것도 수정되지 않습니다.


좋은 질문입니다. 나는이 정확한 것을 필요로하고 무언가를 쓰게되었지만, 단지 색으로 구분 된 고정 문자열, 그것은 당신이 열거 한 기능을 가지고 있지 않았다
Michael Mrozek

새로운 유틸리티를 작성하는 대신 grep 자체에 추가 된 것으로 보는 것이 매우 좋습니다.
mattdm

1
적절한 유닉스 철학은 grep뿐만 아니라 다른 스트림에서도 파이프 될 수있는 새로운 유틸리티입니다. 나는 아마도 당신을 위해 이것을 할 수있는 적어도 하나 이상의 Perl 모듈이 있다고 생각합니다.
Shadur

1
@Gilles : 그 질문의 범위는 훨씬 제한적입니다. 사실, 그것을 읽는 것이 제가이 질문을 만든 이유 중 하나였습니다 –보다 일반적이고 유연한 해결책을 요청하십시오.
l0b0

답변:


4

아마 Radovan Garabík의 Generic Colouriser (grc) ? 구성 파일을 인수로 사용하고 regexp와 함께 작동합니다. 따라서 구성이없는 것은 아니지만 프로세스 프로세스 대체 ( <(list))를 사용할 수 있으므로 수동 구성 없이 :-)


페이지를 열지 않고 명확하게하고 검색 가능하게하려면 "this one"== Generic Colouriser ; grcgrcat ... 고마워요.
Peter.O

grc도우미 스크립트가 있습니다 : grcat. 다음은 모든 대문자를 빨간색으로 색칠하는 예입니다. 1 단계 : 구성 파일 설정 : printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps 2 단계; 그것을 사용하십시오 : echo Hello World | grcat red-caps... 맨 페이지에는 검색하는 3 개의 구성 디렉토리가 나와 있으며 구성 파일이 절대 경로 일 수 있다고 제안하지만 (?) 구성 파일을 찾는 마지막 방법은 상대 경로에서만 작동합니다 (grc 버전 1.3)
Peter.O

5

구조에 sed!

이것을 실제로 향상시킬 수는 있지만 꽤 잘 작동합니다.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

간단하게하기 위해, hilight는 인수 쌍을받습니다 (먼저 일치, 두 번째 색).이 스크립트에서 속성은 항상 굵게 표시됩니다.

man console_codes (Graphic Rendition)를 읽고 색상 이스케이프 보안을 보거나 시도하십시오.

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

이 작품을 사용할 때 중요한 단점이 있습니다.

$ dmesg | hilight \\[ 34 ] 34

그러나 이것은 전혀 아닙니다.

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

[: digit :]는 이전 자살에 대한 이스케이프 시퀀스의 숫자를 찾습니다.

다음과 같은 것 :

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

항상 예외로 작동합니다.

시간 명령을 사용하여 경과 시간이 4 씩 증가하는 것을 알았습니다.

sed 명령을 원하는 다른 파서 (awk 등)로 바꿀 수 있습니다.


2

인쇄 할 수없는 문자의 모든 줄과 일치하는 패턴과 함께 egrep을 사용할 수도 있습니다.

dmesg | egrep --color "swap|$"

1

clide 는 잘 작동합니다. EPEL 저장소의 RHEL 6.2에서 사용합니다.


아주 좋은 도구는 +1입니다. 불행히도 모든 기능을 요구하지는 않습니다.
l0b0

1

버전에 grep색상이있는 경우 정규 표현식 변경을 사용하여 grep이 텍스트를 강조 표시하고 모든 줄을 일치시켜 제외되는 부분이 없도록 할 수 있습니다. 다음은 트릭을 수행해야합니다.

<your command> |grep "highlightme\|^"

0

링크에서 언급했듯이 grep --color=always하나의 패턴에만 작동합니다. 즉, 나는 그러한 도구가 존재한다고 생각하지 않습니다.


0

http://em.readthedocs.org/ 사용 합니다 . Python으로 인해 다양한 플랫폼에 쉽게 설치할 수 있습니다. 간단하고 잘 작동합니다.


유닉스 및 리눅스 스택 교환에 오신 것을 환영합니다! 이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
slm

1
도움말 센터 에 따르면 : "하지만 답변에 소속을 공개 해야합니다 ." 당신이 쓴 Igor Kalnitsky와 같은 경우에, 당신이 em사용자가 아니라 제안 된 도구의 저자라는 것을 분명히하기 위해 당신의 대답을 바꿔 주세요.
manatwork
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.