
Я пытаюсь извлечь временной диапазон из файла журнала, передавая переменные оболочки в 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 выполняет числовое сравнение.