Вот мой скрипт (чтобы найти файлы, которые содержат указанный шаблон):
find . -type f \
-exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;
Я хотел бы использовать мой сценарий с аргументом §:
MyScript.sh pattern
Моя проблема в том, что мне не удается поместить $1
переменную в awk
.
Когда я пытаюсь отладить свой скрипт
bash -x MyScript.sh pattern
Вот вывод:
+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
$vawk
Переменная кажется пустым.
Есть идеи?
awk
расширяются C-подобные escape-последовательности$1
, поэтому этот подход не работает, если он$1
может содержать символы обратной косой черты (общие для регулярных выражений).ENVIRON
Вместо этого вы можете использовать специальный массив awk.Воспроизведенный из этого теперь закрытого как повторяющегося вопроса, поскольку он содержит предупреждения об ограничениях передачи переменных awk, которые могут оказаться полезными.
Переменная оболочки - это всего лишь переменная оболочки . Если вы хотите превратить его в переменную awk , вам нужен такой синтаксис:
или
Однако они страдают от проблемы: в них расширяются escape-последовательности (и в GNU
awk
4.2 или выше, если$x
начинается с@/
и заканчивается/
, это рассматривается как переменная типа regexp ).Так, например, если переменная оболочки содержит два символа обратной косой черты и n , переменная awk в конечном итоге будет содержать символ новой строки (и с gawk 4.2+, если она содержит
@/foo/
, переменная awk будет содержатьfoo
и иметь типregexp
).Другой подход (но для которого
-v
требуется awk или nawk POSIX (в отличие от awk 1970-х годов, все еще найденного как/bin/awk
в Solaris)) - это использование переменных среды:Другой подход (все еще с более новыми awk) заключается в использовании массива ARGV в awk:
источник