로그 파일에서 두 타임스탬프 사이의 모든 항목을 선택하세요.

로그 파일에서 두 타임스탬프 사이의 모든 항목을 선택하세요.
awk '/10:..:/, /13:..:/' server.log > /tmp/awktmp

누군가가 나에게 준 명령을 시도해 보았습니다. 오전 10시부터 오후 13시 사이에 로그를 찾는 것이 효과적이지만 완전히 이해하지는 못합니다.

우아한 해결책이 있다면 알려주세요. 원격 서버는 규모가 작고 고급 유틸리티가 없다는 점을 염두에 두십시오.

여기서 내가 이해하지 못하는 것은'/10:..:/, /13:..:/'

  • 나는 10:..그것이 두 자리 숫자를 의미 10하고 :정확히 일치한다는 것을 이해합니다.
  • 그런데 다른 하나는 무엇을 :의미합니까?

JavaScript 정규식에서처럼 슬래시가 정규식을 입력하는 데 사용되는 것 같습니다. 나는 이것에 대해 100% 확신하지 못합니다.

업데이트 1:

시간은 두 번째 열에 있고 형식은 다음과 같습니다.HH:MM:SS

업데이트 2:

sed -n -e '/8:..:../,/9:..:../p' application.log > /tmp/sedtmp

나는 이것을 시도했지만 이것은 또한 07:57:47.

업데이트 3

로그의 모든 줄에 항상 타임스탬프가 포함되는 것은 아닙니다. 일부 행에는 타임스탬프가 전혀 포함되어 있지 않습니다. 이 문제를 어떻게 극복하셨나요? 나는 어리석게 awk를 사용했고 시간 가치가 없는 모든 줄을 놓쳤습니다. 이 문제를 피할 수 있는 방법이 있나요?

내 말은 그런 뜻이었어.

2023-08-07 09:20:35 0123456789 INFO  CustomerLogoutResource:95 - Entering logout api.
2023-08-07 09:20:35 0123456789 ERROR AppExceptionMapper:87 - Exception has been thrown by container
2023-08-07 09:20:35 0123456789 ERROR AppExceptionMapper:555 - Unchecked Exception
java.lang.NullPointerException
    at NullPointerExceptionExample.printLength(NullPointerExceptionExample.java:3)
    at NullPointerExceptionExample.main(NullPointerExceptionExample.java:8)

답변1

10:00에서 11:00 사이에 로그인이 없으면 이 메서드는 11:00to에 대한 행을 찾을 수 없으며, 13:00에서 14:00 사이에 로그인이 없으면 그 이후의 모든 행이 보고됩니다. 적어도 10~11개 사이에 하나).13:0014:00

이런 종류의 경우 시간과 범위를 어휘적으로 비교하는 것이 좋습니다.

예를 들어, 시간이 세 번째 필드에 있는 경우:

awk '$3 >= "10:00:00" && $3 < "13:00:00"'

대기열에서 시간이 어디에 있는지 모르는 경우 다음을 수행할 수 있습니다.

perl -lne 'print if /\b\d\d:\d\d:\d\d\b/ &&
                      $& ge "10:00:00" &&
                      $& lt "13:00:00"'

또는:

LC_ALL=C awk 'match($0, /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/) && \
                (t = substr($0, RSTART, 8)) >= "10:00:00" && \
                t < "13:00:00"'

해당 범위 내의 타임스탬프가 있는 보고서 행입니다. 타임스탬프가 지정된 행 사이에 타임스탬프가 지정되지 않은 행이 있고 이를 보고하려는 경우 beginning-condition, end-condition {action}질문의 방법을 사용할 수 있지만 다시 정규식 일치 대신 비교를 사용하거나 수동 상태 전환을 수행하여 상한을 계속 제외할 수 있습니다.

LC_ALL=C awk -v beg=10:00:00 -v end=13:00:00 '
  match($0, /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/) {
    t = substr($0, RSTART, 8)
    if (t >= end) selected = 0
    else if (t >= beg) selected = 1
  }
  selected'

답변2

이 패턴은 /10:..:/숫자 10, 두 개의 구분 기호 :및 그 사이의 두 문자와 일치합니다. 따라서 (입력 줄 내 어느 곳이든) 시간과 일치합니다. 예: 10:35:22. 그러나 포함된 행과도 일치하므로 This10:ZZ:Camels그다지 좋은 테스트는 아닙니다.

더 나은 패턴은 /10:[0-5][0-9]:[0-5][0-9]/분과 초가 00-59 범위에 있는지 확인하는 것입니다. 그러나 시간이 특정 필드에 있는지, 해당 시간에 공백이 있는지 또는 레코드 시작 부분 근처에 공백이 있는지 확인하는 것도 도움이 될 수 있습니다. 필요한 것이 무엇인지 더 잘 이해할 수 있도록 몇 가지 샘플 입력 줄을 게시할 수 있습니까?

두 패턴을 쉼표로 구분하면 첫 번째 패턴이 감지되면 일치가 "켜지고" 두 번째 패턴이 감지되면 일치가 "꺼집니다". 날짜가 전혀 포함되어 있지 않더라도 해당 이벤트 사이의 모든 행과 일치합니다.

/1[0-2]:[0-5][0-9]:[0-5][0-9]/이는 순서에 상관없이 10:00:00에서 12:59:59 사이의 개별 줄만 일치시키는 단일 패턴과는 매우 다릅니다 .

답변3

awk 모드:

/regA/,/regB/

regA와 일치하는 첫 번째 줄부터 regB와 일치하는 첫 번째 줄까지 True입니다. 평소와 같이, 어떤 것이 표현식과 일치할 때: 일치할 때 수행할 작업을 정확히 지정하는 표현식 뒤에 아무것도 없는 경우 { actions }기본 동작은 표현식이 참인 행을 인쇄하는 것입니다.

이제 그들은 다음을 선택합니다:

/10:..:/, /13:..:/

hh:10:ss가 아니라 10:mm:ss와 일치하는지 확인하세요. (그들은 시간 참조가 hh:mm:ss 이고 시간 앞에 ":"가 없다고 가정하여 이 작업을 수행합니다... 이것은 사용된 날짜 형식에 따라 항상 정확하지는 않습니다. 주석에서 말했듯이 일치할 수 있습니다. 다른 것들도요.

줄의 시작이 항상 다음과 같다는 것을 알고 있다면:

YYYY-MM-DDThh:mm:ss+hh:mm 
# For exemple:
# 2023-07-17T11:14:02+02:00 , which is following internationnal recommendations
# of displaying date and time (and timezone)

다음과 같이 더 밀접하게 일치시킬 수 있습니다.

/^2023-07-17T10:/,/^2023-07-17T13:/

그리고 줄의 시작 부분(^)에서만 일치하는지 확인하고, 나타날 수 있는 줄의 어느 부분에서도 일치하지 않도록 하세요.

답변4

로그 파일의 두 타임스탬프 사이에서 로그를 선택하는 가능한 솔루션은 다음과 같습니다. 이 스크립트는 로그 파일에 공백으로 구분된 열이 있고 두 번째 열에 형식의 타임스탬프가 포함되어 있다고 가정합니다 HH:MM:SS.아마도 가장 우아하지는 않지만 적어도 분명합니다.

awk -F" " '$2 >= "09:00:00" && $2 <= "12:00:00"' server.log
  • -F" "필드 구분 기호를 공백 문자로 설정합니다.
  • $2입력 파일의 각 줄에 있는 두 번째 필드를 나타냅니다(이 경우 필드는 공백으로 구분됩니다).
  • >= "09:00:00"두 번째 필드의 값이 "09:00:00"보다 크거나 같은지 확인합니다.
  • &&조건을 결합하는 논리 연산자입니다. "그리고"라는 뜻
  • $2 <= "12:00:00"두 번째 필드의 값이 "12:00:00"보다 작거나 같은지 확인합니다.
  • sever.log입력 파일입니다

솔루션 검증

server.log다음과 같은 내용은 다음과 같습니다 .

2023-07-18 08:55:32 - Log entry 1
2023-07-18 09:10:15 - Log entry 2
2023-07-18 10:30:47 - Log entry 3
2023-07-18 11:45:02 - Log entry 4
2023-07-18 12:05:21 - Log entry 5
2023-07-18 13:20:33 - Log entry 6

산출:

[get@me test]$ awk -F" " '$2 >= "09:00:00" && $2 <= "12:00:00"' server.log
2023-07-18 09:10:15 - Log entry 2
2023-07-18 10:30:47 - Log entry 3
2023-07-18 11:45:02 - Log entry 4

관련 정보