Есть часы
, циклы с сна
, crontab
и многие другие варианты:
watch -n 60 echo hello world
while :; do echo hello world; sleep 60; done
crontab -e #...
export myvar
awk 'substr($0, 42) == ENVIRON["myvar"]' < "$filelist"
Perl спешит на помощь!
perl -ne 'BEGIN { $search = shift }
print if /^.{41}\Q$search\E$/;
' -- "$myvar" "$filelist"
-n
читает файл построчно. \ Q ... \ E
цитирует внутреннюю часть (см. quotemeta ). Это обрабатывает все специальные символы, которые может содержать переменная. Не забудьте заключить переменные оболочки в двойные кавычки! Это другой способ; он сначала устанавливает 'line' пустым, и устанавливает его, если обнаруживает, что 'myvar' совпадает с 3 полями в конце.
line=
while IFS=' ' read -r hex int1 int2 rest
do
if [[ "$myvar" = "$int1 $int2 $rest" ]]
then
line="$hex $int1 $int2 $rest"
fi
done < filelist
Вот еще один способ, использующий встроенную функцию bash mapfile
и второй временный ассоциативный массив:
mapfile -t < filelist # sets MAPFILE array
declare -A temparray
shopt -s extglob
for val in "${MAPFILE[@]}"
do
short="${val##*([^ ]) }"
temparray[$short]="$val"
done
line=${m[$myvar]}
unset -v MAPFILE temparray val short
Это приводит файл в индексированный массив MAPFILE, который мы затем перебираем в цикле. Цикл устанавливает переменную "short" в "суффиксную" часть строки - он вычеркивает ведущие значения, которые соответствуют шаблону "ноль или более непробелов, за которыми следует пробел", затем устанавливает значение ассоциативного массива для "$short" как для всей строки ("$val"). Для выполнения такого рода поиска с *
требуется shopt -s extglob
. Затем мы устанавливаем строку как результирующее значение (или, если это значение не существует в массиве, bash вернет пустое/нулевое значение).