En bash $0
contiene 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"?
mawk
es predeterminado en Ubuntu? En mi VM 15.04, el valor predeterminadoawk
esgawk
. Mientras mawk está instalado, no es el predeterminado.awk -f myscript.awk
. Sin embargo, esto no está relacionado con el problema en cuestión.awk
script 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.sh
es engañoso. Es unawk
script, no un script de shell.BEGIN
No 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 confiableawk
en dash, bash, zsh y ksh93.No creo que esto sea posible según la
gawk
documentación :En
linux
puede intentar usar una especie de truco sucio y, como lo señalaron los comentarios de Stéphane Chazelas , es posible si la implementación deawk
NUL admite bytes:fuente
gawk
y falla (como su descripción) conmawk
. ¡Interesante!awk
- 4.0.2. En freebsd con/proc/curpoc/cmdline
, y elawk
resultado es como el tuyo pero funciona congawk
.awk -vNAME="myscript.awk" ./myscript.awk
y 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
ps
comando, 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
awk
el PID de la$PPID
variable de shell especial (PID del padre):cmdname.awk
Pruebas
Ejecute el script así:
Salida en ambos casos:
fuente
gawk
, es unagawk
solución en lugar de unaawk
solución. Creo que @cipper debería agregar su deseo "una solución portátil" a la pregunta.awk -vNAME="myscript.awk" ./myscript.awk
y luego imprimir NAME dentro del script. No es una solucion.Con POSIX
awk
:Luego:
fuente
awk -vNAME="myscript.awk" ./myscript.awk
y luego imprimir la variableNAME
dentro del script. No es una solucion.mawk
. Y también usarENVIRON
no es lo mismo que usar-vNAME="myscript.awk"
, ya que cuándomawk
expandirá 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
ps
para 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
mawk
y no pude hacerlo funcionar, así que instalégawk
en mi Ubuntu y funcionó. Entonces, una solución alternativa puede sergawk
: Dgawk
no está instalado por defecto en Ubuntu (o al menos algunas versiones de Ubuntu, dondemawk
es laawk
implementación predeterminada ). IIRC, tuve que instalarlo también en Debian.