
셸 변수를 전달하여 로그 파일에서 시간 범위를 추출하려고 합니다 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
노트:
FS="[: ];"
필드 구분 기호가 콜론 또는 공백 뒤에 세미콜론으로 설정되도록 합니다. 해당 조합은 입력 파일에서 발생하지 않습니다.원래 코드에서는 할당
d='$date_';
결과d
값이1979
. 왜냐하면 awk 코드에 도입하면 해당 표현식은2014-11-24
뺄셈이 필요한 수치 표현식으로 해석되기 때문입니다.옵션 을 사용하여 쉘 변수를 awk로 전송하는 것이 좋습니다
-v
. 쉘과 awk 모두 적절한 인용이 필요할 수 있으며-v
옵션을 사용하면 이러한 인용 문제를 한 번에 하나씩 처리할 수 있습니다.awk는 상황에 따라 숫자 또는 알파벳 비교를 수행할 수 있습니다.
+0
코드를 추가함으로써 awk가 수치 비교를 수행하고 있음을 보장합니다.