파일의 처음 n 줄만 grep 할 수 있습니까?


답변:


175

파이프의 마법;

head -10 log.txt | grep <whatever>

13
임의의 스트림을 head다음으로 파이프 할 수도 있습니다 .someCmd | head -10
Stuart Nelson

1
Head는 기본적으로 처음 10 줄을 표준 출력으로 인쇄하므로 10 줄에 유효합니다head log.txt | grep <whatever>
Zlemini

5
grep의 -l옵션을 사용할 때 이것을 수행하는 방법이 있습니까? 처음 5자인 모든 파일을 나열하고 싶습니다 RIFFD.
James M. Lay

49

Google에서 이것을 찾은 사람들을 위해 n여러 파일 의 첫 줄 을 검색해야 했지만 일치하는 파일 이름 만 인쇄해야했습니다. 나는 사용했다

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

FNR..nextfile10 개 번 라인 파일 처리를 중지 볼되었다. //..{}에 인쇄 파일 이름 및 이동 때마다 해당 파일을 보여줍니다 최대의 첫 경기. 다른 프로그램의 이점을 위해 파일 이름을 인용하려면

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

9
저는 Google에서 이것을 찾은 사람들 중 한 명이었습니다. 감사!
Floris

나를 위해이 코드는 파일의 전체 경로를 인쇄했습니다. 정확히 내가 필요했던 것입니다. 또한 FNR=1첫 번째 줄만 검색합니다. 감사!
브라이언 W

2
이 작업을 디렉토리에서 재귀 적으로 수행하려면 :find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog

1
감사합니다 @OrangeDog. 하나 약간의 보정 :이어야한다-type f
데이비드 Siegal

26

또는 다음 awk없이 단일 프로세스에 사용하십시오 |.

awk '/your_regexp/ && NR < 11' INPUTFILE

각 줄에서 your_regexp일치하고 레코드 (줄) 수가 11 개 미만이면 기본 작업 (입력 줄 인쇄)을 실행합니다.

또는 다음을 사용하십시오 sed.

sed -n '/your_regexp/p;10q' INPUTFILE 

정규 표현식을 확인하고 줄을 -n인쇄하고 (입력을 인쇄하지 않음, 그렇지 않으면 기본값 임) 10 번째 줄 바로 후에 종료됩니다.


1
10 일에 그만 두지 않겠습니까? (sed 솔루션 참조)
potong

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-더 빠릅니다.

1
@potong 당신이 옳습니다. @srikanthradix 더 빠를 수 있지만 해결책은 regexps를 검색하지 않고 고정 문자열 만 검색하는 것입니다. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile않습니다.
Zsolt Botykai

4
게다가 스타일은 awkish. 2xifs그리고 1xelse행동 진술이 필요하지 않은 명령에서 aho를 만들 것입니다. 와인 버거와 커니 핸 외침 ...
싱 jaypal

1
NR 대신에 FNR을 사용하는 것이 더 낫다고 생각합니다. 여러 파일에 awk를 사용하면 FNR이 각 파일에 대해 0에서 시작하기 때문입니다.
일러스트 Vladyslav 사브 첸코

9

와 함께 프로그램을 사용하는 몇 가지 옵션이 있습니다 grep. 내 생각에 가장 간단한 방법은 다음을 사용하는 것입니다 head.

head -n10 filename | grep ...

head-n옵션을 사용하여 처음 10 줄 을 출력 한 다음 해당 출력을 grep.


6
나는 여기에서 사용하는 모든 솔루션 이 기본적으로 10 줄만 표시 한다는 것을 깨닫지 못하고 (나를 포함하여)head 사용했습니다 . :)-n 10 head
싱 jaypal



3

이를 수행하기 위해 의 출력을 head -10 file파이프 할 수 있습니다 grep.

head -10 file | grep 

Perl 사용 :

perl -ne 'last if $. > 10; print if /pattern/' file

3
head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2: 패턴 앞에 두 줄을 인쇄합니다.

-B 2: 패턴 뒤에 두 줄을 인쇄합니다.

head -10 log.txt # read the first 10 lines of the file.

1
내가 기억한다면, -C 2다음과 같이 할 것입니다-A 2 -B 2
David LeBauer

3
grep -m6 "string" cov.txt

처음 6 줄만 검색합니다. string


3
아니요, 전체 cov.txt 파일에서 "string"의 처음 6 개 항목을 제공합니다.
franzisk

2

요아킴 이삭손의 대답에 확장 : 꽤 자주 나는 경우에 당신이 결합 할 수있다, 5020에 예를 들어 긴 파일의 중간에서 뭔가 라인 5001을 필요 headtail:

head -5020 file.txt | tail -20 | grep x

이것은 처음 5020 줄을 얻은 다음 그 중 마지막 20 줄만 표시 한 다음 모든 것을 grep으로 파이프합니다.

(편집 됨 : 내 예제 번호의 fencepost 오류, grep에 파이프 추가)


1

grep -A 10 <패턴>

이것은 패턴과 패턴 뒤의 다음 10 줄을 잡는 것입니다. 이것은 알려진 패턴에 대해서만 잘 작동합니다. 알려진 패턴이없는 경우 "헤드"제안을 사용하십시오.


1
맞을 수도 있지만. 질문에 대한 설명을 더 추가하여보다 포괄적 인 답변을 만드십시오.
Pramod S. Nikam 2014 년

3
이것은 완전히 다른 질문에 대한 대답이며이 맥락에서는 유용하지 않습니다.
Pre101

-1

비슷한 문제가 있었는데 위의 모든 문제가 완전히 해결되지는 않았습니다. 또한 일치하는 줄이 포함 된 파일 이름을 얻는 데 관심이 있습니다. 내 솔루션 :

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

NB : 제 경우의 패턴은 항상 첫 번째 줄과 일치합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.