Todo administrador de sistema tem que lidar com arquivos de texto simples diariamente. 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 ter que fazer uma pesquisa no Google.
Neste artigo, revisaremos o sed, o conhecido editor de stream, e compartilharemos 15 dicas para usá-lo a fim de cumprir os objetivos mencionados anteriormente e muito mais.
Ferramentas como cabeça e cauda nos permitem ver a parte inferior ou superior de um arquivo. E se precisarmos ver uma seção no meio? O seguinte sed one-liner retornará linhas 5 Através dos 10 a partir de meuarquivo.txt:
# sed -n '5,10p' meuarquivo.txt.
Por outro lado, é possível que você queira imprimir o arquivo inteiro, exceto um determinado intervalo. Para excluir linhas 20 Através dos 35 a partir de meuarquivo.txt, Faz:
# sed '20, 35d 'meuarquivo.txt.
É possível que você esteja interessado em um conjunto de linhas não consecutivas ou em mais de um intervalo. Vamos mostrar as linhas 5-7 e 10-13 a partir de meuarquivo.txt:
# sed -n -e '5,7p' -e '10, 13p 'meuarquivo.txt.
Como você pode ver, o -e
opção nos permite executar uma determinada ação (neste caso, linhas de impressão) para cada intervalo.
Para substituir todas as ocorrências da palavra versão
com história
em meuarquivo.txt, Faz:
# sed 's / version / story / g' myfile.txt.
Além disso, você pode querer considerar o uso kimono
ao invés 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 de show de rota ip
e um pipeline:
# ip route show | sed 's / * / / g'
Compare a saída de show de rota ip
com e sem o pipeline:
Se você estiver interessado em substituir palavras apenas dentro de um intervalo de linha (30 Através dos 40, por exemplo), você pode fazer:
# sed '30, 40 s / versão / história / g 'meuarquivo.txt.
Claro, você pode indicar uma única linha por meio de seu número correspondente, em vez de um intervalo.
Às vezes, os arquivos de configuração são carregados com comentários. Embora isso seja certamente útil, pode ser útil exibir apenas as diretivas de configuração às vezes, se você quiser ver todas elas de relance.
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 de circunflexo seguido pelo sinal de número (^#)
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 particular, o arquivo de configuração do Apache tem linhas com # 'S
não no início de algumas linhas, então *#
é usado para removê-los também.
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 fecho eclair ou Fecho eclair com rar em meuarquivo.txt:
# sed 's / [Zz] ip / rar / g' meuarquivo.txt.
Não perca:Use Awk com expressões regulares para filtrar texto em arquivos
Outro uso de sed consiste em imprimir as linhas de um arquivo que correspondem a uma dada expressão regular. Por exemplo, podemos estar interessados em ver as atividades de autorização e autenticação que ocorreram em 2 de julho, conforme /var/log/secure entrar em um CentOS 7 servidor.
Neste caso, o padrão a ser pesquisado é 2 de julho no início de cada linha:
# sed -n '/ ^ 01 de julho / p' / var / log / secure.
Com sed, também podemos inserir espaços (linhas em branco) para cada linha não vazia em um arquivo. Para inserir uma linha em branco a cada duas linhas em LICENÇA, um arquivo de texto simples, faça:
# sed G meuarquivo.txt.
Para inserir duas linhas em branco, faça:
# sed 'G; G 'meuarquivo.txt.
Adicione um G maiúsculo separados por ponto e vírgula se quiser adicionar mais linhas em branco. A imagem a seguir ilustra o exemplo descrito nesta dica:
Esta dica pode ser útil se você deseja inspecionar um arquivo de configuração grande. Inserir um espaço em branco a cada duas linhas e direcionar a saída para menos resultará em uma experiência de leitura mais amigável.
O dos2unix programa converte arquivos de texto simples da formatação do 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 simular 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 //' meuarquivo.txt.
Observe que o -eu
opção indica edição no local. Em seguida, as alterações não retornarão à tela, mas serão salvas no arquivo.
Observação: Você pode inserir caracteres de nova linha do DOS enquanto editar um arquivo no editor vim com Ctrl + V
e Ctrl + M
.
Na dica anterior, usamos sed para modificar um arquivo, mas não salvou o arquivo original. Às vezes, é uma boa ideia salvar uma cópia de backup do arquivo original para garantir.
Para fazer isso, indique um sufixo após o -eu
opção (entre aspas simples) a ser usada para renomear o arquivo original.
No exemplo a seguir, substituiremos todas as instâncias de isto ou este (ignorando maiúsculas e minúsculas) com isso em meuarquivo.txt, e vamos salvar o arquivo original como meuarquivo.txt.orig.
Finalmente, vamos usar utilitário diff para identificar as diferenças entre os dois arquivos:
# sed -i'.orig '' s / this / that / gi 'myfile.txt.
Suponhamos que você tenha um arquivo contendo nomes completos no formato Primeiro nome, Último nome. Para processar o arquivo de forma adequada, você pode querer alternar Último nome e Primeiro nome.
Podemos fazer isso com sed facilmente:
# sed 's / ^ \ (. * \), \ (. * \) $ / \, / g' names.txt.
Na imagem acima, podemos ver que os parênteses, sendo caracteres especiais, precisam ser escapados, assim como os números 1 e 2.
Esses números representam as expressões regulares destacadas (que precisam aparecer entre parênteses):
A saída desejada é indicada no formato SecondColumn (Último nome) + vírgula + espaço + Primeira coluna (Primeiro nome). Sinta-se à vontade para alterá-lo para o que desejar.
Às vezes, substituir todas as ocorrências de uma determinada palavra, ou algumas poucas aleatórias, não é exatamente o que precisamos. Talvez seja necessário realizar a substituição se uma correspondência separada for encontrada.
Por exemplo, podemos querer substituir começar com Pare somente se a palavra serviços for encontrada na mesma linha. Nesse cenário, aqui está o que vai acontecer:
Precisamos começar a festejar no trabalho, mas vamos nos lembrar de iniciar todos os serviços primeiro.
Na primeira linha, começar não será substituído por Pare uma vez que a palavra serviços não aparece nessa linha, ao contrário da segunda linha.
# sed '/ services / s / start / stop / g' msg.txt.
Você pode combinar duas ou mais substituições, uma única sed comando. Vamos substituir as palavras que e linha em meuarquivo.txt com Este e verso, respectivamente.
Observe como isso pode ser feito usando um sed comando de substituição seguido por um ponto e vírgula e um segundo comando de substituição:
# sed -i 's / that / this / gi; s / line / verse / gi 'meuarquivo.txt.
Essa dica é ilustrada na imagem a seguir:
É claro, sed pode ser combinado com outras ferramentas para criar comandos mais poderosos. Por exemplo, vamos usar o exemplo dado em DICA # 4 e extrair nosso endereço IP da saída do rota de ip
comando.
Começaremos imprimindo apenas a linha onde a palavra src
é. Em seguida, converteremos vários espaços em um único. Finalmente, vamos cortar o 9º campo (considerando um único espaço como separador de campo), que é onde 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:
Neste guia, compartilhamos 15 dicas e truques do sed para ajudá-lo nas 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ê!
Não perca:Dominar o comando 'Awk' do Linux com dicas e truques