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.
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.
Respostas:
Em ordem de aparição, as línguas são sed
, awk
, perl
, python
.
O sed
programa é 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 ed
editor 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 awk
programa (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 a2p
e s2p
para a conversão de awk
scripts e sed
scripts 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 awk
nem 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?
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).
awk
o sed
aprendizado (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 tsawk
antes de você se conectar a ele. Costumo recorrer ao Perl (mas você pode se sair melhor com Python) quando uma tarefa é demais awk
.
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.
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.
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.
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.
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 subprocess
módulo para me permitir recuperar essas vantagens.
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.
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;
ls
, use glob. Leia isso.