En bash $0contiene el nombre del script, pero en awk si hago un script llamado myscript.awk con el siguiente contenido:
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
y ejecutarlo, solo imprimirá "awk". Además, ARGV [i] con i> 0 se usa solo para argumentos de script en la línea de comandos. Entonces, ¿cómo hacer que imprima el nombre del script, en este caso "myscript.awk"?

mawkes predeterminado en Ubuntu? En mi VM 15.04, el valor predeterminadoawkesgawk. Mientras mawk está instalado, no es el predeterminado.awk -f myscript.awk. Sin embargo, esto no está relacionado con el problema en cuestión.awkscript porque comienza con#!/usr/bin/awk -f. Los scripts de shell comienzan con#!/bin/sh(o algo similar).awk -f file.Respuestas:
Con GNU awk 4.1.3 en bash en cygwin:
No sé cuán portátil es eso. Sin embargo, como siempre, no ejecutaría un script awk usando un shebang en un script de shell, ya que simplemente le roba posibles funcionalidades. Manténgalo simple y simplemente haga esto en su lugar:
Eso último funcionará con cualquier awk moderno en cualquier shell en cualquier plataforma.
fuente
ENVIRON["_"]funciona perfectamente y no llama a ningún programa externo. La segunda opciónawk -v ...depende de cómo se ejecuta el script; No quiero estotst.shes engañoso. Es unawkscript, no un script de shell.BEGINNo es un comando de shell válido.ENVIRON["_"]produce la ruta del script del shell de llamada cuando se imprime desde cada awk llamado a través de un shebang desde cada shell"? Nunca llamaría un guión awk de un shebang a mí personalmente no me importa la respuesta, pero pensé en mencionarla ... Oh, veo en los comentarios anteriores que @cuonglm respondió que solo es compatible con algunos shells .*12345*/tmp/test.awk.ARGV[0]siempre es confiableawken dash, bash, zsh y ksh93.No creo que esto sea posible según la
gawkdocumentación :En
linuxpuede intentar usar una especie de truco sucio y, como lo señalaron los comentarios de Stéphane Chazelas , es posible si la implementación deawkNUL admite bytes:fuente
gawky falla (como su descripción) conmawk. ¡Interesante!awk- 4.0.2. En freebsd con/proc/curpoc/cmdline, y elawkresultado es como el tuyo pero funciona congawk.awk -vNAME="myscript.awk" ./myscript.awky luego imprimir NAME dentro del script. No es una solucion.No conozco ninguna forma directa de obtener el nombre del comando desde awk. Sin embargo, puede encontrarlo a través de un sub-shell.
papar moscas
Con GNU awk y el
pscomando, puede usar la ID del procesoPROCINFO["PID"]para recuperar el nombre del comando como solución alternativa. Por ejemplo:cmdname.awk
mawk y nawk
Puede usar el mismo enfoque, pero derivar
awkel PID de la$PPIDvariable de shell especial (PID del padre):cmdname.awk
Pruebas
Ejecute el script así:
Salida en ambos casos:
fuente
gawk, es unagawksolución en lugar de unaawksolución. Creo que @cipper debería agregar su deseo "una solución portátil" a la pregunta.awk -vNAME="myscript.awk" ./myscript.awky luego imprimir NAME dentro del script. No es una solucion.Con POSIX
awk:Luego:
fuente
awk -vNAME="myscript.awk" ./myscript.awky luego imprimir la variableNAMEdentro del script. No es una solucion.mawk. Y también usarENVIRONno es lo mismo que usar-vNAME="myscript.awk", ya que cuándomawkexpandirá la secuencia de escapeNAME.Usando GNU awk
Consultando la guía del usuario de GNU awk - 7.5.2 Variables incorporadas que transmiten información con la que me topé:
Esto significa que puede conocer el PID del programa durante el tiempo de ejecución. Entonces, es cuestión de usar
system()para buscar el proceso con este PID dado:Yo uso
ps -ef, que muestra el PID en la segunda columna. Suponiendo que la ejecución se realizaawk -f <script>y no hay otros parámetros, podemos suponer que el último campo de la línea contiene la información que queremos.En caso de que tuviéramos algunos parámetros, tendríamos que analizar la línea de manera diferente o, mejor, usar algunas de las opciones
pspara imprimir solo las columnas que nos interesan.Prueba
Tenga en cuenta también que otro capítulo de la guía del usuario de GNU awk nos dice que ARGV no es el camino a seguir:
fuente
mawky no pude hacerlo funcionar, así que instalégawken mi Ubuntu y funcionó. Entonces, una solución alternativa puede sergawk: Dgawkno está instalado por defecto en Ubuntu (o al menos algunas versiones de Ubuntu, dondemawkes laawkimplementación predeterminada ). IIRC, tuve que instalarlo también en Debian.