grep (또는 sed?): 일치하는 항목을 찾기 전에 지정된 행 수를 건너뜁니다.

grep (또는 sed?): 일치하는 항목을 찾기 전에 지정된 행 수를 건너뜁니다.

나는 시간이 지남에 따라 누적되는 거대한 로그 파일을 다루고 있으며 잘라내거나 회전할 수는 없지만 매 시간마다 새 항목을 구문 분석해야 합니다.

grep나는 특정 문자열이 있는 항목을 가져온 다음 얻은 항목 수를 계산하고 첫 번째 항목을 버리는 데 사용했습니다 N. N항목 수는 어디에 있습니까?

이전 루프를 모두 수집했지만 이는 물론 각 루프가 전체 파일을 효과적으로 파악하지 못한다는 것을 의미합니다. 나는 유닉스에 대해 상대적으로 순진하지만 이를 수행하는 더 효율적인 방법이 있다고 생각합니까? tail마지막 구문 분석 이후 얼마나 많은 새 줄이 작성되었는지 모르기 때문에 그것이 작동하지 않을 것이라고 생각합니다 .이 게시물건너뛰기에 대해 이야기하지만 검색 문자열을 사용하여 건너뛸 행 수를 결정하는 반면 건너뛰기 번호를 매개변수로 제공하고 싶습니다.이것각 줄에서 지정된 수의 문자를 건너뛰는 것에 대해 이야기하지만 지정된 수의 줄을 건너뛰고 싶습니다.

어떤 제안이 있으십니까?

답변1

후손을 위해 공개된 Q를 작성하는 동안 알아냈습니다.

tail -n+N file | grep ...

여기서 N은 건너뛸 행 수에서 1을 뺀 값입니다.

답변2

sed초기 행 수를 건너뛰는 데 사용할 수 있습니다. 주문하다

sed '1,200d'

처음 200개 행은 삭제되고 다른 모든 행은 변경되지 않은 상태로 유지됩니다.

이번에도 awk비슷한 방식으로 사용할 수 있습니다.

awk 'FNR > 200'

위 명령은 201행과 다음 행을 인쇄하지만 이전 행은 삭제합니다. 이 FNR변수는 현재 파일에서 읽은 레코드 수입니다(기본값은 행 수).

쉽게 매개변수화하여 명령줄에서 숫자를 가져올 수 있습니다.

awk -v n=200 'FNR > n'

다음과 결합 할 수도 있습니다 grep(다음으로 대체되는 함수).grepawk

awk -v n=200 'FNR > n && /pattern/' somefile

... pattern확장된 정규 표현식이 있는 곳입니다.

또는 명령줄의 값에서 패턴을 가져오려면 다음을 수행하세요.

awk -v n=200 -v p='pattern' 'FNR > n && $0 ~ p'

또는 더 안전하게 환경 변수를 사용하세요.

pattern='pattern' awk -v n=200 'FNR > n && $0 ~ ENVIRON["pattern"]' somefile

관련 정보