Quais são as diferenças entre Perl, Python, AWK e sed? [fechadas]


253

só quero saber quais são as principais diferenças entre eles? e o poder de cada idioma (onde é melhor usá-lo).

Editar: não é "vs." como tópico, apenas informações.


142
Esses tipos de perguntas não construtivas são realmente úteis.
Steam

10
Claro, uma guia na primeira página para encontrá-los seria útil ...

Para utilidade de python na linha de comando, consulte pyp
Neil McGuigan

Respostas:


550

Em ordem de aparição, as línguas são sed, awk, perl, python.

O sedprograma é um editor de fluxo e foi projetado para aplicar as ações de um script a cada linha (ou, mais geralmente, a intervalos especificados de linhas) do (s) arquivo (s) de entrada. Sua linguagem é baseada no ededitor Unix e, embora tenha condicionais e assim por diante, é difícil trabalhar com tarefas complexas. Você pode fazer pequenos milagres com isso - mas a um custo para os cabelos da sua cabeça. No entanto, é provavelmente o mais rápido dos programas ao tentar tarefas dentro de suas atribuições. (Possui as expressões regulares menos poderosas dos programas discutidas - adequadas para muitos propósitos, mas certamente não o PCRE - Expressões regulares compatíveis com Perl)

O awkprograma (nome das iniciais de seus autores - Aho, Weinberger e Kernighan) é uma ferramenta inicialmente para formatar relatórios. Pode ser usado como um absorvente sed; em suas versões mais recentes, é computacionalmente completo. Ele usa uma ideia interessante - o programa é baseado em 'padrões correspondentes' e 'ações executadas quando o padrão corresponde'. Os padrões são bastante poderosos (expressões regulares estendidas). O idioma para as ações é semelhante ao C. Um dos principais recursos awké que ele divide a entrada automaticamente em registros e cada registro em campos.

Perl foi escrito em parte como um assassino de awk e sed-kill. Dois dos programas fornecidos são a2pe s2ppara a conversão de awkscripts e sedscripts em Perl. Perl é uma das primeiras da próxima geração de linguagens de script (o Tcl / Tk provavelmente pode reivindicar primazia). Possui manipulação de expressões regulares integrada e poderosa com uma linguagem muito mais poderosa. Ele fornece acesso a quase todas as chamadas do sistema e possui a extensibilidade dos módulos CPAN. (Nem awknem sedé extensível.) Um dos lemas do Perl é "TMTOWTDI - Há mais de uma maneira de fazê-lo" (pronuncia-se "tim-bajulador"). O Perl tem 'objetos', mas é mais um complemento do que uma parte fundamental da linguagem.

Python foi escrito por último, e provavelmente em parte como uma reação ao Perl. Tem algumas idéias sintáticas interessantes (recuar para indicar níveis - sem chaves ou equivalentes). É mais fundamentalmente orientado a objetos do que Perl; é tão extensível quanto o Perl.

OK - quando usar cada um?

  • Sed - quando você precisa fazer transformações simples de texto em arquivos.
  • Awk - quando você só precisa de formatação simples e resumo ou transformação de dados.
  • Perl - para quase qualquer tarefa, mas especialmente quando a tarefa precisa de expressões regulares complexas.
  • Python - para as mesmas tarefas que você pode usar o Perl.

Não estou ciente de nada que o Perl possa fazer que o Python não possa, nem vice-versa. A escolha entre os dois dependeria de outros fatores. Eu aprendi Perl antes de haver um Python, então eu costumo usá-lo. O Python tem menos sintaxe acumulada e geralmente é um pouco mais simples de aprender. O Perl 6, quando estiver disponível, será um desenvolvimento fascinante.

(Observe que as 'visões gerais' do Perl e Python, em particular, são lamentavelmente incompletas; livros inteiros podem ser escritos sobre o assunto).


82
Uma postagem ++++, seria lida novamente!
Robert Gamble

24
impressionante especialmente "quando usar cada" parte #
Khaled Al Hourani

6
note que o zen do python é basicamente a antítese do TMTOWTDI, então eu diria que poderia ser uma reação ao perl. O iirc TCL foi um pouco depois do perl e também é bastante reacionário contra o perl, embora a reação do TCL esteja na sintaxe e na complexidade da linguagem, não em maneiras de fazer as coisas
jk.

7
Quaisquer que sejam as intenções originais, fica claro que o desenvolvimento posterior do Python e a comunidade python têm legibilidade e consistência preferidas em relação à sintaxe mais flexível, porém concisa do Perl. Excellent post Jonathan
Martin Beckett

4
@blasto: Para ETL, eu priorizaria awko sedaprendizado (embora ambos ainda tenham seus usos). Quanto ao tamanho da tarefa: sedé o melhor quando processa uma linha de cada vez, sem armazenamento de linha a linha. awké frequentemente usado para criar matrizes associativas com dados acumulados de todas as fontes; ele usa mais memória e, portanto, é muito mais provável que tenha problemas com grandes conjuntos de dados do que sedé. Eu nunca ouvi falar tsawkantes de você se conectar a ele. Costumo recorrer ao Perl (mas você pode se sair melhor com Python) quando uma tarefa é demais awk.
Jonathan Leffler

91

Depois de dominar algumas dezenas de idiomas, você se cansa de pessoas como S. Lott (veja sua resposta controversa a essa pergunta, quase metade do número de votos negativos (+ 45 / -22) seis anos depois de responder).

O Sed é a melhor ferramenta para tubulações de linha de comando extremamente simples. Nas mãos de um mestre sed, é adequado para casos pontuais de complexidade arbitrária, mas não deve ser usado no código de produção, exceto em pipelines de substituição muito simples. Coisas como 's / isto / aquilo /.'

Gawk (o GNU awk) é de longe a melhor escolha para reformatação de dados complexos quando há apenas uma única fonte de entrada e uma única saída (ou várias saídas gravadas sequencialmente). Como grande parte do trabalho do mundo real está em conformidade com essa descrição, e um bom programador pode aprender o gawk em duas horas, é a melhor escolha. Neste planeta, mais simples e mais rápido é melhor!

Perl ou Python são muito melhores do que qualquer versão do awk ou sed quando você tem cenários de entrada / saída muito complexos. Quanto mais complexo o problema, melhor você está usando python, do ponto de vista de manutenção e legibilidade. Observe, no entanto, que um bom programador pode escrever código legível em qualquer linguagem, e um programador ruim pode escrever porcaria não-sustentável em qualquer linguagem útil; portanto, a escolha de perl ou python pode ser deixada com segurança nas preferências do programador, se o programador for hábil e inteligente.


9
100% concordado. Conhecer a maioria, senão todas as ferramentas E quando usar cada uma delas é o que distingue um bom técnico de um medíocre.
ata

6
Acrescentarei que outro motivo para escolher Python ou Perl em vez de awk é quando seus requisitos de transformação envolvem validação ou lógica complexa para a qual outra linguagem possui um módulo robusto existente. Pense no que seria necessário para lidar adequadamente, por exemplo, endereços de e-mail ou ruas no awk e você verá o que quero dizer: perl e python têm bibliotecas que tornam coisas como essa triviais, no awk elas são incomuns ou indisponíveis.
sorpigal

3
Na verdade, como Perl foi projetado para abranger tanto Sed quanto Awk; Acho mais fácil escrever em Perl do que aprender Sed ou Awk.
Brad Gilbert

@BradGilbert: como eu mencionei na resposta superior, uma ressalva do Perl (& Python, ruby, etc) sobre o awk é que algum tipo de regexp é realmente mais lento no primeiro: swtch.com/~rsc/regexp/regexp1.html
Olivier Dulac

1
@OlivierDulac Sim, isso mostra um caso patológico. Se você mudar de a?ⁿaⁿpara, em a??ⁿaⁿseguida, execute isso no Perl 5 com 1.000.000, ele será executado em menos de dois segundos. time perl -E '$x=1_000_000;$_="a"x$x;$m=("a??"x$x).("a"x$x);say $_=~$m'Se você executar o ingênuo, leva mais de dois segundos para apenas 25. O que você precisa entender é que o Perl tem mais recursos de regex do que os mais rápidos, incluindo permitir que você tenha um código Perl dentro do regex que altera o que corresponde . Você pode implementar um módulo que troque o interno por um desses outros, se desejar.
Brad Gilbert

21

Eu não chamaria de sed uma linguagem de programação completa, é um editor de fluxo com construções de linguagem destinadas a editar arquivos de texto programaticamente.

O Awk é um pouco mais de uma linguagem de uso geral, mas ainda é mais adequado para o processamento de texto.

Perl e Python são linguagens de programação de uso geral de pleno direito. O Perl tem suas raízes no processamento de texto e possui várias construções do tipo awk (existe até um script do awk para perl flutuando na rede). Existem muitas diferenças entre Perl e Python, sua melhor aposta é provavelmente ler os resumos das duas linguagens em algo como a Wikipedia para entender melhor o que são.


2
Eu vi uma implementação sed de Sokoban, o que implicaria na Completude de Turing. No entanto, isso também pode ser dito de sendmail.cf e TeX.
ConcernedOfTunbridgeWells

7
Eu trabalhei com um cara que escreveu PostScript para transformar uma impressora a laser em um roteador.
Sam Kington

10
@ Sam: Uau! Eu não sabia que o laser de uma impressora podia ser dobrado o suficiente para cortar madeira! Oh, desculpe, tipo errado de roteador.
Pausado até novo aviso.

2
sed, não é um idioma completo? Bem, isso não é inteiramente verdade, como sed é turing completo ;)
bernard Paulus

1
Eu vi uma implementação da quarta linguagem no awk. (Como o awk pode ser considerado um analisador por si só, é bastante simples implementar um intérprete nele).
Tatjana Heuser

19

Primeiro, há duas coisas não relacionadas na lista "Perl, Python awk e sed".

Coisa 1 - ferramentas simplistas de manipulação de texto.

  • sed. Ele possui um escopo fixo e relativamente simples de trabalho, definido pela idéia de ler e examinar cada linha de um arquivo. O sed não foi projetado para ser particularmente legível. Ele foi projetado para ser muito pequeno e muito eficiente em servidores unix muito pequenos.

  • awk. Ele tem um escopo de trabalho um pouco menos fixo e menos simples. No entanto, o loop principal de um programa awk é definido pela leitura implícita das linhas de um arquivo de origem.

Essas não são linguagens de programação "completas". Enquanto você pode - com algum trabalho - escrever programas bastante sofisticados no awk, rapidamente se torna complicado e difícil de ler.

Coisa 2 - linguagens de programação de uso geral. Eles possuem uma rica variedade de tipos de instruções, inúmeras estruturas de dados integradas e nenhuma suposição ou atalho com fio para falar.

  • Perl.

  • Pitão.

Quando usá-los.

  • sed. Nunca. Realmente não tem nenhum valor na era moderna dos computadores com mais de 32K de memória. Perl ou Python fazem as mesmas coisas mais claramente.

  • awk. Nunca. Como o sed, ele reflete uma era anterior da computação. Em vez de manter esse idioma (além de todos os outros necessários para um sistema bem-sucedido), é mais agradável simplesmente fazer tudo em um idioma agradável.

  • Perl. Qualquer problema de programação de qualquer tipo. Se você gosta de sintaxe de pensamento livre, onde existem muitas, muitas maneiras de fazer a mesma coisa, perl é divertido.

  • Pitão. Qualquer problema de programação de qualquer tipo. Se você gosta de sintaxe bastante limitada, onde há menos opções, menos sutileza e (talvez) mais clareza. A natureza orientada a objetos do Python o torna mais adequado para problemas grandes e complexos.

Antecedentes - Não estou me esquecendo da ignorância. Aprendi awk há mais de 20 anos. Fiz muitas coisas com isso; usado para ensiná-lo como uma habilidade central do unix. Eu aprendi Perl cerca de 15 anos atrás. Fez muitas coisas sofisticadas com isso. Eu deixei os dois para trás porque posso fazer as mesmas coisas em Python - e é mais simples e mais claro.

Existem dois problemas sérios com o sed e o awk, nenhum dos quais tem a idade.

  1. A incompletude de sua implementação. Tudo o que o sed e o awk fazem pode ser feito em Python ou Perl, geralmente mais simples e às vezes mais rápido também. Um pipeline de shell tem algumas vantagens de desempenho devido ao seu multiprocessamento. O Python oferece um subprocessmódulo para me permitir recuperar essas vantagens.

  2. A necessidade de aprender mais um idioma. Ao fazer as coisas em Python (ou Perl), sua implementação depende de menos idiomas, com um aumento resultante de clareza.


66
Alguns argumentos bastante tolos contra awk / sed. A chave ajustável não suplantou a chave de boca aberta pelo mesmo motivo que o sed e o awk ainda são enviados. Às vezes, a ferramenta simples é a melhor para o trabalho. Eu escrevo um monte de perl, mas para uma cadeia simples de comandos canalizado, awk / sed são mais rápidos do que perl -e
RET

27
Você não pode assumir a disponibilidade de nada além de sh, sed e awk na maioria dos sistemas unix não-linux. Se você deseja que algo funcione em uma instalação Solaris, HP / UX ou AIX pronta para o uso, você está preso com o sed e o awk.
ConcernedOfTunbridgeWells

27
Metade dos meus scripts de shell usa sed ou awk. Eles estão longe de morrer. Python é minha linguagem de script preferida, mas às vezes sed e awk são a melhor ferramenta para o trabalho. Só porque eles estão em uso há muitos anos, não significa que eles sejam obsoletos.
Jeremy Cantrell

16
@ S.Lott: Não estou sugerindo que alguém tente criar um aplicativo Web no awk, mas dizer que nunca deve ser usado é um pouco escandaloso. Para um simples s & re e / ou tweak (especialmente para um arquivo de texto delimitado), perl -e ou python -c nunca será tão eficiente quanto um one-liner sed / awk.
RET

25
Não gosto de respostas assim. Sed e awk são fáceis de entender em poucas horas e muito mais leves e amplamente disponíveis do que um idioma completo. A programação do shell é mais relevante do que nunca, dizendo "NUNCA" use essa ou aquela ferramenta é simplesmente retardada. Mas, essa ideia retardada não foi um dos fundamentos sobre os quais Perl surgiu? Oh bem--
ata

14

Quando usá-los: awk - never - S. Lott.

Acho que S. Lott errou um pouco a marca com esta recomendação. O fato é que, no Linux e nos outros ambientes UNIX, o awk é uma ferramenta útil para ser usada com o bash, sh e ksh para processamento rápido de texto. A idéia do script em si é que você resolva seu problema colando essa ferramenta, essa ferramenta. Portanto, nos scripts de administração, é comum ter ls, grep, |, awk, time, ps etc. etc. .

Por exemplo, eu sou um membro da equipe que gerencia suprimentos de equipamentos de paintballdotcom. Este site de comércio eletrônico é baseado na pilha LAMP. Para processamento automatizado e normalização de feeds de dados de vários fornecedores no banco de dados back-end, empregamos e mantemos uma mistura diversificada de scripts, incluindo bash, perl, php e até mesmo expectativas. Cada um tem seus pontos fortes com base nos módulos e na API disponíveis. Nos scripts bash, fazemos uma correspondência rápida de padrões e ações apropriadas nos padrões, conforme necessário, usando o awk sem a necessidade de mudar para PERL. Uma coisa que eu também gostaria de salientar, que não foi enfatizada no segmento, é que um bom número desses scripts foi comprado ou obtido a partir do código aberto. Se o script veio como Perl, nós o mantemos como Perl; se o script veio como Php, nós o mantemos como Php; se veio como bash, nós o mantemos como bash;


7
foi S.Lott quem escreveu a resposta que você citou, e não brian d foy ...
plusplus

5
Como nota lateral nesta resposta bastante antiga: nunca analise a saída de ls, use glob. Leia isso.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.