Quando usar grep, less, awk, sed [fechado]

17

Estou entrando no mundo do Linux e no trabalho estou usando grepcada vez mais. Ao fazer isso, estou descobrindo que às vezes não é adequado para o que quero.

Eu estava lutando com grepalguns dias atrás e um colega meu, que é um administrador sênior do Linux, me disse para usar awk. Fiquei surpreso com a rapidez com que obtive um resultado.

Então, minha pergunta é quando você escolhe usar um sobre o outro? Que perguntas posso me fazer antes de trabalhar grepe gastar muito tempo, quando eu poderia ter feito isso awke economizado tempo?

frankguthrie
fonte
Essa é uma boa pergunta, mas é realmente muito ampla e primariamente baseada em opiniões. Para responder sua pergunta, usar grep em vez de awk realmente depende de quão confortável você está usando awk / sed. Existem algumas razões pelas quais alguém usaria isso em relação ao último, como procurar algo mais específico do que o grep tem a oferecer ou se você estiver tentando substituir / editar arquivos por uma sequência específica (usando sed). Mas, novamente, tudo depende do seu nível de conforto e experiência com o uso do awk / sed.
precisa saber é o seguinte
7
Use lesspara visualizar um arquivo. Use greppara pesquisar um arquivo. Use sedpara editar um arquivo. Use awksobre grepe sedquando o arquivo que você deseja processar tiver algum tipo de estrutura (como colunas). Use sedsobre awkquando você quer principalmente para lidar com linhas (tais como linhas de apagar ou adicionar de texto). Tenho certeza de que alguém escreverá uma resposta de 20 páginas mais completa que a minha.
Satō Katsura
Oi Sato, não é sobre o comprimento, mas o que é dito. E você poucas linhas são muito informativas. Obrigado.
frankguthrie

Respostas:

25

sede awksão superconjuntos grep, existem coisas que são mais fáceis de fazer com um ou outro.

grep foopode ser escrito sed '/foo/!d'ou awk /foo/, mas considere:

grep -i footeria que ser, a sed '/[fF][oO][oO]/!d'menos que você queira considerar extensões não-padrão como as GNU sed '/foo/I!d'. Ou com awk: awk 'tolower($0) ~ /foo/'ou novamente usando uma extensão GNU: awk -v IGNORECASE=1 /foo/.

Coisas nas quais as diferentes ferramentas são boas e complicadas com as outras ferramentas:

grep

grepé uma ferramenta simples, mas possui modos de operação muito especializados, mais difíceis de reproduzir com awkou sed:

  • grep -i para correspondência sem distinção entre maiúsculas e minúsculas (veja acima)
  • grep -Fe "$string"para pesquisa de cadeia fixa ( export string; awk 'index($0, ENVIRON["string"])'com awk, sem equivalente direto com sed).
  • (não padrão) grep -rpara pesquisa recursiva
  • (não padrão) grep -P/ pcregreppara regexps do tipo perl (algumas sedimplementações têm suporte para regexp do tipo perl, embora não sejam as principais)
  • (não padrão) grep -opara retornar a parte correspondente (várias linhas awkou sedfazer o mesmo)
  • (não padrão) grep -A/B/Cpara retornar o contexto durante a partida (novamente doloroso de fazer da mesma maneira com sedou awk)

sed

  • s/foo/bar/sedO scomando :: possui recursos difíceis de implementar, awkcomo:
  • s/foo\(.*\)bar/\1/g: captura (embora o GNU awk tenha uma gensub()extensão para isso)
  • s/foo/bar/3: substitua a 3ª ocorrência em cada linha
  • (não padrão): edição de arquivos no local (embora agora também seja suportado pelo GNU awk).

awk

awk é o mais rico em recursos dos três.

  • bom para lidar com números
  • bom para lidar com entrada formatada em colunas.
  • bom para extrair e combinar dados de diferentes fontes, com suas matrizes associativas.

perl

perlcomo uma ferramenta prática de extração e relatório, tem o melhor de todos. Foi para isso que ele foi projetado inicialmente (para ser a ferramenta que torna todos aqueles sed/ awkobsoletos).

O domínio perldo processamento de texto oferece uma vantagem séria. Eu recomendo dedicar algum tempo, mesmo antes de olhar para os sedcomandos menos comuns, por exemplo.

desempenho

Como regra geral, quanto mais especializada for a ferramenta, mais eficiente ela estará na tarefa. Mas isso também depende muito da implementação, a tarefa e alguns outros fatores e desempenho podem ter trocas que podem precisar ser levadas em consideração.

Por exemplo, há alguns grepou sedimplementações que são muito rápido, mas, por exemplo, eles não suportam caracteres de vários bytes por isso só pode funcionar corretamente em texto US-Inglês em locais de vários bytes. Ou são rápidos porque trabalham em um pequeno buffer de tamanho fixo e, portanto, não podem funcionar com entradas arbitrárias ...

Stéphane Chazelas
fonte
Excelente resposta! Você conhece a eficiência das ferramentas? Estou confuso com a afirmação do OP, que awké muito mais rápida que grep.
pfnuesel
@pfnuesel, isso depende muito da implementação e do padrão de uso. Por exemplo, mawké conhecido por ser muito eficiente (mas não suporta caracteres de vários bytes que é parte da razão pela qual é mais eficiente do que algumas outras ferramentas)
Stéphane Chazelas