2008-12-17 10 views

답변

4

원하는 결과를 얻으려면 grep의 출력을 sed로 파이프해야합니다. 다음은 예입니다.

grep mypattern *.txt | sed 's/^\([^:]*:.......\).*/\1/' 

도트 수는 인쇄 할 문자 수입니다. 많은 버전의 sed는 -r (GNU/Linux) 및 -E (FreeBSD)와 같은 옵션을 제공하여 모던 스타일의 정규 표현식을 사용할 수 있도록합니다. 이렇게하면 인쇄 할 문자의 수를 숫자로 지정할 수 있습니다.

N=7 
grep mypattern *.txt /dev/null | sed -r "s/^([^:]*:.{$N}).*/\1/" 

이 솔루션은 다른 프로세스가 여러 프로세스를 호출하는 데 훨씬 효율적이라는 점에 유의하십시오.

+0

내 리눅스 머신에서 sed는 -E (grep does)를 받아들이지 않는다. 그러나 -r –

+0

과 함께 작동합니다. 파일의 처음 N자를 찾고 일치하는 N자를 찾지 않습니다. 또한 * .txt가 0 또는 1 개의 파일을 평가할 경우/dev/null을 거기에 추가하십시오. 예 : grep mypattern * .txt/dev/null | sed ... –

+0

내가 제공 한 확장 된 RE 패턴은 N 문자보다 적은 수의 줄과 일치하지 않으므로 사양에 따라 올바르게 인쇄됩니다./dev/null 인수를 추가해야 할 필요가 있습니다. –

3

'n 개의 줄'대신 'n 개의 문자'를 인쇄하는 도구는 거의 없습니다. 정말로 문자가 아닌 선을 원하십니까? 모든 것이 Perl에서 가장 잘 수행 될 수 있습니다. (grep 사용) 지정, 우리는 할 수 있습니다

pattern="$1" 
shift 
n="$2" 
shift 
grep -l "$pattern" "[email protected]" | 
while read file 
do 
    echo "$file:" $(dd if="$file" count=${n}c) 
done 

따옴표는 약 $file 제대로 파일 이름에 여러 공간을 보존 할 수 있습니다. 우리는 현재 (명령 이름이 'ngrep'입니다 가정), 명령 줄 사용을 토론 할 수

ngrep pattern n [file ...] 

내가 'head -c $n을'@litb 사용 있습니다; 내가 사용한 dd 명령보다 깔끔합니다. head이없는 시스템이있을 수 있습니다 (그러나 그들은 꽤 고풍 것입니다). POSIX 버전 head-n과 행 수만 지원합니다. -c 옵션은 아마도 GNU 확장입니다.

5
grep -l pattern *.txt | 
    while read line; do 
     echo -n "$line: "; 
     head -c $n "$line"; 
     echo; 
    done 

변경 -n--c 대신 바이트의 첫 번째 n 라인을보고 싶다면. 여기

0

두 가지 생각 : 효율 우려 (즉 이제까지 일어날 것 같은) 아니었다면

1), 각 파일에 그렙를 실행 한 후 $ 상태 [CSH]을 확인할 수 있습니다. 예컨대은 :

foreach FILE (file1 file2 ... fileN) 
    grep targetToMatch ${FILE} > /dev/null 
    if ($status == 0) then 
    echo -n "${FILE}: " 
    head -c25 ${FILE} 
    endif 
end 

2 (N자 = 25. 들어))은 GNU [FSF]헤드는 --verbose[-v] 스위치를 포함한다. 또한 공백으로 파일 이름을 조정하기 위해 --null을 제공합니다. "-c"과 같은 파일 이름을 처리하려면 '-'이 있습니다.그래서 당신은 할 수있다 :

grep --null -l targetToMatch -- file1 file2 ... fileN | 
xargs --null head -v -c25 --