AWK를 사용하여 로그 파일에서 시간 범위 추출

AWK를 사용하여 로그 파일에서 시간 범위 추출

.log 파일에 셸 변수를 전달하여 로그 파일에서 시간 범위를 추출하려고 합니다 awk. 이것이 내 로그 파일의 모습입니다.

2014-11-24 12:58:59.290 1.1.1.1  etc..
2014-11-24 13:58:59.290 2.2.2.2  etc..
2014-11-24 14:58:59.290 3.3.3.3  etc ..
2014-11-24 12:58:59.290 4.4.4.4  etc.. 
2014-11-24 15:58:59.290 4.4.4.4  etc..

12시간에서 13시간 사이의 시간 범위를 추출하고 싶다고 가정해 보겠습니다. 이것은 제가 작성한 bash 스크립트입니다.

stime=12
etime=13
date_=2014-11-24

awk 'BEGIN {
          a='$stime';b='$etime';d='$date_'; FS="[: ]"
       }

      { 
  if ( $1 == d && $2 >= a && $2 < b )
      print $1 $2 $3
      }'  logfile.txt

내 출력은 다음과 같습니다.

 2014-11-24 12:58:59.290 1.1.1.1  etc..  
 2014-11-24 12:58:59.290 4.4.4.4  etc..  

출력이 표시되지 않으며 오류도 표시되지 않습니다. 나는 무엇이 잘못되었는지 모른다. 이에 대한 도움을 주시면 대단히 감사하겠습니다. 감사해요

답변1

stime=12
etime=13
date=2014-11-24

awk -v a="$stime" -v b="$etime" -v d="$date" -F "[: ]+" '
  { 
  if ( $1 == d && $2+0 >= a && $2+0 < b )
      print $1,$2,$3
  }'  logfile.txt

그러면 다음과 같은 출력이 생성됩니다.

2014-11-24 12 58
2014-11-24 12 58

노트:

  1. FS="[: ];"필드 구분 기호가 콜론이나 공백으로 설정되고 그 뒤에 세미콜론이 옵니다. 이 조합은 입력 파일에 나타나지 않습니다.

  2. 원래 코드에서는 할당 d='$date_';결과 d값이 1979. 이는 awk 코드에 도입되면 해당 표현식이 2014-11-24뺄셈이 필요한 숫자 표현식으로 해석되기 때문입니다.

  3. 옵션을 사용하여 쉘 변수를 awk로 전송하는 것은 좋은 습관입니다 -v. 쉘과 awk 모두 올바른 인용이 필요하며, 이 -v옵션을 사용하면 이러한 인용 문제를 한 번에 처리할 수 있습니다.

  4. awk는 상황에 따라 숫자 또는 문자 비교를 수행할 수 있습니다. 코드를 추가하여 +0awk가 숫자 비교를 수행하는지 확인합니다.

관련 정보