Este es el comando runawk que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.
PROGRAMA:
NOMBRE
runawk - envoltorio para intérprete AWK
SINOPSIS
correr [opciones] Archivo de programa
correr -e programa
MOTIVACIÓN
Después de años de usar AWK para la programación, descubrí que a pesar de su simplicidad y
limitaciones AWK es lo suficientemente bueno para crear secuencias de comandos para una amplia gama de tareas diferentes. AWK no es
tan poderoso como sus contrapartes más grandes como Perl, Ruby, TCL y otros, pero tiene su
propias ventajas como la compacidad, la simplicidad y la disponibilidad en casi todos los similares a UNIX
sistemas. Personalmente, también me gusta su naturaleza basada en datos y su orientación de token, muy útil
técnicas para las utilidades de procesamiento de texto.
Desafortunadamente, los intérpretes de awk carecen de algunas características importantes y, a veces, no funcionan como
tan bien como pudieron hacer.
Problemas que veo (algunos de ellos, por supuesto)
1.
AWK carece de soporte para módulos. Incluso si creo programas pequeños, a menudo quiero usar
funciones creadas anteriormente y ya utilizadas en otros scripts. Es decir, sería genial
organizar funciones en las llamadas bibliotecas (módulos).
2.
Para pasar argumentos a "#!/ usr / bin / awk -f "script (no para intérprete awk), es
necesario anteponer una lista de argumentos con - (dos signos menos). En mi opinión, esto
se ve mal. Además, tal comportamiento viola las "Pautas de sintaxis de utilidades" POSIX / SUS.
Ejemplo:
awk_programa:
#!/ usr / bin / awk -f
EMPEZAR {
para (i = 1; i <ARGC; ++ i) {
printf "ARGV [% d] =% s \ n", i, ARGV [i]
}
}
Sesión de shell:
% awk_programa --opt1 --opt2
/ usr / bin / awk: opción desconocida --opt1 ignorado
/ usr / bin / awk: opción desconocida --opt2 ignorado
% awk_program - --opt1 --opt2
ARGV [1] = - opt1
ARGV [2] = - opt2
%
en mi opinión awk_programa el script debería funcionar así
% awk_programa --opt1 --opt2
ARGV [1] = - opt1
ARGV [2] = - opt2
%
3.
Cuando "#!/ usr / bin / awk -f "el script maneja argumentos (opciones) y quiere leer desde
stdin, es necesario agregar / dev / stdin (o `- ') como último argumento explícitamente.
Ejemplo:
awk_programa:
#!/ usr / bin / awk -f
EMPEZAR {
if (ARGV [1] == "--flag") {
bandera = 1
ARGV [1] = "" # para no leer el archivo llamado "--flag"
}
}
{
imprimir "bandera =" bandera "$ 0 =" $ 0
}
Sesión de shell:
% prueba de eco | awk_program - --flag
% prueba de eco | awk_program - --flag / dev / stdin
bandera = 1 $ 0 = prueba
%
Normalmente awk_programa debería funcionar así
% prueba de eco | awk_program --bandera
bandera = 1 $ 0 = prueba
%
4.
joder(1) que se envía con GNU awk no se puede utilizar en shebang. En la mayoría (¿todos?)
Scripts de UNIX que comienzan con
#! / usr / local / bin / igawk -f
no trabajará.
correr fue creado para resolver todos estos problemas
OPCIONES
-d Active un modo de depuración.
-e programa
Especifique el programa. Si -e no se especifica, el código AWK se lee desde Archivo de programa.
-f módulo_awk
Activar módulo_awk. Esto funciona de la misma manera que
#use "awk_module.awk"
directiva en el código. Múltiple -f se permiten opciones.
-F fs Establezca el separador de campo de entrada FS en la expresión regular fs.
-h Muestra información de ayuda.
-t Si se aplica esta opción, un directorio temporal es creado por correr y camino hacia ella
se pasa a awk proceso hijo. El directorio temporal se crea en
$ {RUNAWK_TMPDIR} (si está configurado), o $ {TMPDIR} (si está configurado) o / Tmp directorio
de lo contrario. Si #utilizar "tmpfile.awk" se detecta en un programa esta opción está activada
automáticamente.
-T Establezca FS en el carácter TAB. Esto es equivalente a -Pie'
-V Muestra información sobre la versión.
-v var=val
Asignar el valor val a la variable var antes de que comience la ejecución del programa.
DETALLES / INTERNOS
Standalone guión
En sistemas operativos similares a UNIX puede utilizar correr comenzando su guión con
#! / usr / local / bin / runawk
línea o algo como esto en lugar de
#!/ usr / bin / awk -f
o similar.
AWK módulos
Para activar los módulos, debe agregarlos en un script awk como este
#use "module1.awk"
#use "module2.awk"
esa es la línea que especifica el nombre del módulo y es tratada como una línea de comentario por AWK normal
intérprete pero es procesado por correr especialmente.
A menos que corras correr con opcion -e, #utilizar debe comenzar con la columna 0, es decir, sin espacios ni
Los símbolos de pestañas están permitidos antes y no se permiten símbolos entre # y use.
También tenga en cuenta que los módulos AWK también pueden "usar" otros módulos y así sucesivamente. Todos ellos son
recopilados en un orden de profundidad y cada uno se agrega a la lista de intérpretes de awk
argumentos precedidos de la opción -f. Es decir #utilizar la directiva es * NO * similar a #incluir
en el lenguaje de programación C, el código del módulo de runawk no se inserta en el lugar de #utilizar.
Los módulos de Runawk están más cerca del comando "usar" de Perl. En caso de que se mencione algún módulo
más de una vez, solo se agregará una -f, es decir, se eliminarán las duplicaciones
automáticamente.
Posición de #utilizar la directiva en un archivo fuente sí importa, es decir, el módulo anterior es
mencionado, se generará la -f anterior.
Ejemplo:
prog de archivo:
#! / usr / local / bin / runawk
#use "A.awk"
#use "B.awk"
#use "E.awk"
Código PROG
...
archivo B.awk:
#use "A.awk"
#use "C.awk"
Código B
...
archivo C.awk:
#use "A.awk"
#use "D.awk"
Código C
...
A.awk y D.awk no contienen la directiva #use
Si tu corres
runawk prog archivo1 archivo2
or
/ ruta / a / prog file1 file2
el siguiente comando
awk -f A.awk -f D.awk -f C.awk -f B.awk -f E.awk -f prog - archivo1 archivo2
realmente se ejecutará.
Puede comprobar esto ejecutando
runawk -d prog archivo1 archivo2
Módulo Buscar estrategia
Los módulos se buscan primero en un directorio donde el programa principal (o módulo en el que #use
se especifica la directiva). Si no se encuentra allí, entonces el entorno AWKPATH
la variable está marcada. AWKPATH mantiene una lista de directorios de búsqueda separados por dos puntos. Finalmente,
El módulo se busca en el directorio de módulos del sistema runawk, por defecto PREFIX / share / runawk pero
esto se puede cambiar en tiempo de compilación.
También se puede especificar una ruta absoluta al módulo.
Programa as an argumento
Como otros intérpretes correr puede obtener el script desde una línea de comando como esta
/ ruta / a / runawk -e '
#use "alt_assert.awk"
{
afirmar ($ 1> = 0 && $ 1 <= 10, "Valor incorrecto:" $ 1)
# su código a continuación
...
}'
correr también se puede utilizar para escribir en delineadores
runawk -f abs.awk -e 'BEGIN {print abs (-1)}'
Seleccionar a preferido AWK Interprete
Por alguna razón, es posible que prefiera un intérprete AWK u otro. La razón puede ser
eficiencia para una tarea en particular, extensiones útiles pero no estándar o cualquier otra cosa. Para
tell correr qué intérprete AWK usar, se puede usar #interp. Directivas
prog de archivo:
#! / usr / local / bin / runawk
#use "A.awk"
#use "B.awk"
#interp "/ usr / pkg / bin / nbawk"
# tu código aquí
...
Tenga en cuenta que #interp. La directiva también debe comenzar con la columna 0, no se permiten espacios antes
eso y entre # y interpretar.
A veces también tiene sentido brindar a los usuarios la posibilidad de seleccionar su AWK preferido
intérprete sin cambiar el código fuente. En correr es posible usar especial
Directivas # interp-var que establece un nombre de variable de entorno asignable por el usuario que
especifica un intérprete AWK. Por ejemplo, el siguiente script
archivo foobar:
#!/ usr / bin / env correr
# interp-var "FOOBAR_AWK"
EMPEZAR {
imprimir "Esta es una aplicación FooBar"
}
se puede ejecutar como
env FOOBAR_AWK = mawk foobar
o solo
Foobar
En el primer caso maullar se utilizará como intérprete AWK, en este último, el AWK predeterminado
Interprete.
Gracias a existente módulos only
En el mundo UNIX, es una práctica común escribir archivos de configuración en un lenguaje de programación.
de la aplicación. Es decir, si la aplicación está escrita en Bourne shell, la configuración
Los archivos para dicha aplicación a menudo también se escriben en Bourne. Usando RunAWK uno puede hacer
lo mismo para las aplicaciones escritas en AWK. Por ejemplo, el siguiente código usará
~ / .foobarrc archivo si existe; de lo contrario, se usará /etc/foobar.conf si existe.
archivo foobar:
#!/ usr / bin / env correr
# uso seguro "~ / .foobarrc"" /etc/foobar.conf "
EMPEZAR {
imprimir foo, bar, baz
}
presentar ~ / .foobarrc:
EMPEZAR {
foo = "foo10"
bar = "bar20"
baz = 123
}
Por supuesto, # uso seguro La directiva también se puede utilizar para otros fines. # uso seguro
La directiva acepta tantos módulos como desee, pero como máximo se puede incluir uno usando awk
opción -f, otras se ignoran en silencio, también tenga en cuenta que los módulos se analizan de izquierda a
Derecha. La tilde inicial en el nombre del módulo se reemplaza con el directorio de inicio del usuario. Otro
ejemplo:
archivo foobar:
#!/ usr / bin / env correr
#use "/usr/share/foobar/default.conf"
# uso seguro "~ / .foobarrc"" /etc/foobar.conf "
tu codigo esta aqui
Aquí, la configuración predeterminada se establece en /usr/share/foobar/default.conf, y la configuración
Los archivos (si los hay) se utilizan para anularlos.
Fijar entorno
En algunos casos, es posible que desee ejecutar el intérprete AWK con un entorno específico. Para
Por ejemplo, su secuencia de comandos puede estar orientada a procesar solo texto ASCII. En este caso puedes ejecutar
AWK con el entorno LC_CTYPE = C y usa rangos de expresiones regulares.
correr proporciona un #entorno directiva para esto. La cadena entre comillas dobles se pasa a
putenv(3) función libc.
Ejemplo:
prog de archivo:
#! / usr / local / bin / runawk
#env "LC_ALL = C"
$ 1 ~ / ^ [AZ] + $ / {# AZ es válido si LC_CTYPE = C
imprimir $ 1
}
SALIR ESTADO
Si el intérprete AWK sale normalmente, correr sale con su estado de salida. Si intérprete AWK
fue asesinado por señal, correr salidas con estado de salida 128 + señal.
MEDIO AMBIENTE
AWKPATH
Lista de directorios separados por dos puntos donde awk se buscan módulos.
RUNAWK_AWKPROG
Establece la ruta al intérprete AWK, utilizado de forma predeterminada, es decir, esta variable anula
el valor predeterminado en tiempo de compilación. Tenga en cuenta que la directiva #interp anula esto.
RUNAWK_KEEPTMP
Si se establece, los archivos temporales no se eliminan.
Utilice runawk en línea utilizando los servicios de onworks.net