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 выполняет числовое сравнение.
В вашем сценарии,
cd /$UBCS
if [ -f /$UBM/CSUSER.LOCKED -o -f /$UBM/CSUSER.START]
-o f /$UBM/CSUSER.UPDATE ];
then
exit;
fi
есть синтаксическая ошибка. Вы несбалансировали [...]
в операторе if. Вам также понадобится пробел между / $ UBM / CSUSER.START
и следующим ]
.
#!/bin/sh
cd "/$UBCS" || exit 1
if [ -f "/$UBM/CSUSER.LOCKED" ] ||
[ -f "/$UBM/CSUSER.START" ] ||
[ -f "/$UBM/CSUSER.UPDATE" ]
then
exit
fi
Попробуйте вставить свои сценарии в ShellCheck: https://www.shellcheck.net/
Кроме того, вы не получите ошибок компиляции для сценариев оболочки (поскольку они не составлено). Это ошибки синтаксического анализа .