2010-01-09 2 views
57

대개 긴 줄이있는 HTML 파일에서 ack 또는 grep을 실행하고 싶습니다. 나는 반복적으로 감싸는 매우 긴 줄을보고 싶지 않다. 하지만 정규 표현식과 일치하는 문자열을 둘러싼 긴 행의 일부만 보길 원합니다. Unix 도구의 조합을 사용하여 어떻게 이것을 얻을 수 있습니까?grep 또는 ack가 반환 한 긴 일치 행을 자르는 방법

 
     -o, --only-matching 
       Show only the part of a matching line that matches PATTERN. 

.. 또는 -c :

 
     -c, --count 
       Suppress normal output; instead print a count of matching lines 
       for each input file. With the -v, --invert-match option (see 
       below), count non-matching lines. 
+1

1의 문자를 얻는다? 당신이 무언가를 좋아하지 않을 때 사용하는 명령입니까? 'ack file_with_long_lines | grep 패턴'? :-) –

+6

@Alok'ack' (데비안에서는'ack-grep'으로 알려짐)은 스테로이드의'grep'입니다. '--thpppt' 옵션도 있습니다 (농담이 아닙니다). http://betterthangrep.com/ – ZoogieZork

+0

감사. 나는 오늘 무언가를 배웠다. –

답변

57

당신은 주위 몇 컨텍스트를 참조하기 위해 ".{0,10}<original pattern>.{0,10}"에 패턴을 변화와 가능성 조합은 grep 옵션 -o을 사용할 수 있습니다 귀하의 결과는 cut입니다. 또한 --cut 스위치를 추가하여 --cut = 80이라고 말할 수 있고 80 개의 컬럼 만 얻을 수 있습니다.

+21

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

+9

@Renaud (확장 패턴 옵션)에 표시된 것처럼 -E 옵션을 추가하도록 해답을 변경하거나 확장 된 문맥은 작동하지 않을 것이다. – kriss

28

파이프

+5

일치하는 부분이 처음 80 자 이내 인 경우 어떻게해야합니까? – Ether

+3

FWIW 나는'| cut = c1-120' grep에, 나를 위해 일했다. (일치하는 텍스트를 잘리는 방법은 모르겠지만) –

+17

''| cut = c1-120''이 나에게 도움이되지 않았다.''| cut -c1-120'' –

17

ack에 대한 호출기로 less를 사용하고 긴 줄을자를 수 있습니다. ack --pager="less -S"이 줄은 길지만 줄 바꿈 대신 한 줄에 남겨 둡니다. 더 많은 선을 보려면 화살표 키로 왼쪽/오른쪽으로 스크롤하십시오.

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

~/.ackrc 파일에 항상'--pager' 명령을 넣을 수 있다는 점에 유의하십시오. –

+0

이것은 버그가 많은이 문제와 관련하여 가장 좋은 해결책이라고 생각합니다. 나는'ack'을 어떻게 사용하는지 알고 싶습니다. –

1

에서 촬영 : 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}"은 강조 색은 종종 엉망 것을 제외하고 완벽하게 좋은

나는이 작업을 수행하는 ACK에 대해 다음 별명 설정을 가지고있다. 나는 비슷한 출력하는 스크립트를 만들었습니다하지만 색상도 보존됩니다 :

#!/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 문자로한다 저장됩니다 가정.

0
cut -c 1-100 

은 100`ack`은 무엇

관련 문제