
큰 파일이 있고 grep의 간단한 필터를 사용하여 표시하고 싶습니다.
이것이 내 파일이라고 가정해 보겠습니다.
TIME0 random data
TIME1 random data
TIME2 INTERESTING LINE
TIME3 random data
TIME4 random data
TIME5 random data
TIME6 random data
TIME7 INTERESTING LINE
TIME8 random data
TIME9 random data
TIME10 random data
TIME11 INTERESTING LINE
TIME12 random data
보여주고 싶다재미있는 라인에스:
grep "INTERESTING LINE" myfile
이 방법은 작동하지만 파일이 크고 수백만 개의 파일이 포함되어 있습니다.재미있는 라인에스. 마지막 하나만 필요합니다.
tac myfile | grep -m3 "INTERESTING LINE"
이것은 작동하지만 필요한 것을 어떻게 지정합니까?재미있는 라인특정 시간이 지나면시간접두사? (또는 tac
일부시간)
예를 들어, 위 샘플 파일의 경우 모든 항목을 어떻게 grep합니까?재미있는 라인에서내 파일끝에서 끝까지시간 7오직? (따라서 TIME2의 재미있는 대사는 필요하지 않습니다):
TIME11 INTERESTING LINE
TIME7 INTERESTING LINE
순서는 중요하지 않습니다. ASC 또는 DESC 주문을 수락할 수 있습니다.
전체 파일을 스캔하지 않는 것이 중요합니다. 즉, 파일 끝부터 시작하여 한 줄씩 작업합니다.
grep에 대한 종료 기준을 제공하는 방법을 찾고 있습니다(최대 결과 수를 정의하는 대신 -m
).
답변1
sed
대신 grep
입력 데이터 구문 분석을 더 효과적으로 제어하려면 다음을 사용하세요 .
$ tac file | sed -n -e '/^TIME6 /q' -e '/INTERESTING LINE/p'
TIME11 INTERESTING LINE
TIME7 INTERESTING LINE
이렇게 하면 제안한 대로 파일이 반전 tac
되고 반전된 데이터가 전달됩니다 sed
.
sed
표현의 두 가지 방법:
/^TIME6 /q
, 그리고 로 시작하는 줄을 찾으면 종료합니다TIME6
./^TIME[0-6] /q
또는 시간 열과 일치하는 표현식을 사용할 수도 있습니다 . 이는 너무 오래되어 흥미로울 수 없습니다./INTERESTING LINE/p
, 주어진 정규식과 일치하는 모든 줄을 인쇄합니다.
그 결과 너무 새로운 타임스탬프를 찾을 때까지 파일을 읽지 못하게 됩니다. 구문 분석 중에 발견된 흥미로운 행은 표준 출력으로 인쇄됩니다.
TIME7
검색하려는 정확한 타임스탬프를 알고 있는 경우 :
$ tac file | sed -n -e '/INTERESTING LINE/p' -e '/^TIME7 /q'
TIME11 INTERESTING LINE
TIME7 INTERESTING LINE
이를 통해 우리가 종료하려는 정확한 타임스탬프인 경우에도 읽은 마지막 줄(흥미로운 경우)을 인쇄할 수 있습니다.