내 입력은 다음과 같습니다 -
[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