sábado, 30 de janeiro de 2010

Rodando seu script como "service"

No directório /etc/rc.d/init.d, crie ou copie o seu script. Com o seu script pronto e copiado no directório indicado, segue abaixo exemplo com comentários sobre cada linha.

No exemplo abaixo altere as linhas e conteúdos para melhor adaptar as suas necessidades.

#!/bin/bash

#!/bin/bash
#
# chkconfig: 2345 25 40
#
#description: Firewall CMM
#
# processname: firewall
# pidfile: /var/run/firewall.pid
# config: /etc/rc.d/firewall

# biblioteca Source function.
# Função que habilita a opções de botão - OK
. /etc/rc.d/init.d/functions

# Se você utiliza o chkconfig para habilitar serviços a linhas abaixo permite que ele
# inicie na posição ou ordem de 97 e seja inicializado no level 3 e 5.
####Also, if the script name ends in .sh, the script will be sourced in runlevel S rather than being run in a forked subprocess, but will be explicitly run by sh in all other runlevels.

iniciar(){

    #######################
    ###     Flush as regras          ###
    #######################
    iptables -F
    iptables -Z
    iptables -X
    iptables -t nat -F
    echo "*******************************************************"
    echo "**  Iniciar configuração da firewall do Seridor WEB  **"
    echo "*******************************************************"
    #    Desactiva o suporte a ICMP redirects uma vez que o servidor não actua como rooter
    #     este recurso quando ligado alerta os outros servidores que existe um caminho melhor para um determinado endereço ou rede, mas não reencaminha pacotes.
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

    #    Desativa o suporte a ping broadcasts, um recurso que tem poucos usos legítimos e pode ser usado
    #     para fazer com que servidores participem involuntariamente de ataques DoS,
    #    enviando grandes quantidades de pings a outros servidores dentro da mesma faixa de endereços.
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

    #    desativa o suporte ao source routing
    #    Este é um recurso usado para testes de routers
    #    permite ao emissor especificar qual o caminho que o pacote tomará até o destino e também o caminho de volta
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

    #    O servidor WEB não deverá compartilhar a conexão,
    #    nem encaminhar pacotes de outros hosts. Devemos desactivar o suporte a ip_forward:
    echo 0 > /proc/sys/net/ipv4/ip_forward

    #    Uma conexão TCP é iniciada através da troca de três pacotes entre o emissor e o destinatário, o famoso "three-way handshake".
    #    O emissor envia um pacote SYN, o destinatário responde com um pacote SYN/ACK e o emissor confirma, também enviando um pacote ACK.
    #    Se o servidor recebe um pacote SYN solicitando a abertura da conexão, mas não recebe o pacote ACK de resposta, ele é obrigado a esperar até que o tempo limite seja atingindo, mantendo a conexão aberta.
    #    Como existe um limite de conexões TCP que o servidor pode manter ativas simultaneamente, um grande volume de pacotes SYN podem estourar o limite de conexões, fazendo com que o servidor deixe de responder a novas conexões, mesmo que exista banda disponível.
    #    ativa o uso de SYN Cookies, um recurso oferecido diretamente pelo Kernel
    #    Ao ativar o recurso, o sistema passa a responder ao pacote SYN inicial com um cookie, que identifica o cliente
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies

    #    Regras que ativam o uso do rp_filter, de forma que o firewall sempre responda aos pacotes na mesma interface da qual eles foram originados.
    #    Previne ataques diversos que tentem tirar proveito da regra que permite conexões na interface de loopback
    echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

    #    O bloqueio de pacotes inválidos,  melhora a segurança contra ataques diversos,
    #    incluindo pacotes enviados sem serem precedidos pelo envio do pacote SYN e da abertura da conexão
    iptables -A INPUT -m state --state INVALID -j DROP

    # Abre para a interface de loopback:
    #########################
    ### liberta o loopback ###
    #########################
    iptables -A INPUT -p tcp -i lo -j ACCEPT
    #iptables -A OUTPUT -p tcp --syn -s 127.0.0.1/255.0.0.0 -j ACCEPT

    # Bloqueia um determinado IP. Use para bloquear hosts específicos:
    #iptables -A INPUT -p ALL -s 88.191.79.206 -j DROP

    # Abre as portas referentes aos serviços usados:
    echo "**"
    # SSH:
    #-j LOG gera um log em /var/log/messages
    iptables -A INPUT -p tcp --dport 22 -j LOG
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT

    echo "**"
    # DNS:
    iptables -A INPUT -p tcp --dport 53 -j ACCEPT
    iptables -A INPUT -p udp --dport 53 -j ACCEPT

    echo "**"
    # HTTP e HTTPS:
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT

    #Limita as respostas aos pings a 1 resposta por segundo 
    iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    echo "**"
    # Bloqueia conexões nas demais portas:
    iptables -A INPUT -p tcp --syn -j DROP

    # Garante que o firewall permitirá pacotes de conexões já iniciadas:
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    # Bloqueia as portas UDP de 0 a 1023 (com exceção das abertas acima):
    iptables -A INPUT -p udp --dport 0:1023 -j DROP
    echo "*******************************************************"
    echo "**                                                   **"
    echo "**                Firewall configurada               **"
    echo "*******************************************************"

}
parar(){
    iptables -F
    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
}

case "$1" in
    "start") iniciar ;;
    "stop") parar ;;
    "restart") parar; iniciar ;;
    *) echo "Use os parâmetros 'start' 'stop' ou 'restart' \n Ex:# firewall.sh start"
esac

#sleep 120
#./cleanfirewall.sh


exit 0

 

Para habilitar o script utilize da maneira que melhor se adapte, seguem exemplos.

Começamos por installar o nosso secript como um serviço:

# install -o root -g root -m 755 firewall /etc/rc.d/init.d

 

Adicionamos e inicializamos o serviço:

# chkconfig --add firewall

# service firewall start

# chkconfig firewall on

 

 

Podemos verificar que o serviço está activo com o comando:
# ntsysv

 

 

 

 

chkconfig -level 35 "meuscript" on
ou
# ntsysv -level 35 

Executando e analisando:

# service firewall start

Iniciando o Serviço ###TESTE###: [  OK  ]

Copiando Arquivo                 [  OK  ]

# service firewall stop

Parando o Serviço ###TESTE###:   [  OK  ]

# service firewall restart

Parando o Serviço ###TESTE###:   [  OK  ]

Iniciando o Serviço ###TESTE###: [  OK  ]

Copiando Arquivo                 [  OK  ]

 

Você poderá inserir quantos comandos quiser, tanto no start quanto no stop.

Um Erro clássico: service XYZ does not support chkconfig

Você faz um script shell, e ao tentar colocar ele na lista dos serviços de start e stop do servidor, recebe a mensagem do título deste post, veja como resolver, de forma simples.

Construindo scripts compatíveis com o SYSV:

1 - O script precisa começar (primeira linha) com

#!/bin/bash

ou

#!/bin/sh

 

2 - O script precisa ter a seguinte linha

# chkconfig: 2345 85 15

É isso mesmo, mais números :^)

Essa linha significa:
chkconfig --> aplicação que vai adicionar o script no SYSV 2345 --> níveis (diretórios) aonde o link para o script vai ser adicionado para start
85 --> sequência de "start"
15 --> sequência de "stop"

Vale lembrar que os níveis que não forem adicionados para start (S) serão automaticamente marcados para stop (K), no nosso caso será 016 (0,1 e 6).

3 - O script precisa ter uma descrição
# description: Aqui você coloca a descrição do seu script

4 - O script pode executar o script de funções do sistema
"/etc/rc.d/init.d/functions" para poder mostrar as mensagens de "OK", "FAILED" e "PASSED", existem outras funções que podem ser utilizadas, recomendo uma breve "fuçada" nesse script.

Lembre-se que isso é opcional, mas o seu uso é recomendado.

4- O script precisa ter sessões de "start" e "stop" (outras são opcionais).

OBS: Todas as linhas que tem sustenido (#) no início precisam realmente estar comentadas.

quinta-feira, 28 de janeiro de 2010

só Sed - Editor de textos não interativo

Autor: Thobias Salazar Trevisan

fonte:http://thobias.org/doc/sosed.html

só sed

Thobias Salazar Trevisan

21/05/2003


1. Introdução

Este texto se propõe a ser uma maneira fácil das pessoas acharem aquele sed perdido para resolver seu problema, ou seja, aqui vamos direto ao ponto, sem frescura ou enrolação.

Se você está procurando um texto que explique o SED, visite estes links:

 

1.1. Agradecimentos

A idéia de elaborar este documento surgiu em um mail do Aurélio para a lista de discussão sed-br. Se você quiser acompanhar as threads da criação aqui vão os links para as 3 threads principais:

1.        sed FAQ (era: Re: concatenar linhas

2.        FAQ sed

3.        Opine sobre o nome do documento da lista

Aqui vai meu muito obrigado para as pessoas que ajudaram na construção deste documento.

A galera que contribuiu:

 

1.2. Texto padrão

Em todos os exemplos vamos procurar manter sempre o mesmo texto para facilitar a compreensão das perguntas e respostas. Esperamos deste modo deixar o só sed mais amigável e que você ache a sua pergunta de maneira fácil e agil. =8)

Dica:

Leia o arquivo de entrada com calma. Analise-o, respire e releia-o.

Assim ficará mais fácil para você entender os exemplos e as mudanças ocorridas após a execução de cada sed.

O arquivo.txt de exemplo é:

  prompt> cat arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2. Brincando com Linhas

2.1. Imprimir somente as linhas com uma determinada string

 

sed -n '/dia/p'

 

  prompt> sed -n '/dia/p' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 


2.2. Imprimir somente a primeira ocorrência da linha com determinada string

 

sed -n '/dia/{p;q;}'

 

  prompt> sed -n '/dia/{p;q;}' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

 


2.3. Imprimir a última ocorrência da linha com determinada string

 

sed -n '/dia/h;${x;p;}'

 

  prompt> sed -n '/dia/h;${x;p;}' arquivo.txt

     No quarto dia, ficou com preguiça, então falou:

 


2.4. Imprimir da primeira ocorrência da string até o final

 

sed '/dia/,$!d'

 

  prompt> sed '/dia/,$!d' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.5. Imprimir da última ocorrência da string até o final

 

sed -n '/dia/{h;${x;p;};d;};H;${x;p;}'

 

  prompt> sed -n '/dia/{h;${x;p;};d;};H;${x;p;}' arquivo.txt

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.6. Apagar as linhas com uma determinada string

 

sed '/dia/d'

 

  prompt> sed  '/dia/d' arquivo.txt

  No início do início, era um nada.

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.7. Apagar apenas a primeira linha com determinada string I

 

sed '/dia/{H;x;/^\n/d;g;}'

 

  prompt> sed '/dia/{H;x;/^\n/d;g;}' arquivo.txt

  No início do início, era um nada.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.8. Apagar apenas a primeira linha com determinada string II

 

sed -n '/dia/{:a;n;p;ba;};p'

 

  prompt> sed -n '/dia/{:a;n;p;ba;};p' arquivo.txt

  No início do início, era um nada.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.9. Adicionar texto no início da linha

 

sed 's/^/texto incluido/'

 

 

  prompt> sed 's/^/texto incluido/' arquivo.txt

  texto incluidoNo início do início, era um nada.

  texto incluido No segundo dia, fez um rascunho à lápis.

  texto incluido  No terceiro dia, apagou e começou tudo de novo.

  texto incluido   No quarto dia, ficou com preguiça, então falou:

  texto incluido

  texto incluido- Sexta-feira eu continuo, se não estiver cansado...

  texto incluido

  texto incluido  E no fim, nada.

 


2.10. Adicionar texto no final da linha

 

sed 's/$/texto incluido/'

 

  prompt> sed 's/$/texto incluido/' arquivo.txt

  No início do início, era um nada.texto incluido

   No segundo dia, fez um rascunho à lápis.texto incluido

    No terceiro dia, apagou e começou tudo de novo.texto incluido

     No quarto dia, ficou com preguiça, então falou:texto incluido

  texto incluido

  - Sexta-feira eu continuo, se não estiver cansado...texto incluido

  texto incluido

    E no fim, nada.texto incluido

 


2.11. Retirar linhas em branco

 

sed '/^$/d'

 

  prompt> sed '/^$/d' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

  - Sexta-feira eu continuo, se não estiver cansado...

    E no fim, nada.

 


2.12. Incluir texto no início da linha N

OBS: troque o número 1 para a linha que você quiser

 

sed '1s/^/começo do arquivo/'

 

  prompt> sed '1s/^/começo do arquivo/'  arquivo.txt

  começo do arquivoNo início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.13. Incluir texto no final da linha N

OBS: troque o número 1 para a linha que você quiser

 

sed '1s/$/final da linha/'

 

  prompt> sed '1s/$/final da linha/' arquivo.txt

  No início do início, era um nada.final da linha

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.14. Incluir texto na linha N apagando o conteúdo existente

OBS: troque o número 1 para a linha que você quiser

 

sed '1s/.*/início do arquivo/'

 

  prompt> sed '1s/.*/início do arquivo/' arquivo.txt

  início do arquivo

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.15. Incluir texto antes da linha N

OBS: troque o número 1 para a linha que você quiser

 

sed -e '1i\' -e 'começo do arquivo'

 

  prompt> sed -e '1i\' -e 'começo do arquivo' arquivo.txt

  começo do arquivo

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.16. Incluir linha após a última

 

sed -e '$a\' -e 'linha final'

 

  prompt> sed -e '$a\' -e 'linha final' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

  linha final

 


2.17. Imprimir somente a linha N

OBS: troque o número 2 para a linha que você quiser

 

sed '2!d'

 

  prompt> sed '2!d' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

 


2.18. Retirar a linha N

OBS: troque o número 2 pela linha que você quiser

 

sed '2d'

 

  prompt> sed '2d' arquivo.txt

  No início do início, era um nada.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.19. Extrair um trecho de uma linha

OBS: O mesmo que cut -d, -f2

 

sed 's/^[^,]*,\([^,]\+\),\?.*/\1/'

 

  prompt> sed 's/^[^,]*,\([^,]\+\),\?.*/\1/' arquivo.txt

   era um nada.

   fez um rascunho à lápis.

   apagou e começou tudo de novo.

   ficou com preguiça

 

   se não estiver cansado...

 

   nada.

 


2.20. Retirar espaços em branco repetidos

 

sed 's/[ ]\+/ /g'

 

  prompt> sed 's/[ ]\+/ /g' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

   No terceiro dia, apagou e começou tudo de novo.

   No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

   E no fim, nada.

 


2.21. Retirar espaços em branco no início da linha

 

sed 's/^ \+//'

 

  prompt> sed 's/^ \+//' arquivo.txt

  No início do início, era um nada.

  No segundo dia, fez um rascunho à lápis.

  No terceiro dia, apagou e começou tudo de novo.

  No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

  E no fim, nada.

 


2.22. Apagar uma string do início da linha

 

sed 's/^No//'

 

  prompt> sed 's/^No//' arquivo.txt

   início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.23. Apagar do início da linha até uma string

 

sed 's/^.*dia//'

 

  prompt> sed 's/^.*dia//' arquivo.txt

  No início do início, era um nada.

  , fez um rascunho à lápis.

  , apagou e começou tudo de novo.

  , ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.24. Apagar de uma string até o final da linha

 

sed 's/dia.*$//'

 

  prompt> sed 's/dia.*$//' arquivo.txt

  No início do início, era um nada.

   No segundo

    No terceiro

     No quarto

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.25. Apagar a última string da linha

 

sed 's/ [^ ]\+ *$//g'

 

  prompt> sed 's/ [^ ]\+ *$//g' arquivo.txt

  No início do início, era um

   No segundo dia, fez um rascunho à

    No terceiro dia, apagou e começou tudo de

     No quarto dia, ficou com preguiça, então

 

  - Sexta-feira eu continuo, se não estiver

 

    E no fim,

 


2.26. Colocar todas as linhas em uma só

 

sed ':a;$!N;s/\n//;ta;'

 

  prompt> sed ':a;$!N;s/\n//;ta;' arquivo.txt

  No início do início, era um nada. No segundo dia, fez um rascunho à lápis.  No terceiro dia, apagou e começou tudo de novo.   No quarto dia, ficou com preguiça, então falou:- Sexta-feira eu continuo, se não estiver cansado...  E no fim, nada.

 


2.27. Juntar a linha com a próxima

 

sed 'N;s/\n//'

 

  prompt> sed 'N;s/\n//' arquivo.txt

  No início do início, era um nada. No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.   No quarto dia, ficou com preguiça, então falou:

  - Sexta-feira eu continuo, se não estiver cansado...

    E no fim, nada.

 


2.28. Substituir caractere por outro até uma TAG

OBS: troca 'o' por 'x' até encontrar a primeira ','

 

sed ':a;s/^\([^,]\+\)o/\1x/;ta'

 

  prompt> sed ':a;s/^\([^,]\+\)o/\1x/;ta' arquivo.txt

  Nx inícix dx inícix, era um nada.

   Nx segundx dia, fez um rascunho à lápis.

    Nx terceirx dia, apagou e começou tudo de novo.

     Nx quartx dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu cxntinux, se não estiver cansado...

 

    E nx fim, nada.

 


2.29. Substituir caractere por outro entre TAGs

OBS: troca 'o' por 'x' entre a segunda e terceira ','

 

sed ':a;s/^\([^,]*,[^,]\+\)o/\1x/;ta'

 

  prompt> sed ':a;s/^\([^,]*,[^,]\+\)o/\1x/;ta' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunhx à lápis.

    No terceiro dia, apagxu e cxmeçxu tudx de nxvx.

     No quarto dia, ficxu cxm preguiça, então falou:

 

  - Sexta-feira eu continuo, se nãx estiver cansadx...

 

    E no fim, nada.

 


2.30. Substituir string por outra somente em certas linhas

OBS: substitui 'dia' por 'noite' somente em linhas que contém a string 'terceiro'

 

sed '/terceiro/s/dia/noite/g'

 

  prompt> sed '/terceiro/s/dia/noite/g' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro noite, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.31. Substituir string por outra somente em certas linhas II

OBS: substitui 'dia' por 'noite' nas linha que NÃO contém a string 'terceiro'

 

sed '/terceiro/!s/dia/noite/g'

 

  prompt> sed '/terceiro/!s/dia/noite/g' arquivo.txt

  No início do início, era um nada.

   No segundo noite, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto noite, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.32. Substituir a última ocorrência de uma string por outra

 

sed ':a;$!{N;ba;};s/\(.*\)dia/\1noite/'

 

  prompt> sed ':a;$!{N;ba;};s/\(.*\)dia/\1noite/' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto noite, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


2.33. Trocar a ordem das palavras (última vira primeira, penúltima vira segunda....)

OBS: se o seu arquivo tiver o caractere '§' troque o '§' do sed por outro carectere que não exista.

 

sed 's/^/§ /;:a;s/\(.*\)§ \+\([^ ]\+\)/\2 \1§/;ta;s/§//'

 

  prompt> sed 's/^/§ /;:a;s/\(.*\)§ \+\([^ ]\+\)/\2 \1§/;ta;s/§//' arquivo.txt

  nada. um era início, do início No

  lápis. à rascunho um fez dia, segundo No

  novo. de tudo começou e apagou dia, terceiro No

  falou: então preguiça, com ficou dia, quarto No

  

  cansado... estiver não se continuo, eu Sexta-feira -

  

  nada. fim, no E

 


2.34. Trocar a ordem das letras (igual ao comando rev)

 

sed 's/^/§/;:a;s/\(.*\)§\(.\)/\2\1§/;ta;s/§$//'

 

  prompt> sed 's/^/§/;:a;s/\(.*\)§\(.\)/\2\1§/;ta;s/§$//' arquivo.txt

  .adan mu are ,oicíni od oicíni oN

  .sipál à ohnucsar mu zef ,aid odnuges oN

  .ovon ed odut uoçemoc e uogapa ,aid oriecret oN 

  :uolaf oãtne ,açiugerp moc uocif ,aid otrauq oN  

 

  ...odasnac revitse oãn es ,ounitnoc ue arief-atxeS -

 

  .adan ,mif on E 

 


2.35. Trocar de maiúsculas para minúsculas

 

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/'

 

  prompt> sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/' arquivo.txt

  no início do início, era um nada.

   no segundo dia, fez um rascunho à lápis.

    no terceiro dia, apagou e começou tudo de novo.

     no quarto dia, ficou com preguiça, então falou:

 

  - sexta-feira eu continuo, se não estiver cansado...

 

    e no fim, nada.

 


2.36. Trocar de minúsculas para maiúsculas

 

sed 'y/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/'

 

  prompt> sed 'y/abcdefghijklmnopqrstuvwxyzàáâãéêíóôõúç/ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÉÊÍÓÔÕÚÇ/' arquivo.txt

  NO INÍCIO DO INÍCIO, ERA UM NADA.

   NO SEGUNDO DIA, FEZ UM RASCUNHO À LÁPIS.

    NO TERCEIRO DIA, APAGOU E COMEÇOU TUDO DE NOVO.

     NO QUARTO DIA, FICOU COM PREGUIÇA, ENTÃO FALOU:

 

  - SEXTA-FEIRA EU CONTINUO, SE NÃO ESTIVER CANSADO...

 

    E NO FIM, NADA.

 


3. Brincando com Partes do texto


3.1. Imprimir a linha antes de uma string

 

sed -n '/segundo/{x;p;};h'

 

  prompt> sed -n '/segundo/{x;p;};h' arquivo.txt

  No início do início, era um nada.

 


3.2. Imprimir a linha antes de uma string e a linha da string

 

sed -n '/segundo/{H;x;p;};h'

 

  prompt> sed -n '/segundo/{H;x;p;};h' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

 


3.3. Imprimir a linha após uma string

 

sed -n '/segundo/{n;p;}'

 

  prompt> sed -n '/segundo/{n;p;}' arquivo.txt

    No terceiro dia, apagou e começou tudo de novo.

 


3.4. Imprimir a linha após uma string e a linha da string

 

sed -n '/segundo/{N;p;}'

 

  prompt> sed -n '/segundo/{N;p;}' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

 


3.5. Imprimir a linha anterior, posterior e a linha que contém uma string

 

sed -n '/terceiro/{H;x;p;n;p;};h'

 

  prompt> sed -n '/terceiro/{H;x;p;n;p;};h' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 


3.6. Imprimir a linha anterior e posterior a linha que contém uma string

 

sed -n '/terceiro/{x;p;n;p;};h'

 

  prompt> sed -n '/terceiro/{x;p;n;p;};h' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

     No quarto dia, ficou com preguiça, então falou:

 


3.7. Imprimir N linhas antes, a linha da string e M linhas após uma string I

OBS: 'quarto' é a string, troque o '2' de 1,2 para o número de linhas antes, e adicione quantos 'Ns' para linhas após. No exemplo está 2 antes e 2 depois

 

sed -n '/quarto/{x;p;x;N;N;p;q;};1!{H;g;};1,2!s/[^\n]*\n//;h;'

 

  prompt> sed -n '/quarto/{x;p;x;N;N;p;q;};1!{H;g;};1,2!s/[^\n]*\n//;h;' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 


3.8. Imprimir N linhas antes, a linha da string e M linhas após uma string II

OBS: troque o número entre chaves '{2}' pelo número de linhas antes da string e adicione quandos 'Ns' para linhas após. No exemploestá 2 antes e 2 depois

 

sed 'H;/quarto/{g;N;N;s/^\n//p;}; x;s/.*\(\(\n[^\n]*\)\{2\}\)/\1/;x ;d'

 

  prompt> sed 'H;/quarto/{g;N;N;s/^\n//p;}; x;s/.*\(\(\n[^\n]*\)\{2\}\)/\1/;x ;d' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 


3.9. Adicionar linha antes de uma string

OBS: inclui o 'Texto adicionado' antes da linha com a string 'segundo'

 

sed '/segundo/{h;s/.*/Texto adicionado/;p;x;}'

 

  prompt> sed '/segundo/{h;s/.*/Texto adicionado/;p;x;}' arquivo.txt

  No início do início, era um nada.

  Texto adicionado

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


3.10. Adicionar linha após a linha com uma determinada string

 

sed '/segundo/{p;s/.*/Texto adicionado/;}'

 

  prompt> sed '/segundo/{p;s/.*/Texto adicionado/;}' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

  Texto adicionado

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


3.11. Imprimir somente entre linha N e M

 

sed '4,6!d'

 

  prompt> sed '4,6!d' arquivo.txt

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 


3.12. Substituir uma string por outra somente entre determinadas linhas

 

sed '3,6s/dia/noite/'

 

  prompt> sed '3,6s/dia/noite/' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro noite, apagou e começou tudo de novo.

     No quarto noite, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


3.13. Imprimir linhas que contém uma ou outra string

OBS: imprime linhas que contém a string 'segundo' ou 'quarto'

 

sed '/segundo\|quarto/!d'

 

  prompt> sed '/segundo\|quarto/!d' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

     No quarto dia, ficou com preguiça, então falou:

 


3.14. Imprimir linhas que contém uma e outra string

OBS: imprime linhas que contém 'No' e 'segundo'

sed -n '/No.*segundo/p'

 

  prompt> sed -n '/No.*segundo/p' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

 


3.15. Extrair um trecho do arquivo

 

sed -n '/segundo/,/quarto/p'

 

  prompt> sed -n '/segundo/,/quarto/p' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 


3.16. Extrair trecho que pode ou não estar na mesma linha

 

sed -n '/segundo/{:a;/quarto/!{N;ba;};p;}'

 

  prompt> sed -n '/segundo/{:a;/quarto/!{N;ba;};p;}' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 


3.17. Extrair trecho que pode ou não estar na mesma linha tirando os delimitadores

OBS: 'segundo' é a TAG inicial e 'falou' a TAG final

 

sed -n '/segundo/{/falou/tc;:a;/falou/!{N;ba;};:c;s/.*segundo//;s/falou.*$//;p;}'

 

  prompt> sed -n '/segundo/{/falou/tc;:a;/falou/!{N;ba;};:c;s/.*segundo//;s/falou.*$//;p;}' arquivo.txt

   dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então

 


3.18. Apagar o que está entre delimitadores

 

sed '/segundo/{/falou/{s/segundo.*falou//;t};:a;/falou/!{N;s/\n//;ta;};s/segundo.*falou/\n/;}'

 

  prompt> sed '/segundo/{/falou/{s/segundo.*falou//;t};:a;/falou/!{N;s/\n//;ta;};s/segundo.*falou/\n/;}' arquivo.txt

  No início do início, era um nada.

   No n:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


3.19. Apagar um trecho se ele contém um padrão

OBS: 'segundo' marca o início do trecho, 'quarto' o final, e 'rascunho' é o padrão de procura

 

sed '/segundo/{:a;/quarto/!{N;ba;};/rascunho/d;}'

 

  prompt> sed '/segundo/{:a;/quarto/!{N;ba;};/rascunho/d;}' arquivo.txt

  No início do início, era um nada.

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


3.20. Trocar de lugar a linha com a próxima (troca de lugar linha 1 com 2, 3 com 4...) I

 

sed -n '$ba;h;n;p;x;:a;p'

 

  prompt> sed -n '$ba;h;n;p;x;:a;p' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

  No início do início, era um nada.

     No quarto dia, ficou com preguiça, então falou:

    No terceiro dia, apagou e começou tudo de novo.

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 

 


3.21. Trocar de lugar a linha com a próxima (troca de lugar linha 1 com 2, 3 com 4...) II

 

sed 'N;s/\([^\n]*\)\(\n\)\([^\n]*\)/\3\2\1/'

 

  prompt> sed 'N;s/\([^\n]*\)\(\n\)\([^\n]*\)/\3\2\1/' arquivo.txt

   No segundo dia, fez um rascunho à lápis.

  No início do início, era um nada.

     No quarto dia, ficou com preguiça, então falou:

    No terceiro dia, apagou e começou tudo de novo.

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 

 


4. Utilidade Pública


4.1. Retirar comandos HTML (tudo entre < e >)

 

sed 's/<[^>]*>//g'

 

  prompt> sed 's/<[^>]*>//g' arquivo.txt

  No início do início, era um nada.

   No segundo dia, fez um rascunho à lápis.

    No terceiro dia, apagou e começou tudo de novo.

     No quarto dia, ficou com preguiça, então falou:

 

  - Sexta-feira eu continuo, se não estiver cansado...

 

    E no fim, nada.

 


4.2. Pesquisar se existe algum usuário sem senha no /etc/passwd

 

sed -n '/^[^:]\+::/p'

 

  prompt> sed -n '/^[^:]\+::/p' arquivo.txt