Aqui está o meu script (para encontrar os arquivos que contêm um padrão especificado):
find . -type f \
-exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;
Eu gostaria de usar meu script com um argumento §:
MyScript.sh pattern
Meu problema é que eu não conseguem colocar a $1
variável awk
.
Quando tento depurar meu script
bash -x MyScript.sh pattern
Aqui está a saída:
+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
A $vawk
variável parece estar vazia.
Qualquer ideia?
awk
expande as seqüências de escape do tipo C$1
para que a abordagem não funcione se$1
puder conter caracteres de barra invertida (comum para regexps). Você pode usar aENVIRON
matriz especial awk.Reproduzido a partir disso, agora encerrado como pergunta duplicada , pois inclui avisos sobre as limitações da passagem de variável do awk que podem ser úteis.
Uma variável shell é apenas isso: uma variável shell . Se você quiser transformá-lo em uma variável awk , precisará de uma sintaxe como:
ou
No entanto, eles sofrem de um problema: as seqüências de escape são expandidas nelas (e com o GNU
awk
4.2 ou superior, se$x
começa@/
e termina/
, é tratado como uma variável do tipo regexp ).Portanto, por exemplo, se a variável shell contiver os dois caracteres barra in e n , a variável awk acabará contendo o caractere de nova linha (e com gawk 4.2+, se contiver
@/foo/
, a variável awk conteráfoo
e será do tiporegexp
).Outra abordagem (mas que like for
-v
requer um POSIX awk ou nawk (em oposição ao awk dos anos 70 ainda encontrado/bin/awk
no Solaris)) é usar variáveis de ambiente:Outra abordagem (ainda com awks mais recentes) é usar a matriz ARGV no awk:
fonte