grep을 사용하여 파일에서 마지막으로 일치시키기


58

grep을 사용하여 파일에서 정규식의 최종 일치 항목 만 얻는 가장 좋은 방법은 무엇입니까?

또한 처음이 아니라 파일의 끝에서 grepping을 시작하고 첫 번째 일치 항목을 찾으면 중지 할 수 있습니까?

답변:


85

당신은 시도 할 수 있습니다

grep pattern file | tail -1

또는

tac file | grep pattern | head -1

또는

tac file | grep -m1 pattern

20
tac file | grep -m 1 pattern
Dennis Williamson

1
grep -n실제 파일에서 줄 번호 ( ) 를 얻으려는 제약 조건이 추가되었으므로을 tac빼고 싶지 않다면 피해야 한다고 생각 wc -l합니다. 그렇지 않으면와 tac함께 grep -m1의미가 있습니다.
닉 메릴

1
20GB 파일을 검색하려고하기 때문에 이것보다 성능이 뛰어난 버전을보고 싶습니다.
Jeff

@DennisWilliamson의 답변은 grep첫 번째 경기 후 작동을 멈출 것이므로 훨씬 낫 습니다. 하지 않고 -m 1, grep첫번째 것 파일의 모든 일치하는 패턴을 찾아 , 다음 head이 표시됩니다 첫 번째는 - 훨씬 효율적입니다. 데니스, 별도의 답변으로 게시 해주세요!
gilad mayani

1

Unix / Linux / Mac / Cygwin에서 큰 텍스트 파일로 작업하는 사람에게 적합합니다. Windows를 사용하는 경우 Windows의 Linux 도구에 대해 다음을 확인하십시오 . https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows .

이 워크 플로에 따라 성능을 향상시킬 수 있습니다.

  1. gzip으로 압축
  2. zindex (github : https://github.com/mattgodbolt/zindex )를 사용하여 적절한 키로 파일을 색인화하십시오.
  3. zq패키지에서 색인 파일을 쿼리하십시오 .

github readme에서 인용하십시오 :

인덱스 생성

zindex는 각 줄의 어떤 부분이 색인을 구성하는지 알려줘야합니다. 이는 정규 표현식, 필드 또는 외부 프로그램을 통해 각 라인을 파이핑하여 수행 할 수 있습니다.

기본적으로 zindex는 file.gz를 색인하도록 요청 될 때 file.gz.zindex의 색인을 작성합니다.

예:

숫자 정규식과 일치하는 줄에 색인을 만듭니다. 캡처 그룹은 색인을 생성 할 부분을 나타내며 옵션은 각 줄에 고유 한 숫자 색인이 있음을 보여줍니다.

$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique

예 : CSV 파일의 두 번째 필드에 색인을 작성하십시오.

$ zindex file.gz --delimiter , --field 2 

예:

문서 루트의 actions 배열에있는 항목 중 하나에서 JSON 필드 orderId.id에 색인을 작성하십시오 (jq 필요). jq 쿼리는 모든 orderId.ids의 배열을 작성한 다음 스페이스와 결합하여 jq로 파이프 된 각 개별 라인이 공백으로 구분 된 여러 개의 일치 (기본 구분자)를 갖는 단일 출력 라인을 작성하도록합니다.

$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'" 

인덱스 쿼리

zq 프로그램은 색인을 조회하는 데 사용됩니다. 압축 파일 이름과 쿼리 목록이 제공됩니다. 예를 들면 다음과 같습니다.

$ zq file.gz 1023 4443 554 

줄 번호로 출력하여 파일에서 줄 1과 1000을 인쇄 할 수도 있습니다.

$ zq file.gz --line 1 1000

1

나는 항상 고양이를 사용하고 있습니다 (그러나 이것은 조금 더 길어집니다). cat file | grep pattern | tail -1

나는 고양이를 좋아하는 대학에서 내 리눅스 관리자 코스 교사를 비난 할 것이다 :)))))

-파일을 가져 오기 전에 먼저 파일을 만들 필요는 없습니다. grep pattern file | tail -1더 효율적입니다.


6
이것은 Cakemox의 답변 중 첫 번째 부분입니다.
augurar

작동하지만 불필요한 단계를 수행합니다. 가벼운 사용법의 경우이 솔루션은 정상적으로 작동하지만 성능이 좋지 않습니다. cat파일에 파일 을 넣을 필요가 없기 때문 grep입니다. Cakemox의 답변에서 와 같이 grep직접 파일 을 검색 grep pattern file한 다음 tail마지막 결과를 반환하는 데 사용할 수 있습니다.
jvriesem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.