Aquí está mi script (para encontrar los archivos que contienen un patrón específico):
find . -type f \
-exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c>0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;
Me gustaría usar mi script con un argumento §:
MyScript.sh pattern
Mi problema es que no logro poner la $1variable awk.
Cuando intento depurar mi script
bash -x MyScript.sh pattern
Aquí está la salida:
+ find . -type f -exec awk -v vawk=pattern '// {c++} c>0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'
La $vawkvariable parece estar vacía.
¿Alguna idea?

awkexpande las secuencias de escape tipo C$1, por lo que ese enfoque no funciona si$1puede contener caracteres de barra invertida (común para expresiones regulares). Puede utilizar laENVIRONmatriz especial awk en su lugar.Reproducido de esto ahora cerrado como una pregunta duplicada , ya que incluye advertencias sobre las limitaciones del paso de variable awk que uno podría encontrar útil.
Una variable de shell es solo eso: una variable de shell . Si desea convertirlo en una variable awk , necesita una sintaxis como:
o
Sin embargo, esos sufren un problema: las secuencias de escape se expanden en ellos (y con GNU
awk4.2 o superior, si$xcomienza@/y termina en/, se trata como un tipo de variable regexp ).Así, por ejemplo, si la variable de shell contiene los dos caracteres de barra invertida y n , la variable awk terminarán que contiene la nueva línea de caracteres (y con gawk 4.2+, si contiene
@/foo/, la variable awk contendráfooy ser de tiporegexp).Otro enfoque (pero que
-vrequiere un POSIX awk o nawk (a diferencia del awk de 1970 que todavía se encuentra como/bin/awken Solaris)) es utilizar variables de entorno:Otro enfoque (todavía con awks más nuevos) es usar la matriz ARGV en awk:
fuente