2009-10-27 11 views
389
  • ¿Cuál es la diferencia entre awk y sed?
  • ¿Qué tipo de aplicación es mejor usar cajas para herramientas sed y awk?
+1

Un control de calidad relacionado en unix.stackexchange: [¿Hay un tutorial básico para grep, awk y sed?] (Http: //unix.stackexchange) .com/questions/2434/is-there-a-basic-tutorial-for-grep-awk-and-sed) – Dani

Respuesta

438

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

Existen varias versiones de sed con diferentes niveles de soporte para opciones de línea de comando y funciones de idioma.

awk está orientado hacia campos delimitados por línea. Tiene construcciones de programación mucho más robustas incluyendo if/else, while, do/while y for (estilo C e iteración de matriz). Existe un soporte completo para las variables y matrices asociativas de una dimensión más (IMO) kludgey matrices multidimensionales. Las operaciones matemáticas se parecen a las de C. Tiene printf y funciones. La "K" en "AWK" es sinónimo de "K ernighan" como en "Kernighan y Ritchie" del libro "Lenguaje de Programación C" fama (no olvidar Un ho y W Einberger). Uno podría concebiblemente escribir un detector de plagio académico usando awk.

GNU awk (gawk) tiene numerosas extensiones, incluidas matrices verdaderamente multidimensionales en la última versión. Hay otras variaciones de awk incluyendo mawk y nawk.

Ambos programas usan expresiones regulares para seleccionar y procesar texto.

Tendería a usar sed donde hay patrones en el texto. Por ejemplo, puede reemplazar todos los números negativos en algún texto que tenga el formato "signo menos seguido de una secuencia de dígitos" (por ejemplo, "-231.45") con el formato "paréntesis del contador" (por ejemplo, "(231.45) ") utiliza este (que tiene margen de mejora):

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

me gustaría utilizar awk cuando el texto se parece más a las filas y columnas o, como awk se refiere a ellos 'registros' y 'campos' IF. iba a hacer una operación similar a la anterior, pero sólo en el tercer campo en un simple archivo delimitado por comas que podría hacer algo como:

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

por supuesto, estos son sólo ejemplos muy simples que no ilustran la gama completa de capacidades que cada uno tiene para ofrecer.

+3

Gracias Dennis por la pronta explicación. – Rachel

+3

Para ver algunos ejemplos de cómo superar los límites de 'sed': http://sed.sourceforge.net/#scripts –

+3

Gracias Dennis por proporcionar el enlace a los ejemplos de sed – Rachel

94

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 solo manipular texto. Es un lenguaje de programación en sí mismo con la mayoría de las cosas que aprendes en programación, como matrices, bucles, control de flujo if/else, etc. También puedes "programar" en sed, pero no querrás mantener el código escrito en él .

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

Conclusión: Use sed para el análisis de texto muy simple. Cualquier cosa más allá de eso, awk es mejor. De hecho, puedes abandonar el sed por completo y solo usar awk. Como sus funciones se superponen y awk puede hacer más, solo usa awk. También reducirás tu curva de aprendizaje.

+5

Buen punto acerca de la curva de aprendizaje ... demasiadas herramientas pueden mezclarse ... así que preferiría aprender grep y awk solo ... olvidémonos de sed :) – Outlier

+104

^^ Suficiente sed. (Lo siento, tuve que) –

+3

Aunque creo que sed es mucho más fácil de aprender, así que debes dar cuenta de eso. A medida que aprendes a dominar awk, puede ser útil aprender rápidamente a sed para poder usarlo más rápido para cosas que aún no sabes cómo hacer en awk. –

30

Ambas herramientas están pensadas para trabajar con texto y hay tareas para las cuales se pueden usar ambas herramientas.

Para mí, la regla para separarlos es: Use sed para automatizar las tareas que de otro modo haría en un editor de texto manualmente. Es por eso que se llama stream editor. (Puede usar los mismos comandos para editar texto en vim). Use awk si desea analizar texto, lo que significa contar campos, calcular totales, extraer y reorganizar estructuras, etc.

Además, no debe olvidar el grep. Use grep si solo quiere buscar/extraer algo en un texto (archivo)

Cuestiones relacionadas