Использование grep с шаблоном, содержащим расширяемую переменную

Есть часы , циклы с сна , crontab и многие другие варианты:

watch -n 60 echo hello world


while :; do echo hello world; sleep 60; done


crontab -e #...
3
19.04.2016, 18:09
3 ответа
export myvar
awk 'substr($0, 42) == ENVIRON["myvar"]' < "$filelist"
4
27.01.2020, 21:08

Perl спешит на помощь!

perl -ne 'BEGIN { $search = shift }
          print if /^.{41}\Q$search\E$/;
         ' -- "$myvar" "$filelist"
  • -n читает файл построчно.
  • Блок BEGIN извлекает $ myvar из первого аргумента в Perl-переменную $ search.
  • \ Q ... \ E цитирует внутреннюю часть (см. quotemeta ). Это обрабатывает все специальные символы, которые может содержать переменная. Не забудьте заключить переменные оболочки в двойные кавычки!
6
27.01.2020, 21:08

Это другой способ; он сначала устанавливает '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 вернет пустое/нулевое значение).

3
27.01.2020, 21:08

Теги

Похожие вопросы