Para capturar un patrón particular, awk
y grep
puede ser utilizado. ¿Por qué deberíamos usar uno sobre el otro? ¿Cuál es más rápido y por qué?
Si tuviera un archivo de registro y quisiera obtener un cierto patrón, podría hacer uno de los siguientes
awk '/pattern/' /var/log/messages
o
grep 'pattern' /var/log/messages
No he hecho ninguna evaluación comparativa, por lo que no lo sabría. ¿Alguien puede elaborar esto? Es genial conocer el funcionamiento interno de estas dos herramientas.
linux
awk
grep
performance
holasz
fuente
fuente
time
comando para medir el tiempo que se tarda en ejecutar el comando. Ej:time ls -l
.Respuestas:
grep probablemente será más rápido:
awk es un lenguaje de programación interpretado, donde grep es un programa compilado de código c (que además está optimizado para encontrar patrones en archivos).
(Nota: ejecuté ambos comandos dos veces para que el almacenamiento en caché no sesgue los resultados)
Más detalles sobre los idiomas interpretados en wikipedia.
Como Stephane ha señalado correctamente en los comentarios, su kilometraje puede variar debido a la implementación del grep y awk que usa, el sistema operativo en el que se encuentra y el conjunto de caracteres que está procesando.
fuente
Utiliza la herramienta más específica y expresiva. Es probable que la herramienta que mejor se adapte a su caso de uso sea la más rápida.
Como una guía aproximada:
fuente
perl
lugar deawk
. si necesita algo más complicado que grep / cut / sed, entonces es probable que awk no sea suficiente y necesite algo "completo"Cuando solo busca cadenas y la velocidad es importante, casi siempre debe usarla
grep
. Es un orden de magnitud más rápido queawk
cuando se trata de una búsqueda grosera.fuente Las diferencias funcionales y de rendimiento de sed, awk y otras utilidades de análisis Unix
fuente
awk ... has PCRE matching for regular expressions
cuál es completamente falso.Si bien estoy de acuerdo en que en teoría
grep
debería ser más rápido queawk
, en la práctica, YMMV ya que eso depende mucho de la implementación que use.aquí comparando grep y awk de busybox 1.20.0, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 en Debian / Linux 7.0 amd64 (con glibc 2.17) en un entorno local UTF-8 en un archivo de 240 MB de líneas de 2.5M Caracteres solo ASCII.
En la configuración regional C, solo GNU grep recibe un impulso significativo y se vuelve más rápido que
mawk
.El conjunto de datos, el tipo de expresión regular también puede hacer una gran diferencia. Para las expresiones regulares,
awk
debe compararse con las expresiones regularesgrep -E
comoawk
las expresiones regulares extendidas.Para este conjunto de datos,
awk
podría ser más rápido quegrep
en los sistemas basados en busybox o sistemas dondemawk
el valor predeterminadoawk
y la configuración regional predeterminada se basa en UTF-8 (IIRC, solía ser el caso en Ubuntu).fuente
En pocas palabras,
grep
hace una cosa solo como muchas otras herramientas de UNIX y es hacer coincidir una línea con el patrón dado y lo hace bien. Por otro lado,awk
es una herramienta más sofisticada, ya que es un lenguaje de programación completo definido por el estándar POSIX con características típicas como variables, matrices, expresiones, funciones o declaraciones de control para el escaneo y procesamiento de patrones.En mi opinión, depende de la implementación del rendimiento de ambas herramientas en caso de coincidencia de patrones y del tamaño de alguna entrada que desee procesar. Esperaría que grep sea generalmente más eficiente que awk, ya que solo coincide. Pero no puede escribir con grep un código simple para realizar tareas más complejas, como el procesamiento posterior de registros coincidentes, el cálculo o la impresión de resultados sin utilizar otras herramientas.
fuente