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

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

셸 변수를 전달하여 로그 파일에서 시간 범위를 추출하려고 합니다 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는 상황에 따라 숫자 또는 알파벳 비교를 수행할 수 있습니다. +0코드를 추가함으로써 awk가 수치 비교를 수행하고 있음을 보장합니다.

관련 정보