Qual é a diferença entre sed e awk? [fechadas]

497
  • Qual é a diferença entre awk e sed?
  • Que tipo de aplicativo são os melhores casos de uso para ferramentas sed e awk?
Rachel
fonte
2
Um controle de qualidade relacionado no unix.stackexchange: existe um tutorial básico para grep, awk e sed?
Dani

Respostas:

549

sedé um editor de stream. Funciona com fluxos de caracteres por linha. Possui uma linguagem de programação primitiva que inclui loops no estilo goto e condicionais simples (além da correspondência de padrões e correspondência de endereços). Existem essencialmente apenas duas "variáveis": espaço de padrão e espaço de espera. A legibilidade dos scripts pode ser difícil. Operações matemáticas são extraordinariamente estranhas, na melhor das hipóteses.

Existem várias versões sedcom diferentes níveis de suporte para opções de linha de comando e recursos de idioma.

awké orientado para campos delimitados por linha. Tem muito mais robusto, incluindo construções de programação if/ else, while, do/ whilee for(C-estilo e iteração da matriz). Existe suporte completo para variáveis ​​e matrizes associativas de dimensão única mais matrizes multidimensionais kludgey (IMO). As operações matemáticas se assemelham às de C. Tem printfe funciona. O "K" em "AWK" significa " K ernighan", como em "Kernighan e Ritchie" do livro "C Programming Language" (famoso para linguagem de programação C) (para não esquecer A ho e W einberger). Pode-se conceber escrever um detector de plágio acadêmico usando awk.

O GNU awk( gawk) possui inúmeras extensões, incluindo matrizes multidimensionais verdadeiras na versão mais recente. Existem outras variações de awkinclusão mawke nawk.

Ambos os programas usam expressões regulares para selecionar e processar texto.

Eu tenderia a usar sedonde há padrões no texto. Por exemplo, você pode substituir todos os números negativos em algum texto que esteja no formato "sinal de menos seguido por uma sequência de dígitos" (por exemplo, "-231,45") pelo formulário "colchetes do contador" (por exemplo "(231,45)" ) usando este (que tem espaço para melhorias):

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

Eu usaria awkquando o texto se parecer mais com linhas e colunas ou, como awkse refere a eles "registros" e "campos". Se eu fosse fazer uma operação semelhante à anterior, mas apenas no terceiro campo em um arquivo delimitado por vírgula, eu poderia fazer algo como:

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

É claro que esses são apenas exemplos muito simples que não ilustram toda a gama de recursos que cada um tem a oferecer.

Pausado até novo aviso.
fonte
7
Para ver alguns exemplos de como ultrapassar os limites de sed: sed.sourceforge.net/#scripts
Pausado até novo aviso.
@DennisWilliamson - Estou em desvantagem se aprender apenas awk? O awk é muito mais usado que o sed?
Steam
4
@ Blasto: Minha recomendação é aprender os dois, mas com mais ênfase no awk. Muitas coisas de expressão regular se aplicam a ambas (e a outras ferramentas e idiomas). Use sed para coisas mais simples e tente evitar coisas complexas. É muito legal poder fazer loops e ramificações no sed, mas as linhas de comando resultantes são complexas e difíceis de ler. A resposta para sua pergunta realmente depende do que você está fazendo.
Pausado até novo aviso.
@DennisWilliamson - O que seria mais útil para um desenvolvedor de ETL? ETL ou Extract Transform and Load é um termo de data warehousing. Em outras palavras, o trabalho envolve EXTRACÇÃO de dados de diferentes fontes diferentes (como bancos de dados, arquivos excel, arquivos csv etc.), TRANSFORMAÇÃO dos mesmos e CARREGAMENTO em um datawarehouse (DW) para análise, localização de padrões nos dados ou apenas histórico registros. por exemplo. O uso final de um DW - Algoritmos aplicados a um DW de uma mercearia com dados dos últimos 10 anos pode revelar que pessoas que tendem a comprar maçãs também compram laranjas ou algo semelhante.
Steam
1
Apenas um FYI para quem se deparar com isso em um mac, tente "sed -E's / - ([0-9] +. [0-9] *) / (\ 1) / g '" para o primeiro exemplo sed
Daniel Schmidt
124

1) Qual é a diferença entre awk e sed?

Ambas são ferramentas que transformam texto. MAS o awk pode fazer mais coisas além de apenas manipular o texto. É uma linguagem de programação por si só com a maioria das coisas que você aprende em programação, como matrizes, loops, controle de fluxo if / else etc. Você pode "programar" no sed também, mas não deseja manter o código escrito nela .

2) Que tipo de aplicativo são os melhores casos de uso para ferramentas sed e awk?

Conclusão: use sed para análise de texto muito simples. Qualquer coisa além disso, o awk é melhor. De fato, você pode abandonar o sed completamente e apenas usar o awk. Como suas funções se sobrepõem e o awk pode fazer mais, basta usar o awk. Você também reduzirá sua curva de aprendizado.

ghostdog74
fonte
7
Ponto agradável sobre a curva de aprendizagem .. muitas ferramentas podem confusão .. então eu prefiro grep aprendendo e awk única .. deixa esquecer sed :)
Outlier
174
^^ Chega de sed. (desculpe, eu tinha a)
Greg M. Krsak
8
Eu acho que sed é muito mais fácil de aprender, então você precisa dar conta disso. À medida que você aprende a dominar o awk, pode ser útil aprender rapidamente o sed para poder usá-lo mais rapidamente em coisas que você talvez ainda não saiba como fazer no awk.
Didier A.
1
@GregKrsak você fez o meu dia. (desculpe, eu tinha a)
Abel Callejo
15
Não descarte sed, 's/search/replace'é muito mais fácil digitar do que awka sintaxe e é o que você precisa na maioria das vezes.
precisa saber é o seguinte
54

Ambas as ferramentas destinam-se a trabalhar com texto e existem tarefas para as quais elas podem ser usadas.

Para mim, a regra para separá-los é: Use sedpara automatizar tarefas que você faria de outra maneira em um editor de texto manualmente. É por isso que é chamado editor de stream . (Você pode usar os mesmos comandos para editar texto no vim). Use awkse você quiser analisar texto, ou seja, contar campos, calcular totais, extrair e reorganizar estruturas etc.

Além disso, você não deve esquecer grep. Use grepse você quiser apenas pesquisar / extrair algo em um texto (arquivo)

hek2mgl
fonte