grep에서 반환되는 결과 수를 어떻게 제한합니까?


180

grep에서 최대 10 줄을 말하고 싶습니다.

컴퓨터가 열심히 작동하는 것을 원하지 않습니다. grep에서 찾은 10 개의 결과를보고 중단하고 싶습니다. 가능합니까?


귀하의 경우에는 컴퓨터가 열심히 작동하는 것을 원하지 않습니다. 그러나 사람의 가독성 문제인 less경우 파이프를 통해 사용할 수 있습니다 . 화면이 채워지고 ENTER q를 눌러 더 많은 줄을보고 종료 할 수 있습니다 .grep "SomeText" somefile.csv | less
SilentSteel

답변:


240

-m옵션은 당신이 찾고있는 무엇 아마 :

grep -m 10 PATTERN [FILE]

보낸 사람 man grep:

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the  input  is
        standard  input  from a regular file, and NUM matching lines are
        output, grep ensures that the standard input  is  positioned  to
        just  after the last matching line before exiting, regardless of
        the presence of trailing context lines.  This enables a  calling
        process  to resume a search.

참고 : 지정된 수의 일치 항목을 찾으면 grep이 파일 읽기를 중지합니다!


3
안녕 그것은 그것을 시도했지만 기본적으로 작동하지만 그가 생각하고 "내 CPU를 사용하여"계속 보이는 것처럼 처음 10 줄을 찾은 후 grep "정지"생각처럼 보이지 않으며 그것이 맞지 않습니까? thansk
Jas

6
@Jason : 이것은 사실이 아닌 것 같습니다 : grep은 -m 1내 노트북에 1 천만 줄이있는 파일에 0.005 초, 1.579 초를 소비합니다.
Grégoire

3
파이핑 (piping into) tail은 일반적으로 효과가 있지만, 특히 컨텍스트 수를 늘리는 경우 (예 : 결과 수가 아닌 컨텍스트 grep -A10 PATTERNtail자르는 경우)에 문제가 발생합니다. 이 대답은 내가 찾던 것이 었습니다.
dimo414

1
-m 10여러 파일을 grepping 할 때 차이를 만드는 옵션입니다! 첫 번째 파일에 일치 항목이 너무 많으면 후속 파일에서 일치 항목이 표시되지 않습니다. 감사 !
Julien

1
IMHO 이것은 다른 도구가 필요하지 않으므로 허용되는 답변으로 표시해야합니다. BTW --max 카운트의 바로 가기는 것을 알고이 옵션을 기억하는 것이 더 쉽습니다
ishahak

68

또 다른 옵션은 head를 사용하는 것입니다 .

grep ...parameters... yourfile | head

전체 파일을 검색 할 필요는 없습니다. 처음 10 개의 일치하는 줄을 찾으면 중지됩니다. 이 방법의 또 다른 장점은 -o 옵션과 함께 grep을 사용하더라도 10 줄을 넘지 않는 것입니다.

예를 들어 파일에 다음 줄이 포함 된 경우 :

112233
223344
123123

그런 다음 출력의 차이입니다.

$ grep -o '1.' yourfile | 헤드 -n2
11
12

$ grep -m2 -o '1.'
11
12
12

를 사용하면 head원하는대로 2 개의 결과 만 반환하지만 -m2는 3을 반환합니다.


3
당신이 사용할 수 없습니다 | head사용할 때 파이프를 grep함께 -A또는 -B(및뿐만 아니라 (결과 검색 -o), 그러나 컨텍스트뿐만 아니라). 이 경우 -mgrep에게 결과를 반환 할 줄 수를 알려 주어야합니다.
Attila O.

17
head를 사용한다고해서 grep이 전체 파일에서 실행되는 것을 막을 수는 없습니다. grep에서 -m 옵션을 사용하면됩니다.
LopSae

7

Awk 접근 방식 :

awk '/pattern/{print; count++; if (count==10) exit}' file

0

꼬리 사용하기 :

#dmesg 
...
...
...
[132059.017752] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
[132116.566238] cfg80211: Calling CRDA to update world regulatory domain
[132116.568939] cfg80211: World regulatory domain updated:
[132116.568942] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132116.568944] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568945] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568947] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[132116.568948] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568949] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132120.288218] cfg80211: Calling CRDA for country: GB
[132120.291143] cfg80211: Regulatory domain changed to country: GB
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | head 2
head: cannot open 2 for reading: No such file or directory
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -2
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -5
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -6
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ 

편집기에서 "{}"와 같은 아이콘을 클릭하여 "코드 형식화"에서 설정할 수 있습니다.
peterh-Reinstate Monica

loooonl loooog liiines보다 더 읽기 쉬운 예제를 제공하는 것이 유용합니다
Putnik

0

2 가지 사용 사례 :

  1. 파일 당 n 개의 결과가 아니라 n 개의 전체 결과 만 원합니다 grep -m 2.는 파일 당 최대 발생입니다.
  2. 나는 자주 사용 git grep하지 않는-m

이 시나리오에서 좋은 대안은 grep | sed 2q모든 파일에서 처음 두 번의 발생을 grep하는 것입니다. sed 문서 : https://www.gnu.org/software/sed/manual/sed.html

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