Pasar opciones al script AWK sin pasar por AWK

Pasar opciones al script AWK sin pasar por AWK

¿Puedo pasar argumentos que sean opciones de AWK directamente a un script AWK puro?

Guión de ejemplo:

#!/usr/bin/env -S awk -f
BEGIN { if (ARGV[1] == "-h") print "whoop" }

Quiero ./myscript -himprimir gritos. Pero AWK obtiene -h primero e imprime su uso.

Correr ./myscript -- -hfunciona, pero no puedo trabajar en el shebang debido a -f.

Sé que podría usar un script de shell con AWK en su lugar.

Respuesta1

Por el bien del desafío, se podría hacer con FreeBSD.envo con GNUambiente>= 8,30 (ya asumido por el OP) en un tinglado:

#! /usr/bin/env -S sh -c 'exec awk -f "$0" -- "$@"'
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }
./myscript -h 1 2 3
-h
1
2
3

Sin embargo, eso no significa que sea una buena idea.

En su lugar, podrías probar esto:

#! /bin/sh
BEGIN { 2>"/dev/null"
        exec awk -f "$0" "--" "$@"
}
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }

Esto supone que no tienes un BEGINcomando en tu archivo PATH.

Respuesta2

Si tienes GNU awkpuedes usar esto.

#!/usr/bin/gawk --exec
BEGIN { print "==>",ARGV[1],"<==" }

Uso de muestra

./a -h
 ==> -h <==

No lo he probado, pero la mawkvariante parece usar -W execen lugar de --exec. GNU gawkafirma que también admite esto, pero no funciona con #!.

información relacionada