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