¿Cuáles son las diferencias entre Perl, Python, AWK y sed? [cerrado]

253

solo quiero saber cuáles son las principales diferencias entre ellos? y el poder de cada idioma (donde es mejor usarlo).

Editar: no es "vs." como tema, solo información.

Khaled Al Hourani
fuente
142
Este tipo de preguntas llamadas no constructivas son realmente útiles.
Steam
10
Claro, una pestaña en la portada para encontrarlos sería útil ...
Para la utilidad de Python en la línea de comando, vea pyp
Neil McGuigan el

Respuestas:

550

En orden de aparición, las lenguas son sed, awk, perl, python.

El sedprograma es un editor de flujo y está diseñado para aplicar las acciones de un script a cada línea (o, más generalmente, a rangos de líneas específicos) del archivo o archivos de entrada. Su lenguaje se basa en edel editor de Unix, y aunque tiene condicionales, etc., es difícil trabajar con tareas complejas. Puede hacer milagros menores con él, pero a un costo para el cabello en su cabeza. Sin embargo, es probablemente el más rápido de los programas cuando intenta realizar tareas dentro de su competencia. (Tiene las expresiones regulares menos poderosas de los programas discutidos - adecuado para muchos propósitos, pero ciertamente no PCRE - Expresiones regulares compatibles con Perl)

El awkprograma (nombre de las iniciales de sus autores: Aho, Weinberger y Kernighan) es una herramienta inicialmente para formatear informes. Se puede usar como una mejora sed; en sus versiones más recientes, es computacionalmente completo. Utiliza una idea interesante: el programa se basa en 'patrones coincidentes' y 'acciones tomadas cuando el patrón coincide'. Los patrones son bastante potentes (expresiones regulares extendidas). El lenguaje para las acciones es similar al C. Una de las características clave de awkes que divide la entrada automáticamente en registros y cada registro en campos.

Perl fue escrito en parte como un awk-killer y sed-killer. Dos de los programas provistos con él son a2py s2ppara convertir awkscripts y sedscripts en Perl. Perl es uno de los primeros lenguajes de secuencias de comandos de la próxima generación (Tcl / Tk probablemente puede reclamar primacía). Tiene un poderoso manejo integrado de expresiones regulares con un lenguaje mucho más poderoso. Proporciona acceso a casi todas las llamadas al sistema y tiene la extensibilidad de los módulos CPAN. (Ni awkni sedes extensible). Uno de los lemas de Perl es "TMTOWTDI: hay más de una forma de hacerlo" (pronunciado "tim-toady"). Perl tiene 'objetos', pero es más un complemento que una parte fundamental del lenguaje.

Python fue escrito en último lugar, y probablemente en parte como una reacción a Perl. Tiene algunas ideas sintácticas interesantes (sangría para indicar niveles, sin llaves ni equivalentes). Está más fundamentalmente orientado a objetos que Perl; Es tan extensible como Perl.

OK, ¿cuándo usar cada uno?

  • Sed: cuando necesita hacer transformaciones de texto simples en archivos.
  • Awk: cuando solo necesita un formato simple y un resumen o transformación de datos.
  • Perl: para casi cualquier tarea, pero especialmente cuando la tarea necesita expresiones regulares complejas.
  • Python: para las mismas tareas para las que podrías usar Perl.

No estoy al tanto de nada que Perl pueda hacer que Python no pueda, ni viceversa. La elección entre los dos dependería de otros factores. Aprendí Perl antes de que existiera Python, así que tiendo a usarlo. Python tiene una sintaxis menos aumentada y generalmente es algo más simple de aprender. Perl 6, cuando esté disponible, será un desarrollo fascinante.

(Tenga en cuenta que las 'descripciones generales' de Perl y Python, en particular, son lamentablemente incompletas; se podrían escribir libros completos sobre el tema).

Jonathan Leffler
fuente
82
¡Una publicación ++++, volvería a leer!
Robert Gamble
24
increíble especialmente "cuándo usar cada" parte
Khaled Al Hourani
66
Tenga en cuenta que el zen de Python es básicamente la antítesis de TMTOWTDI, por lo que diría que podría ser una reacción a Perl. iirc TCL fue ligeramente después de Perl y también es bastante reaccionario contra Perl, aunque la reacción de TCL es en la sintaxis y la complejidad del lenguaje, no en formas de hacer las cosas
jk.
77
Cualesquiera que sean las intenciones originales, está claro que el desarrollo posterior de Python y la comunidad de Python han preferido la legibilidad y la coherencia sobre la sintaxis más flexible pero concisa de Perl. Excelente post Jonathan
Martin Beckett
44
@blasto: para ETL, priorizaría awkmás sedpara aprender (aunque ambos todavía tienen sus usos). En cuanto al tamaño de la tarea: sedestá en su mejor momento cuando procesa una línea a la vez, sin almacenamiento de línea a línea. awka menudo se usa para construir matrices asociativas con datos acumulados de todas las fuentes; utiliza más memoria y, por lo tanto, es mucho más probable que tenga problemas con grandes conjuntos de datos de lo que sedes. No he oído hablar tsawkantes de que lo vincules. Tiendo a recurrir a Perl (pero podría hacerlo mejor con Python) cuando una tarea es demasiado awk.
Jonathan Leffler
91

Después de dominar unas pocas docenas de idiomas, te cansas de personas como S. Lott (ver su controvertida respuesta a esta pregunta, casi la mitad de los votos negativos que el aumento (+ 45 / -22) seis años después de responder).

Sed es la mejor herramienta para tuberías de línea de comandos extremadamente simples. En manos de un maestro sed, es adecuado para casos únicos de complejidad arbitraria, pero no debe usarse en el código de producción, excepto en tuberías de sustitución muy simples. Cosas como 's / this / that /.'

Gawk (el GNU awk) es, con mucho, la mejor opción para reformatear datos complejos cuando solo hay una única fuente de entrada y una sola salida (o múltiples salidas escritas secuencialmente). Dado que gran parte del trabajo del mundo real se ajusta a esta descripción, y un buen programador puede aprender gawk en dos horas, es la mejor opción. ¡En este planeta, más simple y más rápido es mejor!

Perl o Python son mucho mejores que cualquier versión de awk o sed cuando tienes escenarios de entrada / salida muy complejos. Cuanto más complejo es el problema, mejor está usando Python, desde un punto de vista de mantenimiento y legibilidad. Sin embargo, tenga en cuenta que un buen programador puede escribir código legible en cualquier idioma, y ​​un mal programador puede escribir basura imposible de mantener en cualquier lenguaje útil, por lo que la elección de perl o python puede dejarse a las preferencias del programador si dicho programador es hábil e inteligente.

Charlie
fuente
99
100% de acuerdo. Saber más, si no todas las herramientas Y cuándo usar cada una, es lo que distingue a un buen técnico de uno mediocre.
ata
66
Agregaré que otra razón para elegir Python o Perl en lugar de awk es cuando sus requisitos de transformación implican una validación compleja o lógica para la cual otro lenguaje tiene un módulo robusto existente. Piense en lo que se necesitaría para manejar adecuadamente, por ejemplo, correo electrónico o direcciones de calles en awk y verá lo que quiero decir: perl y python tienen bibliotecas que hacen que cosas como esta sean triviales, en awk estos son poco comunes o no están disponibles.
Sorigal
3
En realidad, como Perl fue diseñado para abarcar tanto Sed como Awk; Me resulta más fácil escribirlo en Perl, en lugar de aprender Sed o Awk.
Brad Gilbert
@BradGilbert: como acabo de mencionar en la respuesta principal, una advertencia de Perl (& Python, ruby, etc.) sobre awk es que algún tipo de expresión regular es mucho más lenta en el primero: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac
1
@OlivierDulac Sí, eso muestra un caso patológico. Si cambia de a?ⁿaⁿa, a??ⁿaⁿentonces ejecute eso en Perl 5 con un de 1,000,000, se ejecuta en menos de dos segundos. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Si ejecuta el ingenuo, lleva más de dos segundos para un solo 25. Lo que debe tener en cuenta es que Perl tiene más funciones de expresiones regulares que las más rápidas, incluido el permitir que tenga un código de Perl dentro de la expresión regular que altera lo que coincide. . Si lo desea, puede implementar un módulo que intercambie el incorporado por uno de esos otros.
Brad Gilbert
21

No llamaría a sed un lenguaje de programación completo, es un editor de flujo con construcciones de lenguaje destinadas a editar archivos de texto mediante programación.

Awk es un poco más un lenguaje de propósito general, pero sigue siendo el más adecuado para el procesamiento de texto.

Perl y Python son lenguajes de programación de uso general completamente desarrollados. Perl tiene sus raíces en el procesamiento de texto y tiene una serie de construcciones tipo awk (incluso hay un script de awk a perl flotando en la red). Hay muchas diferencias entre Perl y Python, su mejor opción es probablemente leer los resúmenes de ambos idiomas en algo como Wikipedia para comprender cuáles son.

Robert Gamble
fuente
2
He visto una implementación sed de Sokoban, lo que implicaría Turing Completeness. Sin embargo, eso también se puede decir de sendmail.cf y TeX.
Preocupado por
77
Una vez trabajé con un tipo que escribió PostScript para convertir una impresora láser en un enrutador.
Sam Kington
10
@ Sam: ¡Guau! ¡No sabía que el láser de una impresora podía arrancarse lo suficiente como para cortar madera! Oh, lo siento, tipo de enrutador incorrecto.
Pausado hasta nuevo aviso.
2
sed, no es un lenguaje completo? Bueno, eso no es del todo cierto, ya que sed se está completando ;)
bernard paulus
1
He visto una implementación del cuarto lenguaje en awk. (Dado que awk puede considerarse como un analizador por derecho propio, es bastante sencillo implementar un intérprete en él).
Tatjana Heuser
19

Primero, hay dos cosas no relacionadas en la lista "Perl, Python awk y sed".

Cosa 1: herramientas de manipulación de texto simplistas.

  • sed. Tiene un alcance de trabajo fijo y relativamente simple definido por la idea de leer y examinar cada línea de un archivo. sed no está diseñado para ser particularmente legible. Está diseñado para ser muy pequeño y muy eficiente en servidores Unix muy pequeños.

  • awk Tiene un alcance de trabajo ligeramente menos fijo y menos simple. Sin embargo, el bucle principal de un programa awk se define mediante la lectura implícita de líneas de un archivo fuente.

Estos no son lenguajes de programación "completos". Si bien puede, con algo de trabajo, escribir programas bastante sofisticados en awk, rápidamente se vuelve complicado y difícil de leer.

Cosa 2: lenguajes de programación de uso general. Estos tienen una gran variedad de tipos de declaraciones, numerosas estructuras de datos integradas y no hay suposiciones o atajos conectados para hablar.

  • Perl.

  • Pitón.

Cuando usarlos.

  • sed. Nunca. Realmente no tiene ningún valor en la era moderna de las computadoras con más de 32K de memoria. Perl o Python hacen las mismas cosas más claramente.

  • awk Nunca. Al igual que sed, refleja una era anterior de la informática. En lugar de mantener este idioma (además de todos los demás necesarios para un sistema exitoso), es más agradable simplemente hacer todo en un idioma agradable.

  • Perl. Cualquier problema de programación de cualquier tipo. Si te gusta la sintaxis de pensamiento libre, donde hay muchas, muchas formas de hacer lo mismo, Perl es divertido.

  • Pitón. Cualquier problema de programación de cualquier tipo. Si le gusta la sintaxis bastante limitada, donde hay menos opciones, menos sutileza y (quizás) más claridad. La naturaleza orientada a objetos de Python lo hace más adecuado para problemas grandes y complejos.

Antecedentes: no estoy atacando sed y awk por ignorancia. Aprendí awk hace más de 20 años. Hice muchas cosas con eso; solía enseñarlo como una habilidad básica de Unix. Aprendí Perl hace unos 15 años. Hice muchas cosas sofisticadas con él. Dejé ambas cosas atrás porque puedo hacer las mismas cosas en Python, y es más simple y más claro.

Hay dos problemas serios con sed y awk, ninguno de los cuales es su edad.

  1. Lo incompleto de su implementación. Todo lo que sed y awk hacen se puede hacer en Python o Perl, a menudo de manera más simple y a veces también más rápido. Una tubería de shell tiene algunas ventajas de rendimiento debido a su multiprocesamiento. Python ofrece un subprocessmódulo que me permite recuperar esas ventajas.

  2. La necesidad de aprender otro idioma. Al hacer cosas en Python (o Perl), su implementación depende de menos idiomas, con el consiguiente aumento de la claridad.

S.Lott
fuente
66
Algunos argumentos bastante fatuos contra awk / sed. La llave ajustable no ha suplantado a la llave abierta por la misma razón por la que sed y awk todavía se envían. A veces, la herramienta simple es la mejor para el trabajo. Escribo mucho perl, pero para una cadena simple de comandos canalizados, awk / sed son más rápidos que perl -e
RET
27
No puede asumir la disponibilidad de nada más que sh, sed y awk en la mayoría de los sistemas unix que no son de Linux. Si desea que algo funcione en una instalación de Solaris, HP / UX o AIX lista para usar, está atascado con sed y awk.
Preocupado por
27
La mitad de mis scripts de shell usan sed o awk. Están lejos de estar muertos. Python es mi lenguaje de programación preferido, pero a veces sed y awk son la mejor herramienta para el trabajo. El hecho de que hayan estado en uso durante muchos años no significa que estén obsoletos.
Jeremy Cantrell
16
@ S.Lott: No estoy sugiriendo que alguien deba intentar crear una aplicación web en awk, pero decir que nunca deberían usarse es un poco escandaloso. Para un simple s & r y / o ajuste (especialmente a un archivo de texto delimitado), perl -e o python -c nunca será tan eficiente como un one / liner de sed / awk.
RET
25
No me gustan las respuestas como esta. Sed y awk son fáciles de entender en pocas horas y mucho más livianos y ampliamente disponibles que un lenguaje completo. La programación de Shell es tan relevante como siempre, diciendo que "NUNCA" use esta o aquella herramienta simplemente se retrasa. Pero, ¿no fue esta idea retrasada uno de los fundamentos sobre los que surgió Perl? Oh bien--
ATA
14

Cuándo usarlos: awk - nunca - S. Lott.

Creo que S. Lott perdió un poco la marca con esta recomendación. El hecho es que, en Linux y en otros entornos UNIX, awk es una herramienta útil para usar con bash, sh y ksh para el procesamiento rápido de texto. La idea de la secuencia de comandos en sí misma es que resuelve su problema al pegar esta herramienta, esa herramienta. Por lo tanto, en los scripts de administración, es común tener ls, grep, |, awk, time, ps, etc. Cada uno es una herramienta que el scripter combina como un constructor ladrillo por ladrillo para terminar el edificio (para resolver el problema en cuestión) .

Por ejemplo, soy miembro del equipo de gestión del equipo. suministros de equipo de paintballdotcom Este sitio de comercio electrónico se basa en la pila LAMP. Para el procesamiento automatizado y la normalización de las fuentes de datos de varios proveedores en la base de datos de back-end, empleamos y mantenemos una mezcla diversificada de scripts, incluidos bash, perl, php e incluso esperamos. Cada uno tiene sus puntos fuertes basados ​​en los módulos y API disponibles. En los scripts de bash, hacemos coincidencias de patrones rápidos y acciones apropiadas en los patrones según sea necesario usando awk sin la necesidad de cambiar a PERL. Una cosa que también me gustaría señalar, que no se ha enfatizado en el hilo, es que un buen número de estos scripts se compraron u obtuvieron del código abierto. Si el script vino como Perl, lo mantenemos como Perl; si el script vino como Php, lo mantenemos como Php; si vino como bash, lo mantenemos como bash;

tao quam
fuente
77
S. Lott fue quien escribió que la respuesta que usted ha citado, no Brian D Foy ...
plusplus
55
como nota al margen de esta respuesta bastante antigua: nunca analice la salida de ls, use glob en su lugar. Lee esto.