grep 또는 ack에서 반환 된 긴 일치 줄을 자르는 방법


90

종종 매우 긴 줄이있는 HTML 파일에서 ack 또는 grep을 실행하고 싶습니다. 반복적으로 줄 바꿈되는 매우 긴 선을보고 싶지 않습니다. 그러나 정규 표현식과 일치하는 문자열을 둘러싸는 긴 줄 부분 만보고 싶습니다. Unix 도구의 조합을 사용하여 어떻게 얻을 수 있습니까?


1
무엇입니까 ack? 뭔가 마음에 들지 않을 때 사용하는 명령입니까? 같은 거 ack file_with_long_lines | grep pattern? :-)
Alok Singhal

6
@Alok ack( ack-grep데비안에서 알려짐 )는 grep스테로이드에 있습니다. 또한 --thpppt옵션 이 있습니다 (농담 아님). betterthangrep.com
ZoogieZork

감사. 나는 오늘 뭔가를 배웠다.
Alok Singhal

1
--thpppt기능은 다소 논란의 여지가 있지만 주요 이점은 Perl 정규식을 직접 사용할 수 있다는 [[:space:]]것입니다 {. [, 등의 문자가 아니라 기억하기 어려운 방식으로 -e-E스위치를 사용하여 의미를 변경할 수 있다는 것입니다.
Evgeni Sergeev

답변:


99

grep 옵션을 사용할 수 있으며, -o패턴을 변경하여 ".{0,10}<original pattern>.{0,10}"주변의 컨텍스트를 볼 수 있습니다.

       -o,-만 일치
              PATTERN과 일치하는 행의 일부만 표시합니다.

.. 또는 -c:

       -c, --count
              정상 출력을 억제합니다. 대신 일치하는 줄 수를 인쇄하십시오.
              각 입력 파일에 대해. -v, --invert-match 옵션을 사용하면
              아래), 일치하지 않는 줄을 계산합니다.

44
예 : grep -oE ". {0,20} mysearchstring. {0,20}"myfile
Renaud

14
@Renaud (확장 패턴 옵션)에 표시된대로 -E 옵션을 추가하도록 대답을 변경해야합니다. 그렇지 않으면 컨텍스트 확장을 위해 제안 된 패턴이 작동하지 않습니다.
kriss 2013 년

그다지 필요하지는 않지만 여기에 예가 있습니다. $ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt 인쇄qqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
Ulises Layera

이것은 잘 작동합니다. 그러나 주목할만한 단점은 예를 들어를 사용할 때 oE ".{0,20}mysearchstring.{0,20}"전체가 검색 패턴이되므로 컨텍스트에 대한 내부 "원본"문자열의 강조 표시를 잃게된다는 것입니다. 훨씬 더 쉬운 시각적 스캔 및 결과 해석을 위해 검색 결과 주변에 강조 표시되지 않은 컨텍스트를 유지하는 방법을 찾고 싶습니다.
Aaron Wallentine

1
아, 여기 -oE ".{0,x}foo.{0,x}"접근 방식 ( x컨텍스트의 문자 수)을 사용하여 발생하는 강조 문제에 대한 해결책이 있습니다. -append`| grep foo`끝까지. ack 또는 grep 솔루션에서 작동합니다. 더 많은 솔루션도 여기에 있습니다 : unix.stackexchange.com/questions/163726/…
Aaron Wallentine

44

을 통해 결과를 파이프하십시오 cut. 또한 80 개의 열만 얻을 --cut수 있도록 스위치를 추가하는 것도 고려 중 --cut=80입니다.


8
일치하는 부분이 처음 80자가 아닌 경우 어떻게합니까?
Ether

3
FWIW 나는 추가 | cut=c1-120(하지만 주변에 일치하는 텍스트를 잘라하는 방법을 모른다) 나를 위해 일한 그렙에
제이크 Rayson

26
| cut=c1-120나를 위해 작동하지 않았다, 나는 할 필요가| cut -c1-120
켄 코크에게

1
@edib 구문이 정확하다고 생각합니다. | cut -c 1-100 stackoverflow.com/a/48954102/1815624
CrandellWS

1
@AndyLester : --no-wrap사용 하는 옵션은 $COLUMNS어떻습니까?
naught101

25

ack 및 chop 긴 줄을위한 호출기로 less를 사용할 수 있습니다. ack --pager="less -S" 이렇게하면 긴 줄이 유지되지만 줄 바꿈 대신 한 줄에 남습니다. 선을 더 많이 보려면 화살표 키를 사용하여 왼쪽 / 오른쪽으로 스크롤하십시오.

이 작업을 수행하기 위해 ack에 대한 다음 별칭 설정이 있습니다.

alias ick='ack -i --pager="less -R -S"' 

2
--pager항상 사용하고 싶다면 ~ / .ackrc 파일 에 해당 명령을 넣을 수 있습니다 .
Andy Lester 2014

이것은 나를 많이 괴롭히는이 문제에 대한 최상의 해결책처럼 들립니다. 사용 방법을 알았 으면합니다 ack.
브라이언 피터슨

@BrianPeterson ack은 거의 똑같 grep습니다. 가장 일반적인 경우에만 더 간단합니다
Aaron Wallentine


2

출처 : http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

제안 된 접근 방식 ".{0,10}<original pattern>.{0,10}"은 강조 색상이 종종 엉망이된다는 점을 제외하면 완벽하게 좋습니다. 유사한 출력으로 스크립트를 만들었지 만 색상도 유지됩니다.

#!/bin/bash

# Usage:
#   grepl PATTERN [FILE]

# how many characters around the searching keyword should be shown?
context_length=10

# What is the length of the control character for the color before and after the
# matching string?
# This is mostly determined by the environmental variable GREP_COLORS.
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1))

grep -E --color=always "$1" $2 |
grep --color=none -oE \
    ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"

스크립트가 저장됩니다 가정 grepl한 후, grepl pattern file_with_long_lines일치하는 행을 표시하지만 일치하는 문자열 약 10 문자로한다.


작동하지만 다음과 같이 후행 정크를 출력합니다. ^ [[? 62; 9; c. @Jonah Braun의 대답이 나를 만족 했기 때문에 디버깅을 시도하지 않았습니다 .
sondra.kinsey

1

내가하는 일은 다음과 같습니다.

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}

내 .bash_profile에서 grep을 재정 의하여tput rmam 이전과 tput smam이후에 자동으로 실행되도록하여 래핑을 비활성화 한 다음 다시 활성화합니다.


그것은 좋은 대안입니다-실제 경기가 화면 밖에있는 경우를 제외하고 ...
Xerus

1

여기에 이미지 설명 입력

를 사용할 수없는 비정상적인 상황에서는 다음을 사용할 -E수 있습니다.

grep -oe ".\{0,10\}error.\{0,10\}" mylogfile.txt

0

나는 다음을 내 .bashrc:

grepl() {
    $(which grep) --color=always $@ | less -RS
}

그런 다음에 사용할 수 grepl있는 인수와 함께 명령 줄에서 사용할 수 있습니다 grep. 더 긴 선의 꼬리를 보려면 화살표 키를 사용하십시오. q종료하는 데 사용 합니다.

설명:

  • grepl() {: 모든 (새) bash 콘솔에서 사용할 수있는 새 기능을 정의합니다.
  • $(which grep):의 전체 경로를 가져옵니다 grep. (우분투의 별칭 정의 grep즉 동일합니다 grep --color=auto. 우리는 그 별명 만 원을 원하지 않는다 grep.)
  • --color=always: 출력물을 색상 화합니다. ( 출력이 파이프에 들어가는 것을 감지하고 색상을 지정하지 않기 --color=auto때문에 별칭에서 작동 grep하지 않습니다.)
  • $@: grepl함수에 주어진 모든 인수를 여기에 넣으십시오 .
  • less: 다음을 사용하여 라인을 표시합니다. less
  • -R: 색상 표시
  • S: 긴 줄을 끊지 마십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.