¿Cuál es la diferencia entre sed y awk? [cerrado]

497
  • ¿Cuál es la diferencia entre awk y sed?
  • ¿Qué tipo de aplicación son los mejores casos de uso para herramientas sed y awk?
Rachel
fuente
2
Un control de calidad relacionado en unix.stackexchange: ¿Hay un tutorial básico para grep, awk y sed?
Dani

Respuestas:

550

sedes un editor de stream. Funciona con secuencias de caracteres por línea. Tiene un lenguaje de programación primitivo que incluye bucles estilo goto y condicionales simples (además de la coincidencia de patrones y la coincidencia de direcciones). Básicamente, solo hay dos "variables": espacio de patrón y espacio de espera. La legibilidad de los scripts puede ser difícil. Las operaciones matemáticas son extraordinariamente incómodas en el mejor de los casos.

Existen varias versiones de seddiferentes niveles de soporte para las opciones de línea de comandos y las características del lenguaje.

awkestá orientado hacia campos delimitados por línea. Tiene mucho más robusto construcciones de programación incluyendo if/ else, while, do/ whiley for(estilo C y la matriz iteración). Hay soporte completo para variables y matrices asociativas unidimensionales más (IMO) kludgey matrices multidimensionales. Las operaciones matemáticas se parecen a las de C. Tiene printfy funciona. La "K" en "AWK" significa " K ernighan" como en "Kernighan y Ritchie" de la fama del libro "C Programming Language" (sin olvidar a A ho y W einberger). Se podría escribir un detector de plagio académico utilizando awk.

GNU awk( gawk) tiene numerosas extensiones, incluidas matrices multidimensionales verdaderas en la última versión. Hay otras variaciones de awkincluir mawky nawk.

Ambos programas usan expresiones regulares para seleccionar y procesar texto.

Solía ​​usar seddonde hay patrones en el texto. Por ejemplo, podría reemplazar todos los números negativos en algún texto que esté en la forma "signo menos seguido de una secuencia de dígitos" (por ejemplo, "-231.45") con la forma de "paréntesis del contador" (por ejemplo, "(231.45)" ) utilizando esto (que tiene margen de mejora):

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile

Lo usaría awkcuando el texto se parezca más a filas y columnas o, como se awkrefiere a ellos, "registros" y "campos". Si iba a hacer una operación similar a la anterior, pero solo en el tercer campo en un archivo simple delimitado por comas, podría hacer algo como:

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile

Por supuesto, esos son solo ejemplos muy simples que no ilustran la gama completa de capacidades que cada uno tiene para ofrecer.

Pausado hasta nuevo aviso.
fuente
77
Para ver algunos ejemplos de cómo empujar los límites de sed: sed.sourceforge.net/#scripts
pausa hasta nuevo aviso.
@DennisWilliamson - ¿Estoy en desventaja si solo aprendo awk? ¿Es awk mucho más comúnmente usado que sed?
Steam
44
@blasto: Mi recomendación es aprender ambos pero con más énfasis en awk. Gran parte del material de expresión regular se aplica a ambos (y a otras herramientas e idiomas). Usa sed para cosas más simples y trata de evitar las cosas complejas. Es realmente genial que puedas hacer bucles y ramas en sed, pero las líneas de comando resultantes son complejas y difíciles de leer. La respuesta a su pregunta realmente depende de lo que esté haciendo.
Pausado hasta nuevo aviso.
@DennisWilliamson: ¿Qué sería más útil para un desarrollador de ETL? ETL o Extract Transform and Load es un término de almacenamiento de datos. Dicho de manera cruda, el trabajo consiste en EXTRACCIÓN de datos de diferentes fuentes dispares (como DB's, archivos de Excel, archivos csv, etc.), TRANSFORMACIÓN de los mismos y luego CARGAR en un datawarehouse (DW) para su análisis, encontrar patrones en los datos, o simplemente históricos. registros. p.ej. Uso final de un DW: los algoritmos aplicados a un DW de una tienda de comestibles que tiene datos de los últimos 10 años podrían revelar que las personas que tienden a comprar manzanas también compran naranjas o algo similar.
Steam
1
Solo un FYI para cualquiera que se encuentre con esto en una Mac, intente "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" para el primer ejemplo de sed
Daniel Schmidt
124

1) ¿Cuál es la diferencia entre awk y sed?

Ambas son herramientas que transforman el texto. PERO awk puede hacer más cosas además de simplemente manipular texto. Es un lenguaje de programación en sí mismo con la mayoría de las cosas que aprende en la programación, como matrices, bucles, control de flujo si / de lo contrario, etc. También puede "programar" en sed, pero no querrá mantener el código escrito en él. .

2) ¿Qué tipo de aplicación son los mejores casos de uso para herramientas sed y awk?

Conclusión: utilice sed para el análisis de texto muy simple. Cualquier cosa más allá de eso, awk es mejor. De hecho, puede deshacerse de sed por completo y simplemente usar awk. Dado que sus funciones se superponen y awk puede hacer más, solo use awk. También reducirá su curva de aprendizaje.

ghostdog74
fuente
77
Buen punto sobre la curva de aprendizaje ... demasiadas herramientas pueden confundirse ... así que preferiría aprender grep y awk solo ... olvidemos sobre sed :)
Outlier
174
^^ Suficiente sed. (lo siento, tuve que hacerlo)
Greg M. Krsak
8
Sin embargo, creo que sed es mucho más fácil de aprender, por lo que debes tenerlo en cuenta. A medida que aprende a dominar awk, puede ser útil aprender rápidamente sed para poder usarlo más rápido para cosas que quizás aún no sepa cómo hacer en awk.
Didier A.
1
@GregKrsak me alegraste el día. (lo siento, tuve que hacerlo)
Abel Callejo
15
No abandone sed, 's/search/replace'es mucho más fácil de escribir que awkla sintaxis y es lo que necesita la mayor parte del tiempo.
sjas
55

Ambas herramientas están destinadas a trabajar con texto y hay tareas para las que se pueden usar ambas herramientas.

Para mí, la regla para separarlos es: usar sedpara automatizar tareas que de otro modo harías en un editor de texto manualmente. Es por eso que se llama editor de flujo . (Puede usar los mismos comandos para editar texto en vim). Úselo awksi desea analizar texto, es decir, contar campos, calcular totales, extraer y reorganizar estructuras, etc.

Además, no debes olvidarte grep. Úselo grepsi solo desea buscar / extraer algo en un texto (archivo)

hek2mgl
fuente