¿Todavía hay alguna razón para aprender AWK?

109

Aprendo constantemente nuevas herramientas, incluso antiguas, porque me gusta utilizar la solución adecuada para el problema.

Sin embargo, me pregunto si todavía hay alguna razón para aprender algunos de ellos. awkpor ejemplo, es interesante para mí, sino para el procesamiento de texto simple, puedo usar grep, cut, sed, etc, mientras que para los más complejos, voy a ir para Python.

Ahora bien, no quiero decir que no sea una herramienta poderosa y útil. Pero dado que se necesita tiempo y energía para aprender una nueva herramienta, ¿vale la pena ?

e-satis
fuente
2
es 2019 y acabo de reescribir un normalizador de registro de Python en awk. Ejecuté la transformación en una semana de archivos de registro que eran archivos de registro de 54 millones de líneas (~ 9 GB). En mi Macbook Pro (2.8 GHZ i7, 16 GB de RAM), la versión de Python podría procesar ~ 10k líneas por segundo => 90 minutos de tiempo de ejecución. Usando mawk, el tiempo de ejecución se redujo a 2 minutos. Por cierto, el programa awk tenía la mitad de tamaño.
confusión
@mistahenry ¿probaste pypy?
qwr

Respuestas:

97

Creo que depende del entorno en el que te encuentres. Si eres una persona * nix, saber awkes algo bueno. El único otro entorno de secuencias de comandos que se puede encontrar en prácticamente todos los * nix es sh. Entonces grep, aunque , sed,etc. , seguramente puede reemplazar awken una linuxdistribución convencional moderna , cuando se cambia a sistemas más exóticos, saber un poco awkserá realmente útil.

awktambién se puede utilizar para algo más que el procesamiento de texto. Por ejemplo, uno de mis supervisores escribe código de astronomía en awk, así de asombroso y de la vieja escuela es. En sus días, era la mejor herramienta para el trabajo ... y ahora, aunque sus estudiantes como yo usan Python y otras cosas, él se apega a lo que sabe y funciona bien.

Para terminar, hay mucho código antiguo en todo el mundo, saber que un poco awkno va a doler. También te hará mejor * nix person :-)

espacio libre
fuente
12
++ De acuerdo, awk es realmente una de las herramientas más portátiles y, lo que es más importante, consistentes en el conjunto de herramientas * nix. Funciona de manera confiable en busybox, por ejemplo, donde perl no se encuentra en ninguna parte.
armas
1
Y tampoco es tan difícil de aprender si estás acostumbrado a los lenguajes de llaves
guns
2
"Es lo mismo en cualquier entorno", no del todo: en Windows, las comillas simples deben reemplazarse por dobles, y los dobles internos deben escaparse. (Windows es una especie de entorno real, incluso si exponerse a la insegura atrocimidad a medio terminar de Redmond lo pone a merced de cualquier ruso de 15 años).
GT.
6
No creo que mucha gente asocie la existencia de awk y ventanas en el mismo universo .....: P
FoldedChromatin
2
Sigo usando awk para trabajos de procesamiento de texto. A menudo comienzo un script en otra cosa (ruby, python) y termino volviendo a awk por la simplicidad y el poder.
Rumbleweed
104

Si aprende rápidamente los conceptos básicos de awk, puede hacer cosas increíbles en la línea de comandos.

Pero la verdadera razón para aprender awk es tener una excusa para leer el magnífico libro The AWK Programming Language de sus autores Aho, Kernighan y Weinberger. Pensarías, por el nombre, que simplemente te enseña awk. De hecho, eso es solo el comienzo. Al lanzarse a la amplia gama de problemas que se pueden abordar una vez que se utiliza un lenguaje de secuencias de comandos conciso que facilita la manipulación de cadenas, y awk fue uno de los primeros, se procede a enseñar al lector cómo implementar una base de datos, un analizador, un intérprete , y (si la memoria no me falla) ¡un compilador para un lenguaje de computadora específico para un proyecto pequeño! Si tan solo hubieran programado un sistema operativo de ejemplo usando awk, ¡el libro habría sido una introducción bastante completa a la informática!

Famosamente claro y conciso, como el libro original en lenguaje C, también es un maravilloso ejemplo de escritura técnica amigable bien hecha. Incluso el índice es una obra de arte.

Awk? Si lo sabe, lo usará en la línea de comandos ocasionalmente, pero para algo más grande se sentirá atrapado, incapaz de acceder a las funciones más amplias de su sistema e Internet a las que algo como Python proporciona acceso. ¿Pero el libro? ¡Siempre te alegrarás de leerlo!

Brandon Rhodes
fuente
5
+1 vendido. Voy a encargar este libro. He usado awk durante años como un lenguaje de scripting rápido y poderoso. Awk es un gran preprocesador para archivos que, de otro modo, necesitarían una docena de líneas para codificar. No puedo contar cuántas veces he usado la forma: awk '{print $ 1, $ 2}'
galaxywatcher
2
Convenido. Es casi imposible creer lo compacto que se le da a ese libro todo lo que contiene. Cubre más que la mayoría de los libros contemporáneos en 1/10 (?) De longitud.
arcilla
3
Estoy leyendo este libro ahora y ha encendido mi entusiasmo por awk hasta casi una obsesión.
galaxywatcher
3
Consulte también el excelente Gawk: Programación AWK eficaz .
lhf
1
Acabo de leer el primer capítulo. Es asombroso. Mistery resuelto.
vaichidrewar
29

La única razón por la que uso awkes la división automática:

awk '{print $3}' < file.in

Esto imprime el tercer campo delimitado por espacios en blanco en file.in. Es un poco más fácil que:

tr -s ' ' < file.in | cut -d' ' -f3
Greg Hewgill
fuente
3
¿Por qué usar en awk '{print $3}' < file.inlugar de awk '{print $3}' file.in? ¿No lee awk archivos cuando se pasa como argumentos?
mbigras
@mbigras Seguro, puedes usar awk de cualquier manera.
Greg Hewgill
Incluso con doble tamaño, me gusta la solución sin awk. Y no sé por qué odio awk: /
MD. Mohiuddin Ahmed
25

Creo que awk es genial si su archivo contiene columnas / campos . Lo uso al procesar / analizar una columna en particular en un archivo de varias columnas. O si quiero agregar / eliminar una (s) columna (s) en particular.

p.ej

awk -F \t '{ if ($2 > $3) print; }' <filename>

se imprimirá solo si el valor de la segunda columna en un archivo separado por pestañas es mayor que el valor de la tercera columna.

Por supuesto que podría usar Perl o Python, pero awk lo hace mucho más simple con un comando conciso de una sola línea.

Además, aprender awk es bastante económico. Puede aprender los conceptos básicos de awk en menos de una hora, por lo que no requiere tanto esfuerzo como aprender cualquier otro lenguaje de programación / scripting.

Nikhil
fuente
Aunque realmente no uso mucho awk, este es un gran uso para awk.
Paul Nathan
8

Utilizo AWK ocasionalmente para tratar con HTML. Por ejemplo, este código traduce tablas a archivos csv:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Lo cual es genial si estás raspando la pantalla. De hecho, podría ser el caso de que me encantara AWK porque me permite crear la solución incorrecta a los problemas con tanta rapidez :) más ejemplos . También se menciona en las encantadoras perlas de programación de Jon Bentley .

Dave
fuente
7

Yo uso awk de vez en cuando. Es bueno para mezclar texto muy simple en medio de una canalización; llena un nicho muy estrecho entre no necesitarlo en absoluto y tener que utilizar Perl / Python / lo que sea.

No le aconsejaría que dedique mucho tiempo a él, pero podría ser útil conocer los conceptos básicos de la sintaxis, al menos lo suficiente como para que pueda consultar el manual rápidamente si alguna vez desea usarlo.

Eevee
fuente
5

La mayoría de los forros de awk one se pueden lograr con los forros de Perl one, si elige adoptar la mentalidad de un forro de Perl. O simplemente use Perl tres líneas :)

Si mantiene scripts de shell escritos por alguien a quien le gustó awk, entonces claramente, necesitará aprender awk.

Incluso si no hay una necesidad práctica, si ya conoce las expresiones regulares, no le tomará mucho tiempo aprender lo básico, y es divertido ver cómo se diseñaron las cosas en ese entonces. Es bastante elegante.

Delgado
fuente
5

6 años después de hacer esta pregunta, ahora puedo responder con certeza: no, aprender awk no vale la pena.

Las tareas básicas son manejables pero comandos bash básicos, o incluso herramientas GUI fácilmente. Las tareas más complejas se abordarán fácilmente con lenguajes dinámicos modernos como Python (favorito o mío) o Ruby.

Definitivamente deberías aprender un lenguaje dinámico de scripting moderno, ya que te ayudará en muchas tareas (web, administración, procesamiento de datos, automatización, etc.). Y al hacerlo, aprender herramientas como awk es completamente inútil, le ahorrará, en el mejor de los casos, unos pocos segundos cada mes.

e-satis
fuente
2
No es necesariamente cierto. Si está analizando archivos realmente grandes, podría ser mucho más rápido que otras herramientas.
user1071847
Interesante porque unos años después de esto todavía estás haciendo preguntas sobre awk. Yo fui uno de los primeros en responder y todavía lo uso con cierta regularidad hasta el día de hoy
Dexygen
4

Si ya conoce y usa sed, también podría aprender al menos un poco de awk. Se pueden unir para algunos trucos bastante poderosos. Siempre impresiona a la audiencia.

Amigo de Internet
fuente
4

Computerworld hizo recientemente una entrevista con Alfred V. Aho (uno de los tres creadores de AWK) sobre AWK. Es una lectura bastante interesante. Entonces, tal vez encuentres algunas sugerencias en él, por qué es una buena idea aprender AWK.

dlat
fuente
Agradable, pero no me convenció. AWK es una muy buena herramienta, pero creo que nunca la necesitaré lo suficiente como para tomarme el tiempo de aprenderla en lugar de piratear mi solución en sed o python.
e-satis
4

Aprender AWK fue invaluable para mí en mi último contrato trabajando en un sistema Linux embebido en el que ni Perl ni la mayoría de los otros lenguajes de scripting estaban instalados.

Dexygen
fuente
2
9 años después y hoy usé mucho awk mientras grababa registros de git
Dexygen
3

awk tiene una muy buena relación utilidad / dificultad, y "simple awk" funciona en todos los sistemas Unix / Linux / MacOS (y también se puede instalar en otros sistemas).

Fue diseñado en la Edad de Oro cuando la gente odiaba escribir, por lo que los guiones pueden ser muy, muy cortos y rápidos de escribir. Intentaré instalar mawk, una versión rápida, supuestamente acelera el cálculo unas 9 veces, awk / gawk es bastante lento, por lo que si desea usarlo en lugar de R, etc., es posible que desee mawk.

BongBong Chu
fuente
2

Es útil sobre todo si tiene que analizar ocasionalmente archivos de registro en busca de datos o salida de programas mientras se realiza un script de shell, porque es muy fácil de lograr en awk que eso le llevaría un poco más de líneas de código en Python.

Ciertamente tiene más poder que eso, pero estas parecen ser tareas para las que la mayoría de la gente lo usa.

NeuroSys
fuente
2

Por supuesto: estoy trabajando en un entorno donde los únicos idiomas disponibles son: (algún lenguaje shity que genera COBOL, OMG, OMG), bash (versión anterior), perl (aún no lo domino), sed, awk y algunas otras utilidades de línea de comandos. Saber awkme ahorró varias horas (y había generado varias tareas de procesamiento de texto de mis colegas, vienen a mí al menos tres veces al día).

Zsolt Botykai
fuente
1

Yo diría que probablemente ya no valga la pena. Lo uso de vez en cuando como un editor de flujo mucho más versátil que sed con habilidades de búsqueda incluidas, pero si eres competente con Python, no conozco una tarea que puedas terminar mucho más rápido para compensar el tiempo necesario. para aprender awk.

El siguiente comando es probablemente el único para el que he usado awk en los últimos dos años (purga los paquetes medio eliminados de mis sistemas Debian / Ubuntu):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P
Matthias Kestenholz
fuente
1

No

Aunque puede ser interesante, puede hacer todo lo que awk puede hacer usando otras herramientas más poderosas como Perl.

Dedique su tiempo a aprender esas herramientas más poderosas, y solo incidentalmente aprenda algo en el camino.

Ed Guiness
fuente
1

Yo diría que la hay. Para cosas simples, AWK es mucho más fácil para el administrador de sistemas / desarrollador sin experiencia que Python. Puedes aprender un poco de AWK y hacer muchas cosas, aprender Python significa aprender un idioma completamente nuevo (sí, sé que AWK es un lenguaje que también tiene sentido).

Perl podría hacer muchas cosas que AWK puede hacer, pero si me ofreciera la opción en estos tiempos, elegiría Python aquí. Entonces sí, deberías aprender AWK. pero aprende Python también :-)

wzzrd
fuente
1

awkes un lenguaje de herramientas eléctricas, por lo que es probable que lo awkutilicen en algún lugar si es un profesional de TI de cualquier tipo. Si puede manejar la sintaxis y las expresiones regulares de grepy sedentonces no debería tener problemas para aprenderawk y probablemente valga la pena hacerlo.

Donde he encontrado awkrealmente brillar es en la simplificación de cosas como el procesamiento de registros de varias líneas y la manipulación / interpolación de varios archivos simultáneamente.


fuente
0

Ahora que PERL se ha adaptado a casi todas las plataformas importantes, diría que no vale la pena. Es más versátil que sed y awk juntos. En cuanto a la división automática, puede hacerlo en perl de esta manera:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

EDITAR: es posible que aún desee familiarizarse un poco con awk, porque algunas otras herramientas se basan en su filosofía de acciones basadas en patrones (por ejemplo, DTrace en Solaris).

zvrba
fuente
0

Trabajo en un área donde los archivos están en formato de columna. Así que awk es invaluable para mí para REFORMAR el archivo para que diferentes programas puedan trabajar juntos. Para los profesionales que no son de TI, usar awk es suficiente y perfecto. Hoy en día, la velocidad de la computadora no es un problema, así que puedo combinar awk y unix para canalizar muchos comandos de 1 línea en un "script". Con la búsqueda Awk por campo y registro, lo uso para verificar los datos del archivo muy rápido, en lugar de "vi" para abrir un archivo. Tengo que decir que la capacidad de awk trajo alegría a mi trabajo especialmente, puedo ayudar a un compañero de trabajo a resolver las cosas rápidamente usando awk. Código asombroso para mí.

Hai Truong
fuente
0

Recientemente, estaba tratando de visualizar archivos pcap de red que registraban un ataque DOS que ascendía a más de 20 Gbs. Necesitaba la marca de tiempo y las direcciones IP. En mi escenario, AWK one-liner funcionó fabulosamente y bastante rápido también. Usé AWK específicamente para limpiar los archivos extraídos, obtener las direcciones IP y el recuento total de paquetes de esas direcciones IP dentro de un lapso de tiempo agrupado. Estoy totalmente de acuerdo con lo que otras personas han escrito anteriormente. Depende de tus necesidades.

Ash Catchem
fuente
0

Una razón para NO aprender awk es que no tiene coincidencias no codiciosas en expresiones regulares.

Tengo un código awk que ahora debo reescribir solo porque de repente depuré que no existen coincidencias no codiciosas en awk / gawk, por lo que no puede ejecutar correctamente algunas expresiones regulares.

usuario619271
fuente
0

Depende de sus compañeros de equipo y de su líder y de la tarea en la que esté trabajando.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}
Kenneth
fuente
0

He estado haciendo algo de codificación en Python en este momento. Pero todavía no lo conozco lo suficientemente bien como para usarlo fácilmente para transformaciones simples de archivos únicos.

Con awk puedo desarrollar rápidamente un fragmento de código de una línea en la línea de comandos de Unix que hace algunas transformaciones bastante rápidas. Cada vez que uso awk, el fragmento de código que escribo será desechable y no tendrá más de unas pocas líneas. Tal vez una declaración "if" y "printf" aquí o allá en una línea.

Nunca he escrito un fragmento de código de más de 10 líneas con awk. Vi algunos de estos guiones hace años.

Pero cualquier cosa que requiriera muchas líneas de código, recurriría a Python.

Amo awk. Es una herramienta muy poderosa en combinación con sed.

usuario5901715
fuente