일치하는 두 패턴 사이의 줄 수가 필요합니다.

일치하는 두 패턴 사이의 줄 수가 필요합니다.

내 입력은 다음과 같습니다 -

[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 500 - 7
[11/Jul/2016:13:41:48 +0000] "POST --" 200 - 7
[11/Jul/2016:13:41:49 +0000] "POST --" 500 - 7
[11/Jul/2016:13:42:12 +0000] "POST --" 500 - 7

13:40에서 13:41 사이의 줄 수를 입력하고 싶습니다. 이 경우 개수는 6입니다.

나는 다음 옵션을 시도했다

echo sed -n '/^START_TIME/,/^END_TIME/ p' somelogfile.log | wc -l

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l

하지만 나는 항상 1을 얻습니다.

누군가 이것을 확인하고 여기서 무엇이 잘못되었는지 알려줄 수 있습니까?

답변1

echo하나의 행만 생성되고 계산 됩니다 wc.

종료 타임스탬프가 존재하지 않으며 13:41:43사용된 앵커( ^및 ) $가 너무 제한적입니다.

echo다음을 제거 하고 시도해 보세요.

sed -n '/13:40:43/,/13:41:49/p' somelogfile.log | wc -l

답변2

연대순이 어휘 순서와 동일한 경우 다음을 수행할 수 있습니다.

awk '$0>="[11/Jul/2016:13:40:00" && $0<="[11/Jul/2016:13:41:59"' file | wc -l

그러면 값이 첫 번째 날짜보다 크거나 같고 두 번째 날짜보다 작거나 같은지 확인합니다. awk명령이 주어지지 않으면 해당 awk행만 인쇄됩니다.

답변3

이 명령을 검토해 보겠습니다.

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
  • echo파이프를 통해 무엇이 수행되고 무엇이 진행되는지 생각해 보세요 wc(단지 없이 시도해보세요 wc). 이것은 당신이 항상 하나를 얻는 이유를 설명합니다 1.

  • 작성한 정규식은 줄의 시작 ^과 끝 부분 에 고정되어 있지만 $물론 해당 타임스탬프만 줄에 있는 것은 아니므로 앵커를 제거해야 합니다.

  • 종료 조건은 예제에 존재하지 않는 타임스탬프를 찾으므로 일치 범위가 끝나지 않고 첫 번째 일치부터 시작하여 모든 것을 인쇄합니다.

이와 같은 것이 원하는 것을 할 수 있습니다 ( 3현재 질문에 표시된 입력 파일을 사용하여 출력)

sed -ne '/13:40:47/,/13:41:48/p' somelogfile.log | wc -l

관련 정보