Pesquisa de site

15 dicas de comando Sed para tarefas de administração de sistema Linux


Todo administrador de sistema precisa lidar diariamente com arquivos de texto simples. Saber como visualizar certas seções, como substituir palavras e como filtrar o conteúdo desses arquivos são habilidades que você precisa ter em mãos sem precisar fazer uma pesquisa no Google.

Neste artigo revisaremos o sed, o conhecido editor de stream, e compartilharemos 15 dicas para usá-lo para atingir os objetivos mencionados anteriormente e muito mais.

O que é o comando Sed?

O comando 'sed', abreviação de editor de fluxo, é uma ferramenta versátil e poderosa de manipulação de texto que opera em fluxos de texto, permitindo aos usuários realizar diversas operações em dados, como pesquisar, substituir, inserir e excluir. ‘Sed’ usa expressões regulares para definir padrões para manipulação de texto e pode ser empregado para tarefas de edição em lote e processamento de texto em scripts.

Um de seus recursos notáveis é a edição local, onde pode modificar arquivos diretamente ou criar cópias de backup enquanto faz alterações. ‘Sed‘ é uma ferramenta essencial para administradores de sistema, programadores e qualquer pessoa que lide com tarefas de transformação de texto e manipulação de dados na linha de comando.

A seguir estão alguns comandos ‘sed’ comuns com exemplos:

1. Visualizando um intervalo de linhas de um arquivo

Ferramentas como head e tail nos permitem visualizar a parte inferior ou superior de um arquivo. E se precisarmos ver uma seção no meio? A linha sed a seguir retornará as linhas 5 a 10 de tecmint.txt:

sed -n '5,10p' tecmint.txt

2. Visualizando o arquivo inteiro, exceto um determinado intervalo

Por outro lado, é possível que você queira imprimir o arquivo inteiro, exceto um determinado intervalo. Para excluir as linhas 20 a 35 de tecmint.txt, faça:

sed '20,35d' myfile.txt

3. Visualização de linhas e intervalos não consecutivos

É possível que você esteja interessado em um conjunto de linhas não consecutivas ou em mais de um intervalo. Vamos exibir as linhas 5-7 e 10-13 de tecmint.txt:

sed -n -e '5,7p' -e '10,13p' tecmint.txt

Como você pode ver, a opção -e nos permite executar uma determinada ação (neste caso, imprimir linhas) para cada intervalo.

4. Substituindo palavras ou strings em um arquivo

Para substituir todas as instâncias da palavra version por story em tecmint.txt, faça:

sed 's/version/story/g' tecmint.txt

Além disso, você pode considerar usar gi em vez de g para ignorar maiúsculas e minúsculas:

sed 's/version/story/gi' myfile.txt

Para substituir vários espaços em branco por um único espaço, usaremos a saída do comando ip route show com um pipeline:

ip route show | sed 's/  */ /g'

Compare a saída de ip route show com e sem o pipeline:

5. Substituindo palavras ou strings dentro de um intervalo

Se estiver interessado em substituir palavras apenas dentro de um intervalo de linhas (30 a 40, por exemplo), você pode fazer:

sed '30,40 s/version/story/g' tecmint.txt

Claro, você pode indicar uma única linha através do número correspondente em vez de um intervalo.

6. Remova comentários de um arquivo

Às vezes, os arquivos de configuração são carregados com comentários. Embora isso seja certamente útil, às vezes pode ser útil exibir apenas as diretivas de configuração se você quiser visualizá-las todas rapidamente.

Para remover linhas vazias ou aquelas que começam com # do arquivo de configuração do Apache, faça:

sed '/^#\|^$\| *#/d' httpd.conf

O sinal circunflexo é seguido pelo sinal numérico (^#) indica o início de uma linha, enquanto ^$ representa linhas em branco. As barras verticais indicam operações booleanas, enquanto a barra invertida é usada para escapar das barras verticais.

Neste caso específico, o arquivo de configuração do Apache possui linhas com #’s e não no início de algumas linhas, então *# é usado para removê-los também.

7. Substitua uma palavra que não diferencia maiúsculas de minúsculas em um arquivo

Para substituir uma palavra que começa com maiúscula ou minúscula por outra palavra, também podemos usar sed. Para ilustrar, vamos substituir a palavra zip ou Zip por rar em tecmint.txt:

sed 's/[Zz]ip/rar/g' tecmint.txt

8. Encontrando eventos específicos em um arquivo de log

Outro uso do sed consiste em imprimir as linhas de um arquivo que correspondem a uma determinada expressão regular. Por exemplo, podemos estar interessados em visualizar as atividades de autorização e autenticação que ocorreram em 2 de julho, conforme /var /log/secure faça login em um servidor CentOS.

Nesse caso, o padrão a ser pesquisado é 2 de julho no início de cada linha:

sed -n '/^Jul  1/ p' /var/log/secure

9. Inserindo espaços ou linhas em branco em um arquivo

Com sed, também podemos inserir espaços (linhas em branco) para cada linha não vazia de um arquivo. Para inserir uma linha em branco a cada duas linhas em LICENSE, um arquivo de texto simples, faça:

sed G tecmint.txt

Para inserir duas linhas em branco, faça:

sed 'G;G' tecmint.txt

Adicione um G maiúsculo separado por ponto e vírgula se desejar adicionar mais linhas em branco. A imagem a seguir ilustra o exemplo descrito nesta dica:

Esta dica pode ser útil se você quiser inspecionar um arquivo de configuração grande. Inserir um espaço em branco a cada duas linhas e canalizar a saída para less resultará em uma experiência de leitura mais amigável.

10. Removendo ^M em um arquivo

O programa dos2unix converte arquivos de texto simples da formatação Windows/Mac para Unix/Linux, removendo caracteres de nova linha ocultos inseridos por alguns editores de texto usados nessas plataformas. Se não estiver instalado em seu sistema Linux, você pode imitar sua funcionalidade com sed em vez de instalá-lo.

Na imagem à esquerda podemos ver vários caracteres de nova linha do DOS (^M), que foram posteriormente removidos com:

sed -i 's/\r//' myfile.txt

Observe que a opção -i indica edição no local. Então as alterações não retornarão à tela, mas serão salvas no arquivo.

Nota: Você pode inserir caracteres de nova linha do DOS enquanto edita um arquivo no editor Vim com Ctrl+V e Ctrl+M.

11. Crie um arquivo de backup com o comando Sed

Na dica anterior, usamos sed para modificar um arquivo, mas não salvamos o arquivo original. Às vezes, é uma boa ideia salvar uma cópia de backup do arquivo original, apenas para garantir.

Para isso, indique um sufixo após a opção -i (entre aspas simples) a ser usado para renomear o arquivo original.

No exemplo a seguir, substituiremos todas as instâncias de este ou Este (ignorando maiúsculas e minúsculas) por aquilo em meuarquivo.txt e salvaremos o arquivo original como myfile.txt.orig.

Finalmente, usaremos o utilitário diff para identificar as diferenças entre os dois arquivos:

sed -i'.orig' 's/this/that/gi' myfile.txt

12. Trocando pares de palavras em um arquivo

Suponhamos que você tenha um arquivo contendo nomes completos no formato Nome, Sobrenome. Para processar o arquivo adequadamente, você pode querer trocar Sobrenome e Nome.

Podemos fazer isso com sed facilmente:

sed 's/^\(.*\),\(.*\)$/\, /g' names.txt

Na imagem acima podemos ver que os parênteses, por serem caracteres especiais, precisam ter escape, assim como os números 1 e 2.

Esses números representam as expressões regulares destacadas (que precisam aparecer entre parênteses):

  • 1 representa o início de cada linha até a vírgula.
  • 2 é um espaço reservado para tudo que está à direita da vírgula até o final da linha.

A saída desejada é indicada no formato SegundaColuna (Sobrenome) + vírgula + espaço + PrimeiraColuna (Nome). Sinta-se à vontade para alterá-lo para o que desejar.

13. Substituindo palavras somente se uma correspondência separada for encontrada

Às vezes, substituir todas as ocorrências de uma determinada palavra, ou algumas aleatórias, não é exatamente o que precisamos. Talvez precisemos realizar a substituição se for encontrada uma correspondência separada.

Por exemplo, podemos querer substituir iniciar por parar apenas se a palavra serviços for encontrada na mesma linha. Nesse cenário, eis o que acontecerá:

We need to start partying at work,
but let’s remember to start all services first.

Na primeira linha, start não será substituído por stop uma vez que a palavra services não aparece nessa linha, ao contrário da segunda linha.

sed '/services/ s/start/stop/g' msg.txt

14. Realizando duas ou mais substituições ao mesmo tempo

Você pode combinar duas ou mais substituições em um único comando sed. Vamos substituir as palavras that e line em myfile.txt por This e verse, respectivamente.

Observe como isso pode ser feito usando um comando de substituição sed comum seguido por um ponto e vírgula e um segundo comando de substituição:

sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

Essa dica está ilustrada na imagem a seguir:

15. Combinando Sed e outros comandos

Claro, sed pode ser combinado com outros comandos do Linux para criar comandos mais poderosos. Por exemplo, vamos usar o exemplo dado na TIP #4 e extrair nosso endereço IP da saída do comando ip route.

Começaremos imprimindo apenas a linha onde está a palavra src. Em seguida, converteremos vários espaços em um único. Por fim, vamos cortar o campo (considerando um único espaço como separador de campos), que é onde está o endereço IP:

ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

A imagem abaixo ilustra cada etapa do comando acima:

Resumo

Neste guia, compartilhamos 15 dicas e truques do sed para ajudá-lo em suas tarefas diárias de administração do sistema. Existe alguma outra dica que você usa regularmente e gostaria de compartilhar conosco e com o resto da comunidade?

Em caso afirmativo, sinta-se à vontade para nos informar usando o formulário de comentários abaixo. Perguntas e comentários também são bem-vindos – estamos ansiosos para ouvir de você!