<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog do Beraldo &#187; Bash</title>
	<atom:link href="http://www.rberaldo.com.br/blog/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rberaldo.com.br/blog</link>
	<description>Programação, Música, Entretenimento e o que mais me vier à mente</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:23:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Curso de Shell Script &#8211; Módulo #1: Scripts Shell e suas estruturas</title>
		<link>http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas/</link>
		<comments>http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas/#comments</comments>
		<pubDate>Sat, 05 Nov 2011 20:44:59 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sh]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=478</guid>
		<description><![CDATA[(Caso não tenha lido a primeira parte (módulo #0), veja-a aqui: http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/) Inicialmente, eu separaria este texto em vários módulos. Porém, optei por faer algo mais sucinto e criar apenas este módulo &#8211; que complementa o Módulo #0, sobre os comandos básicos do Linux. Neste módulo, serão abordados vários temas da programação em Shell (Bash), [...]]]></description>
			<content:encoded><![CDATA[<p>(Caso não tenha lido a primeira parte (módulo #0), veja-a aqui: <a href="http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/">http://www.rberaldo.com.br/blog/curso-shell-script-comandos-basicos-linux/</a>)</p>
<p>Inicialmente, eu separaria este texto em vários módulos. Porém, optei por faer algo mais sucinto e criar apenas este módulo &#8211; que complementa o Módulo #0, sobre os comandos básicos do Linux.</p>
<p>Neste módulo, serão abordados vários temas da programação em Shell (Bash), desde variáveis e funções, até expansões, expressões regulares etc.</p>
<p>Sem mais delongas, vamos ao que interessa! :)</p>
<p><span id="more-478"></span></p>
<h3>Sumário</h3>
<p><a href="#scripts">0. Scripts Shell</a><br />
<a href="#vars">1. Variáveis</a><br />
<a href="#envvars">1.1 Variáveis de Ambiente</a><br />
<a href="#espvars">1.2. Variáveis Especiais</a><br />
<a href="#fluxo">2. Controle de Fluxo</a><br />
<a href="#cond">2.1. Condicionais</a><br />
<a href="#if">2.1.1. if</a><br />
<a href="#case">2.1.2. case</a><br />
<a href="#select">2.1.3. select</a><br />
<a href="#repeat">2.2. Estruturas de Repetição (Loops)</a><br />
<a href="#for">2.2.1. for</a><br />
<a href="#while">2.2.2. while</a><br />
<a href="#until">2.2.3. until&#8230;do</a><br />
<a href="#break">2.2.4. break</a><br />
<a href="#continue">2.2.5. continue</a><br />
<a href="#cpattern">3. Padrão C/C++ em Expressões &#8220;(())&#8221;</a><br />
<a href="#es">4. Entrada/Saída</a><br />
<a href="#redir">4.1. Redirecionamento</a><br />
<a href="#pipe">4.2. Usando Pipelines</a><br />
<a href="#expansoes">5. Expansões</a><br />
<a href="#varexp">5.1. Expansão de Variáveis</a><br />
<a href="#params">6. Parâmetros de linha de comando</a><br />
<a href="#funcs">7. Definindo Funções</a><br />
<a href="#return">7.1. Retorno de Funções</a><br />
<a href="#er">8. Expressões Regulares em Bash</a><br />
<a href="#mathexp">9. Expressões Matemáticas</a><br />
<a href="#bashrc">10. O Arquivo .bashrc</a><br />
<a href="#alias">11. Aliases (Apelidos)</a><br />
<a href="#refs">12. Referências</a></p>
<h3><a name="scripts">0. Scripts Shell</a></h3>
<p>Antes de mostrar os recursos do shell, vamos dar uma olhada na maneira como devemos criar scripts shell. Isso facilitará a compreensão do restante do artigo.</p>
<p>Todo arquivo com códigos shell deve ter, na primeira linha, o identificador do interpretador a ser utilizado. A &#8220;linha mágica&#8221; que chama o interpretado bash é:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span></pre></div></div>

<p>O mesmo vale para outras linguagens interpretadas, como PHP, Python, Ruby, Perl etc.</p>
<p>Tendo essa linha no início do arquivo, o segundo passo é dar permissão de execução ao arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">chmod</span> +x script.sh
<span style="color: #000000; font-weight: bold;">&lt;</span>pre<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
Feito isso, basta executar o script:
&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;</span>pre <span style="color: #007800;">lang</span>=<span style="color: #ff0000;">&quot;bash&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>script.sh</pre></div></div>

<p>Também é possível executar o script usando o comando <strong>bash</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">bash</span> script.sh</pre></div></div>

<p>Assim não é necessário haver a &#8220;linha mágica&#8221; no início do script. Também não é preciso dar permissão de execução ao arquivo.</p>
<h3><a name="vars">1. Variáveis</a></h3>
<p>O Bash, assim como muitas outras linguagens, possui o conceito de variável. Para definir uma variável:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">nome_da_variavel</span>=<span style="color: #ff0000;">&quot;valor da variável&quot;</span></pre></div></div>

<p>É importante ressaltar que não deve haver espaços entre o símbolo de atribuição, o nome da variável e seu valor, para que o bash interprete o comando como atribuição, não chamada de comandos.</p>
<p>Para exibir o valor de uma variável, basta usar <strong>echo</strong> da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$nome_da_variavel</span></pre></div></div>

<h4><a name="envvars">1.1 Variáveis de Ambiente</a></h4>
<p>As variáveis de ambiente são aquelas conhecidas pelos demais processos (programas em execução). Exemplos destas variáveis são: HOME, PATH, EDITOR, etc.</p>
<p>Para entender o seu uso, vejamos um exemplo: editores de texto, como <strong>Vi</strong>, possuem diferentes interfaces para os modos texto e gráfico e necessitam saber qual o tipo de terminal o usuário está usando. A variável de ambiente TERM é o modo pelo qual isto pode ser determinado. Outro exemplo são os programas de e-mail que permitem ao usuário editar mensagens com o editor de textos de sua preferência. Como estes programas sabem qual editor usar? É através da variável EDITOR ou VISUAL.</p>
<p>Qualquer variável pode se tornar uma variável de ambiente. Para isto, ela deve ser &#8220;exportada&#8221;, com o comando <strong>export</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #000000; font-weight: bold;">&lt;</span>variável<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Também podemos exportar e atribuir valores a uma variável numa única linha de comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #000000; font-weight: bold;">&lt;</span>variável<span style="color: #000000; font-weight: bold;">&gt;</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>valor<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Podemos verificar quais são as variáveis de ambiente já definidas e seus respectivos valores usando o comando abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #660033;">-p</span></pre></div></div>

<p>Para visualizar todas as variáveis basta usar set ou env. Uma importante variável de ambiente é PATH que ajuda o shell a encontrar os comandos que o usuário executa. Todo comando executado é, na realidade, um arquivo. Estes arquivos são chamados executáveis e estão armazenados em vários diretórios como /bin ou /usr/bin. O valor da variável PATH é uma lista de diretórios em que o shell procura toda vez que executamos um comando cujo arquivo não é encontrado no diretório corrente. Assim, não precisamos alterar o diretório de trabalho todas vez que necessitamos executar um comando que se encontra em outro diretório. Basta acrescentar o diretório que contém tal comando à variável PATH. Os nomes dos diretórios na variável são separados pelo caractere dois-pontos (:).</p>
<p>Caso o usuário joao queira adicionar um outro diretório, digamos /home/joao/bin à variável PATH, deve proceder como mostrado a seguir:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>joao<span style="color: #000000; font-weight: bold;">/</span>bin   <span style="color: #666666; font-style: italic;"># adiciona o diretório</span>
$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$PATH</span>                         <span style="color: #666666; font-style: italic;"># verifica</span>
<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin:<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>joao<span style="color: #000000; font-weight: bold;">/</span>bin</pre></div></div>

<p>O primeiro comando faz com que a variável receba o seu valor atual, concatenado com o nome do diretório a ser acrescentado. Observe que existe um &#8220;:&#8221; antes do nome do diretório. O segundo comando é utilizado apenas para visualizarmos o resultado do primeiro.</p>
<h4><a name="espvars">1.2. Variáveis Especiais</a></h4>
<p>Existem algumas variáveis especiais, normalmente utilizadas em script shell, para verificação de parâmetros, valores de retorno de comandos e funções etc.</p>
<table width="100%">
<thead>
<tr>
<td>Variável</td>
<td>Descrição</td>
</tr>
</thead>
<tbody>
<tr>
<td>$0</td>
<td>Parâmetro número 0 (nome do comando ou função)</td>
</tr>
<tr>
<td>$1</td>
<td>Parâmetro número 1 (da linha de comando ou função)</td>
</tr>
<tr>
<td>&#8230;</td>
<td>Parâmetro número N &#8230;</td>
</tr>
<tr>
<td>$9</td>
<td>Parâmetro número 9 (da linha de comando ou função)</td>
</tr>
<tr>
<td>${10}</td>
<td>Parâmetro número 10 (da linha de comando ou função)</td>
</tr>
<tr>
<td>$#</td>
<td>Número total de parâmetros da linha de comando ou função</td>
</tr>
<tr>
<td>$*</td>
<td>Todos os parâmetros, como uma string única</td>
</tr>
<tr>
<td>$@</td>
<td>Todos os parâmetros, como várias strings protegidas</td>
</tr>
<tr>
<td>$$</td>
<td>Número PID do processo atual (do próprio script)</td>
</tr>
<tr>
<td>$!</td>
<td>Número PID do último processo em segundo plano</td>
</tr>
<tr>
<td>$_</td>
<td>Último argumento do último comando executado</td>
</tr>
<tr>
<td>$?</td>
<td>Valor de retorno do último comando executado</td>
</tr>
</tbody>
</table>
<h3><a name="fluxo">2. Controle de Fluxo</a></h3>
<p>Controle de fluxo permite interromper, continuar e deslocar o fluxo de execução do script. Isso envolve controles de decisão (condicionais) e estruturas de repetição (loops).</p>
<h4><a name="cond">2.1. Condicionais</a></h4>
<h4><a name="if">2.1.1. if</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">then</span>
    comandos
<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao_2<span style="color: #000000; font-weight: bold;">&gt;</span>
    comandos 
<span style="color: #000000; font-weight: bold;">else</span>
    comandos 
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>O <strong>if</strong>, ao contrário do que ocorre em muitas outras linguagens, testa o retorno de um comando, não uma expressão.</p>
<p>Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">7</span>
<span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'5 é menor que 7'</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>Porém, é possível posicionar a expressão entre colchetes, de forma a tornar o if mais parecido com o que acontece em outras linguagens:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">7</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'5 é menor que 7'</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>O &#8220;-lt&#8221; significa &#8220;<em>less than</em>&#8220;, ou seja, &#8220;<em>menor que</em>&#8220;, equivalendo ao operador &#8220;<".</p>
<p>Outros possíveis operadores são:</p>
<p><strong>Comparação Numérica</strong><br />
-lt: É menor que (LessThan)<br />
-gt: É maior que (GreaterThan)<br />
-le: É menor igual (LessEqual)<br />
-ge: É maior igual (GreaterEqual)<br />
-eq: É igual (EQual)<br />
-ne: É diferente (NotEqual)</p>
<p><strong>Comparação de Strings</strong><br />
=: É igual<br />
!=: É diferente<br />
-n: É não nula (não vazia)<br />
-z: É nula (vazia)</p>
<p><strong>Operadores Lógicos</strong><br />
!: NÃO lógico (NOT)<br />
-a: E lógico (AND)<br />
-o: OU lógico (OR)</p>
<p><strong>Testes em arquivos</strong><br />
-b: É um dispositivo de bloco<br />
-c: É um dispositivo de caractere<br />
-d: É um diretório<br />
-e: O arquivo existe<br />
-f: É um arquivo normal<br />
-g: O bit SGID está ativado<br />
-G: O grupo do arquivo é o do usuário atual<br />
-k: O sticky-bit está ativado<br />
-L: O arquivo é um link simbólico<br />
-O: O dono do arquivo é o usuário atual<br />
-p: O arquivo é um named pipe<br />
-r: O arquivo tem permissão de leitura<br />
-s: O tamanho do arquivo é maior que zero<br />
-S: O arquivo é um socket<br />
-t: O descritor de arquivos N é um terminal<br />
-u: O bit SUID está ativado<br />
-w: O arquivo tem permissão de escrita<br />
-x: O arquivo tem permissão de execução<br />
-nt: O arquivo é mais recente (NewerThan)<br />
-ot: O arquivo é mais antigo (OlderThan)<br />
-ef: O arquivo é o mesmo (EqualFile)</p>
<h4><a name="case">2.1.2. case</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">case</span> <span style="color: #000000; font-weight: bold;">&lt;</span>string<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">in</span>
    opcao1<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        comandos 
        <span style="color: #000000; font-weight: bold;">;;</span>
    opcao2<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        comandos 
        <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        operação padrão
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Digite um número&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">read</span> x
&nbsp;
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$x</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span> 
    <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Você digitou o número 1&quot;</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Você digitou o número 2&quot;</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Você digitou outro número&quot;</span>
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

<h4><a name="select">2.1.3. select</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000000; font-weight: bold;">&lt;</span>variavel<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">&lt;</span>opcao1<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>opcao2<span style="color: #000000; font-weight: bold;">&gt;</span> ...
<span style="color: #000000; font-weight: bold;">do</span> 
    comandos 
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>O comando <strong>select</strong> é pouco utilizado, mas pode ser muito útil para montar menus. Esse comando exibe um menu, associando cada opção a um número. Quando o usuário seleciona o número da opção, o seu valor é associado à <variavel>.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">select</span> i <span style="color: #000000; font-weight: bold;">in</span> lista_arquivos lista_arquivos_tree
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span> 
        lista_arquivos<span style="color: #7a0874; font-weight: bold;">&#41;</span>
            <span style="color: #c20cb9; font-weight: bold;">ls</span>
            <span style="color: #000000; font-weight: bold;">;;</span>
        lista_arquivos_tree<span style="color: #7a0874; font-weight: bold;">&#41;</span>
            <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-R</span>
            <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h4><a name="repeat">2.2. Estruturas de Repetição (Loops)</a></h3>
<p>Loops são estruturas que permitem fazer iterações sobre algum dado.</p>
<h4><a name="for">2.2.1. for</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #000000; font-weight: bold;">&lt;</span>var<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">&lt;</span>lista<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>&#8220;var&#8221; é o nome da variável a ser usada no bloco de repetição. &#8220;lista&#8221; pode ser uma lista de dados, fixa ou retornada por outro comando (como o ls), uma sequência de números etc.</p>
<p>Exemplos:</p>
<p>Exibe uma sequência de números:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000;">1</span> <span style="color: #000000;">2</span> <span style="color: #000000;">3</span> <span style="color: #000000;">4</span> <span style="color: #000000;">5</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Lista os diretórios e arquivos da raiz do sistema de arquivos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">seq</span> <span style="color: #000000;">1</span> <span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h4><a name="while">2.2.2. while</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Exemplos:</p>
<p>Exibe a sequência de 1 a 10:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Loop infinito que exibe &#8220;bash&#8221; na tela:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">true</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'bash'</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Lendo strings da entrada padrão:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Voce digitou a string: '</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Exibe as linhas de um arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #ff0000;">'arquivo.txt'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Esse exemplo facilita o trabalho com arquivos de texto, cujas linhas possuem espaços. Se fosse usado um loop for nesse caso, seria necessário alterar a variável de ambiente IFS, definindo o separador para quebra de linha (\n).</p>
<p>Uma variação do exemplo anterior é esta:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">&lt;</span> arquivo.txt</pre></div></div>

<p>A principal diferença entre estes dois últimos exemplos é que, no primeiro, o loop while é executado num subshell, devido ao uso do pipe (|). No segundo exemplo, o while é executado no shell corrente.</p>
<p>Para ilustrar o problema, crie um arquivo chamado &#8220;arq.txt&#8221; com algumas linhas de texto. Crie este script e execute-o:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">FILE</span>=<span style="color: #ff0000;">'arq.txt'</span>
&nbsp;
<span style="color: #007800;">total</span>=<span style="color: #000000;">0</span>
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$FILE</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #007800;">total</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>total+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Total de linhas: '</span> <span style="color: #007800;">$total</span>
&nbsp;
<span style="color: #007800;">total</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #007800;">total</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>total+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$FILE</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Total de linhas: '</span> <span style="color: #007800;">$total</span></pre></div></div>

<p>O primeiro loop é executado num subshell, fazendo com que a variável &#8220;total&#8221;, usada no corpo do loop, existe apenas nesse subshell. No segundo caso, isso não ocorre. Isso pode gerar grandes dores de cabeça&#8230; (como já ocorreu comigo)</p>
<h4><a name="until">2.2.3. until&#8230;do</a></h4>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">until</span> <span style="color: #000000; font-weight: bold;">&lt;</span>condicao<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Nesse loop, a condição é oposta à usada no while. Por exemplo:</p>
<p>Com while:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Com unitl:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">until</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-ge</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Para fazer a mesma coisa, tivemos que usar expressões diferentes na condição do loop. </p>
<h4><a name="break">2.2.4. break</a></h4>
<p>O comando break encerra um loop imediatamente.</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">true</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-ge</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #7a0874; font-weight: bold;">break</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #007800;">i</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
    <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #7a0874; font-weight: bold;">break</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h4><a name="continue">2.2.5. continue</a></h4>
<p>O comando continue para a execução da iteração corrente e vai para a próxima iteração, mesmo que haja mais comandos no bloco de repetição.</p>
<h3><a name="cpattern">3. Padrão C/C++ em Expressões &#8220;(())&#8221;</a></h3>
<p>É possível usar o padrão C em expressões do shell, como em condicionais de estruturas de controle. Para isso, basta colocar a expressão entre dois parênteses. </p>
<p>Exemplos;</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000;">10</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
    <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i++<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>É possível, inclusive, usar o padrão do loop for do C:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i = <span style="color: #000000;">0</span>; i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000;">10</span>; i++<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$i</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<h3><a name="es">4. Entrada/Saída</a></h3>
<p>Existem três dispositivos principais, que sempre estão abertos, que merecem destaque:</p>
<p>stdin (standard input): entrada padrão. Corresponde, em geral, ao teclado;<br />
stdout (standard output): saída padrão. Corresponde, em geral, à tela do terminal;<br />
stderr (standard error): saída padrão de erros. Corresponde, em geral, à tela do terminal, também.</p>
<p>Esses três dispositivos estão em /dev e estão sempre disponíveis. Quem programa em C, sabe muito bem disso, pois já deve ter usado stdin, stdout e stderr junto com fprintf, fread, fwrite e semelhantes; esses três dispositivos comportam-se como arquivos comuns, sempre abertos e que não devem ser fechados.<br />
É possível brincar com eles no próprio shell. Experimentem dar um cat em /dev/stdin para ver o que acontece. :)</p>
<h4><a name="redir">4.1. Redirecionamento</a></h4>
<p>A entrada de um programa consiste nos dados que lhe são passados inicialmente, os quais são necessários para a execução do programa. A entrada de um programa pode vir do teclado ou de um arquivo, por exemplo. Argumentos passados à comandos constituem a sua entrada.<br />
A saída é constituída pelas informações geradas pelo programa, ou seja, o resultado de sua execução. A saída pode ser mostrada na tela ou gravada em um arquivo de registro.</p>
<p>Muitos comandos do Linux têm sua entrada configurada para a entrada padrão e sua saída para a saída padrão. A entrada padrão é o teclado e a saída padrão é o monitor. Vejamos um exemplo usando o comando cat, que lê dados de todos os arquivos passados como parâmetros e os envia diretamente para a saída padrão. Usando o comando abaixo, veremos o conteúdo do arquivo &#8220;arq1&#8243; seguido pelo conteúdo de &#8220;arq2&#8243;.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> arq1 arq2</pre></div></div>

<p>Entretanto, se nenhum nome de arquivo for dado como parâmetro, o comando cat lê dados da entrada padrão e os envia para a saída padrão. Para interromper, deve-se pressionar as teclas ctrl e d simultaneamente (ctrl+d).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> 
Ola<span style="color: #000000; font-weight: bold;">!</span> Tem alguem ai?  <span style="color: #666666; font-style: italic;"># usuário </span>
Ola<span style="color: #000000; font-weight: bold;">!</span> Tem alguem ai?  <span style="color: #666666; font-style: italic;"># eco do sistema </span>
Ate mais<span style="color: #000000; font-weight: bold;">!</span>            <span style="color: #666666; font-style: italic;"># usuário </span>
Ate mais<span style="color: #000000; font-weight: bold;">!</span>            <span style="color: #666666; font-style: italic;"># eco do sistema</span>
              <span style="color: #666666; font-style: italic;"># usuário pressiona ctrl+d</span></pre></div></div>

<p>Como podemos ver, cada linha que o usuário digita é imediatamente ecoada pelo comando cat. Aqui um outro exemplo: o comando sort lê dados da entrada padrão &#8211; a menos que algum arquivo seja dado como parâmetro &#8211; e ordena os dados, enviando-os para a saída padrão:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sort</span> 
bananas     <span style="color: #666666; font-style: italic;"># usuário</span>
peras       <span style="color: #666666; font-style: italic;"># usuário</span>
goiabas     <span style="color: #666666; font-style: italic;"># usuário</span>
            <span style="color: #666666; font-style: italic;"># ctrl+d</span>
bananas     <span style="color: #666666; font-style: italic;"># eco do sistema</span>
goiabas     <span style="color: #666666; font-style: italic;"># eco do sistema</span>
peras       <span style="color: #666666; font-style: italic;"># eco do sistema</span></pre></div></div>

<p>Digamos que queremos enviar a saída do comando sort para um arquivo, gravando os dados digitados anteriormente. O shell nos permite redirecionar a saída para um arquivo usando o símbolo &#8220;>&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #000000; font-weight: bold;">&gt;</span> lista
bananas  <span style="color: #666666; font-style: italic;"># usuário</span>
peras    <span style="color: #666666; font-style: italic;"># usuário</span>
goiabas  <span style="color: #666666; font-style: italic;"># usuário</span>
         <span style="color: #666666; font-style: italic;"># ctrl+d</span></pre></div></div>

<p>Como se pode ver, o resultado do comando sort não é mostrado imediatamente após o se digitar ctrl+d. Ao invés disso, é salvo em um arquivo chamado &#8220;lista&#8221;. Vejamos o conteúdo desse arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> lista
bananas
goiabas
peras</pre></div></div>

<p>Com o redirecionamento de saída, temos uma maneira simples de criar arquivos de texto. Para isso, utilizamos o comando cat para ler a entrada padrão (teclado) e redirecionamos sua saída para um arquivo.</p>
<p>Ao usar &#8220;>&#8221; para redirecionar a saída para um arquivo, estamos realizando um redirecionamento destrutivo, ou seja, o comando &#8220;ls > lista&#8221; sobrescreve o conteúdo do arquivo &#8220;lista&#8221;. Isto é equivalente a dizer que todo o conteúdo anterior de &#8220;lista&#8221; é apagado.<br />
Se, ao invés disso, redirecionarmos usando &#8220;>>&#8221;, a saída será concatenada ao final do arquivo e o conteúdo (se houver) de &#8220;lista&#8221; será preservado. Para melhor entender isso, experimente executar a seguinte seqüência de comandos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> listagem
<span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> listagem
<span style="color: #c20cb9; font-weight: bold;">less</span> listagem</pre></div></div>

<p>O redirecionamento neste exemplo, diferentemente do exemplo anterior, é denominado redirecionamento não-destrutivo.</p>
<h3><a name="pipe">4.2. Usando Pipelines</a></h3>
<p>Nos exemplos para o filtro sort, os dados de entrada eram digitados pelo usuário ou estavam gravados em um arquivo. O que aconteceria se quiséssemos ordenar dados vindos do saída de outro comando ? Para listar os arquivos do diretório corrente em ordem alfabética invertida devemos fazer com que a saída do comando ls seja ordenada pelo comando sort. Usando a opção &#8220;-r&#8221;, este comando ordena os dados na ordem inversa.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span>
historia  notas     tese      testes 
$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">&gt;</span> lista 
$ <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-r</span> lista 
testes
tese
notas
lista                             <span style="color: #666666; font-style: italic;"># observe esse nome de arquivo</span>
historia</pre></div></div>

<p>Aqui, salvamos a saída do comando ls em um arquivo (lista) e usamos sort com a opção &#8220;-r&#8221;. Porém, isso faz com que tenhamos um arquivo temporário para armazenar os dados. Assim, toda vez que fizermos isso, teremos que, em seguida, remover o arquivo lista. A solução é usar o que chamamos de pipeline, outro recurso do shell que nos permite conectar vários comandos usando um pipe, onde a saída do primeiro comando é enviada diretamente à entrada do segundo e assim por diante no caso de haver mais de dois comandos conectados por pipes.</p>
<p>No nosso caso, queremos enviar a saída do comando ls para a entrada do comando sort. O símbolo &#8220;|&#8221; (barra vertical) é usado para criar um pipe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-r</span> 
testes
tese
notas
historia</pre></div></div>

<p>Note que neste exemplo, nenhum nome de arquivo é usado na linha de comando, diferentemente do exemplo anterior que fazia o uso do arquivo intermediário lista. Outra diferença é que o nome desse arquivo intermediário aparece no resultado do penúltimo exemplo, mas não neste último. O comando é mais curto, mais fácil de digitar e o resultado é mais adequado pois não inclui nomes de arquivos intermediários.</p>
<p>É importante observar que o redirecionamento e o uso de pipes são características do shell e não dos comandos em si. É o shell quem provê a sintaxe dos símbolos &#8220;>&#8221;, &#8220;<" e "|". Logo, se você criar um programa que utilize entrada de dados via stdin, poderá usar redirecionamento para especificar uma entrada para o seu programa.</p>
<h3><a name="expansoes">5. Expansões</a></h3>
<p>Expansões são caracteres, ou uma sequência deles, que expressa outro significado. O intuito disso é facilitar e padronizar comandos.</p>
<p>~: path à home do usuário corrente<br />
~user: path à home do usuário &#8220;user&#8221;<br />
{a,b,c}: presença do caractere &#8220;a&#8221;, &#8220;b&#8221; ou &#8220;c&#8221;. Podem ser usadas strings em vez de simplesmente caracteres.</p>
<p>Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> ~</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> ~root</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>std<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000; font-weight: bold;">in</span>,out,err<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<h4><a name="varexp">5.1. Expansão de Variáveis</a></h4>
<table width="100%">
<thead>
<tr>
<td>Sintaxe</td>
<td>Expansão</td>
</tr>
</thead>
<tbody>
<tr>
<td>${var:-texto}</td>
<td>Se var não está definida, retorna &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:=texto}</td>
<td>Se var não está definida, defina-a com &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:?texto}</td>
<td>Se var não está definida, retorna o erro &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:+texto}</td>
<td>Se var está definida, retorna &#8216;texto&#8217;, senão retorna o vazio</td>
</tr>
<tr>
<td>${var}</td>
<td>É o mesmo que $var, porém não ambíguo</td>
</tr>
<tr>
<td>${#var}</td>
<td>Retorna o tamanho da string</td>
</tr>
<tr>
<td>${!var}</td>
<td>Executa o conteúdo de $var (igual &#8216;eval \$$var&#8217;)</td>
</tr>
<tr>
<td>${!texto*}</td>
<td>Retorna os nomes de variáveis começadas por &#8216;texto&#8217;</td>
</tr>
<tr>
<td>${var:N}</td>
<td>Retorna o texto a partir da posição &#8216;N&#8217;</td>
</tr>
<tr>
<td>${var:N:tam}</td>
<td>Retorna &#8216;tam&#8217; caracteres a partir da posição &#8216;N&#8217;</td>
</tr>
<tr>
<td>${var#texto}</td>
<td>Corta &#8216;texto&#8217; do início da string</td>
</tr>
<tr>
<td>${var##texto}</td>
<td>Corta &#8216;texto&#8217; do início da string (* guloso)</td>
</tr>
<tr>
<td>${var%texto}</td>
<td>Corta &#8216;texto&#8217; do final da string</td>
</tr>
<tr>
<td>${var%%texto}</td>
<td>Corta &#8216;texto&#8217; do final da string (* guloso)</td>
</tr>
<tr>
<td>${var/texto/novo}</td>
<td>Substitui &#8216;texto&#8217; por &#8216;novo&#8217;, uma vez</td>
</tr>
<tr>
<td>${var//texto/novo}</td>
<td>Substitui &#8216;texto&#8217; por &#8216;novo&#8217;, sempre</td>
</tr>
<tr>
<td>${var/#texto/novo}</td>
<td>Se a string começar com &#8216;texto&#8217;, substitui &#8216;texto&#8217; por &#8216;novo&#8217;</td>
</tr>
<tr>
<td>${var/%texto/novo}</td>
<td>Se a string terminar com &#8216;texto&#8217;, substitui &#8216;texto&#8217; por &#8216;novo&#8217;</td>
</tr>
</tbody>
</table>
<h3><a name="params">6. Parâmetros de linha de comando</a></h3>
<p>Assim como em outras linguagens, é possível passar parâmetros para scripts shell. Para isso, usam-se as variáveis $1, $2, &#8230; A variável $0 contém o comando chamado via linha de comando.</p>
<p>Exemplo:</p>
<p>Crie um arquivo &#8220;test.sh&#8221; com este conteúdo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'$0 = '</span><span style="color: #007800;">$0</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'$1 = '</span><span style="color: #007800;">$1</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'$2 = '</span><span style="color: #007800;">$2</span></pre></div></div>

<p>Veja as saídas das execuções abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ .<span style="color: #000000; font-weight: bold;">/</span>test.sh 
<span style="color: #007800;">$0</span> = .<span style="color: #000000; font-weight: bold;">/</span>test.sh
<span style="color: #007800;">$1</span> = 
<span style="color: #007800;">$2</span> = 
$ .<span style="color: #000000; font-weight: bold;">/</span>test.sh um
<span style="color: #007800;">$0</span> = .<span style="color: #000000; font-weight: bold;">/</span>test.sh
<span style="color: #007800;">$1</span> = um
<span style="color: #007800;">$2</span> = 
$ .<span style="color: #000000; font-weight: bold;">/</span>test.sh um dois
<span style="color: #007800;">$0</span> = .<span style="color: #000000; font-weight: bold;">/</span>test.sh
<span style="color: #007800;">$1</span> = um
<span style="color: #007800;">$2</span> = dois</pre></div></div>

<h3><a name="funcs">7. Definindo Funções</a></h3>
<p>Sintaxe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> nome_da_funcao<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">&lt;</span>comandos<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Para chamar a função:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">nome_da_funcao
&nbsp;
<span style="color: #666666; font-style: italic;"># caso haja parâmetros</span>
nome_da_funcao param1 param2 ...</pre></div></div>

<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> imprime<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Sou a função '<span style="color: #007800;">${0}</span>'&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Param 1: <span style="color: #007800;">${1}</span>&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Param 2: <span style="color: #007800;">${2}</span>&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Lista de parâmetros: <span style="color: #007800;">${*}</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
imprime um dois tres quatro</pre></div></div>

<p>Da mesma forma como foram usados $0, $1 etc anteriormente, aqui essas variáveis são usadas para retornar os parâmetros da função. Logo, percebe-se que, dentro de funções, não é possível acessar parâmetros de script, a menos que eles sejam passados por parâmetro para a função.</p>
<h4><a name="return">7.1. Retorno de Funções</a></h4>
<p>Antes de tudo, é preciso diferenciar retorno de função e saída de função. Por exemplo, ao se executar o comando &#8220;cat /etc/passwd&#8221;, a saída é o conteúdo do arquivo; o retorno é 0 (ou outro valor, caso ocorra erro). O retorno de uma função shell é um valor inteiro, normalmente utilizado para definir o status da função, ou seja, se ocorreu algum erro ou e ela foi executada corretamente.</p>
<p>Para obter o valor de retorno de uma função, usa-se a variável &#8220;$?&#8221;. Ela exibe o retorno do último  comando executado. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$?</span></pre></div></div>

<p>Para retornar valor (status) numa função, usa-se o comando return.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> retorna<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;sou um valor&quot;</span>
    <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">42</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #007800;">valor</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span>retorna<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$?</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$valor</span></pre></div></div>

<p>Ao se executar a função, sua saída será &#8220;sou um valor&#8221;; seu retorno será 42.</p>
<p>Em shell, considera-se o valor 0 como execução bem sucedida. Qualquer outro valor representa erro. É por isso que recomenda-se que toda função <code>main</code> de um programa em C retorne o valor 0, desde que não ocorra algum erro.</p>
<h3><a name="er">8. Expressões Regulares em Bash</a></h3>
<p>Expressões regulares em shell podem ser usadas em comparações (if&#8217;s), por exemplo. Em if&#8217;s, usa-se o operador &#8220;=~&#8221; para realizar comparações usando ER&#8217;s:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">s</span>=<span style="color: #ff0000;">&quot;bash&quot;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$s</span>&quot;</span> =~ ^b <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'começa com b'</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<h3><a name="mathexp">9. Expressões Matemáticas</a></h3>
<p>O bash não trabalha com expressões matemáticas tão facilmente. Existe o comando &#8220;let&#8221;, que permite realizar expressões matemáticas, mas é mais comum se usar a sintaxe semelhante ao C, utilizando dois parênteses:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">a</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span> + <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
$ <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>i++<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
$ <span style="color: #007800;">x</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>x<span style="color: #000000; font-weight: bold;">*</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
...</pre></div></div>

<h3><a name="bashrc">10. O Arquivo .bashrc</a></h3>
<p>Na home dos usuários (~), é comum haver o arquivo .bashrc (o ponto no início indica que o arquivo é oculto). Esse arquivo é sempre executado quando se abre um shell. Nele, constam diversas configurações, como definição de variáveis de ambientes, definição de aliases etc. Você pode editar esse arquivo (ou criá-lo, caso não exista):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">vim</span> ~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></div></div>

<p>É possível usar outros editores, não apenas o vim.</p>
<h3><a name="alias">11. Aliases (Apelidos)</a></h3>
<p>Algumas vezes usamos comandos que necessitam de várias opções e argumentos. Para amenizar o trabalho de digitarmos repetidamente estes comandos o bash oferece um recurso chamado alias com o qual podemos definir sinônimos ou &#8220;apelidos&#8221; para um comando. Um alias pode ser definido na linha de comando da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #000000; font-weight: bold;">&lt;</span>nome<span style="color: #000000; font-weight: bold;">&gt;</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>comando<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Observe que não pode haver espaços em branco antes ou depois do &#8220;=&#8221;.</p>
<p>Esta sintaxe indica que nome é um &#8220;alias&#8221; (apelido) para comando. Toda vez que digitarmos o comando &#8220;nome&#8221;, o bash o substituirá por &#8220;comando&#8221;.</p>
<p>Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">lf</span>=<span style="color: #ff0000;">'ls -F'</span></pre></div></div>

<p>Isso fará o shell executar &#8220;ls -F&#8221; toda vez que usarmos &#8220;lf&#8221; na linha de comando. Ou seja, o que o alias faz na verdade é substituir a palavra &#8220;lf&#8221; por &#8220;ls -F&#8221;. Observe neste exemplo, existe um espaço em branco entre ls e -F. Sempre que houver espaços em branco na definição de um campo, todo o campo deve ser digitado entre aspas simples (&#8216;) ou duplas (&#8220;).</p>
<p>É possível definir aliases em seu .bashrc, para que eles estejam sempre disponíveis na sua sessão.</p>
<h3><a name="refs">12. Referências</a></h3>
<p>Linux Básico:<br />
http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico/ ou http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxBasico.pdf</p>
<p>Linux Avançado</p>
<p>http://www.inf.ufpr.br/nicolui/Docs/Livros/LinuxAvancado.pdf</p>
<p>Canivete Suiço do Shell (Bash)</p>
<p>http://aurelio.net/shell/canivete/</p>
<p>Livro Shell Script Profissional (Livro físico):</p>
<p>http://www.shellscript.com.br/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/curso-de-shell-script-modulo-1-scripts-shell-estruturas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O comando SED do Linux</title>
		<link>http://www.rberaldo.com.br/blog/o-comando-sed-do-linux/</link>
		<comments>http://www.rberaldo.com.br/blog/o-comando-sed-do-linux/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 23:09:22 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[AWK]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[comando]]></category>
		<category><![CDATA[filtragem]]></category>
		<category><![CDATA[filtro]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[stream]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=241</guid>
		<description><![CDATA[A ferramenta SED, junto ao AWK, são as duas principais linguagens para manipulação de arquivos e streams do Linux.]]></description>
			<content:encoded><![CDATA[<p>A ferramenta SED, junto ao AWK, são as duas principais linguagens para manipulação de arquivos e <em>streams</em> do Unix/Linux. Ambas possuem vasta abrangência e o que uma não pode fazer, a outra provavelmente o fará.</p>
<p>Com o SED é possível substituir e &#8220;casar&#8221; padrões, sempre por meio de Expressões Regulares, outra grande ferramenta do mundo da Computação.</p>
<p><span id="more-241"></span></p>
<p>O SED, assim como o AWK, lê um arquivo, linha por linha, e aplica a expressão do parâmetro a cada uma delas.</p>
<p>A sintaxe do SED é a seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'expressão'</span> arquivo</pre></div></div>

<p>É possível filtrar a saída de outro comando, em vez de filtrar um arquivo, usando pipe. Usarei saídas do comando echo para explicar o sed.</p>
<p>SED usa Expressões Regulares (ER&#8217;s). Se você não conhece ER&#8217;s, sugiro ler o <a href="http://guia-er.sourceforge.net" target="_blank" onclick="urchinTracker('/outgoing/guia-er.sourceforge.net?referer=');">Expressões Regulares &#8211; Guia de Consulta Rápida</a></p>
<p><a href="#comm_s">1. Substituindo textos: comando s</a><br />
<a href="#delim">1.1. Escapando o delimitador</a><br />
<a href="#retro">1.2. Usando a expressão casada em ER na substituição</a><br />
<a href="#retro2">1.3 Usando &#8220;retrovisores&#8221; (\1, \2&#8230;)</a><br />
<a href="#mods">2. Modificadores</a><br />
<a href="#mod_g">2.1. Modificador &#8220;g&#8221;: tratar linha inteira</a><br />
<a href="#mod_p">2.2. Modificador &#8220;p&#8221;: exibir na tela</a><br />
<a href="#limit_linha">3. Restringindo por linhas</a><br />
<a href="#limit_pattern">4. Restringindo por padrões</a><br />
<a href="#comm_d">5. Remover linha: comando d</a><br />
<a href="#comm_q">6. Sair: comando q</a><br />
<a href="#comm_a">7. Adicionando linha: comando &#8220;a&#8221;</a><br />
<a href="#comm_i">8. Adicionando linha: comando &#8220;i&#8221;</a><br />
<a href="#comm_c">9. Mudando uma linha: comando c</a><br />
<a href="#links">10. Links</a></p>
<h2><a name="comm_s">1. Substituindo textos: comando s</a></h2>
<p>Sintaxe: <strong>s/ER/sub/[modificadores]</strong>: Substitui os padrões &#8220;casados&#8221; em &#8220;ER&#8221; por &#8220;sub&#8221;.</p>
<p>A utilidade mais conhecida do SED é a substituição de textos. Para isso, usamos o comando &#8220;s&#8221; do sed:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Tutorial sobre sed: aprenda a trabalhar com sed&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/sed/awk/'</span></pre></div></div>

<p>A saída será: <strong>Tutorial sobre awk: aprenda a trabalhar com sed</strong>. Note que a última ocorrência de &#8220;sed&#8221; não foi modificada. Isso porque o sed faz a modificação na primeira ocorrência e, em seguida, já procura pelo padrão na linha seguinte, se houver. Para que o sed execute a ação na linha toda, usamos o modificador &#8220;g&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Tutorial sobre sed: aprenda a trabalhar com sed&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/sed/awk/g'</span></pre></div></div>

<p>Agora a saída é a esperada: <strong>Tutorial sobre awk: aprenda a trabalhar com awk</strong>.</p>
<p>Os modificadores serão abordados com mais detalhes logo mais abaixo. Não percam! =P</p>
<h3><a name="delim">1.1. Escapando o delimitador</a></h3>
<p>Como estamos usando a barra (/) como delimitador, se quisermos usar esse caractere na ER ou na substituição, temos de escapá-lo, com barra invertida:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;o arquivo /proc/cpuinfo possui informações importantes&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/\/proc\/cpuinfo/\/etc\/passwd/'</span></pre></div></div>

<p>Saída: <strong>o arquivo /etc/passwd possui informações importantes</strong></p>
<h3><a name="retro">1.2. Usando a expressão casada em ER na substituição</a></h3>
<p>Às vezes queremos acrescentar algo ao texto original. Por isso, é preciso que tenhamos o texto casado na ER. Para isso, usamos o caractere &amp; para nos referirmos à expressão casada pela ER.</p>
<p>Suponhamos que queremos colocar todos os caminhos de arquivos entre aspas. Para isso:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;o arquivo /proc/cpuinfo possui informações importantes <span style="color: #000099; font-weight: bold;">\n</span>Este tutorial está em /home/beraldo/tutoriais. Há muitos outros nesse diretório&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'s/(\/[^ .,]*)+/&quot;&amp;amp;&quot;/'</span></pre></div></div>

<p>Saída:<br />
o arquivo &#8220;/proc/cpuinfo&#8221; possui informações importantes<br />
Este tutorial está em &#8220;/home/beraldo/tutoriais&#8221;. Há muitos outros nesse diretório</p>
<p>A opção &#8220;-r&#8221; usa o padrão estendido de expressões regulares &#8211; o mesmo usado por &#8220;egrep&#8221;. Isso possibilita o uso da lista negada.</p>
<h3><a name="retro2">1.3 Usando &#8220;retrovisores&#8221; (\1, \2&#8230;)</a></h3>
<p>Muitas vezes queremos substituir partes de um texto, mas manter outras. Para isso, podemos usar os &#8220;retrovisores&#8221;, que inserem na string final os padrões casados na ER inseridos em grupos (<strong>(</strong> e <strong>)</strong>). O primeiro grupo casado é referenciado por \1, o segundo, por \2 e assim sucessivamente, até \9.</p>
<p>Por exemplo, vamos manter apenas a primeira palavra de cada linha do texto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;primeira linha<span style="color: #000099; font-weight: bold;">\n</span>segunda linha<span style="color: #000099; font-weight: bold;">\n</span>terceira linha&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'s/^([a-z]+).*/\1/g'</span></pre></div></div>

<p><strong>Importante:</strong> Para usar os retrovisores, é necessário usar a opção -r do sed, que ativa o padrão estendido de ERs.</p>
<h2><a name="mods">2. Modificadores</a></h2>
<h3><a name="mod_g">2.1. Modificador &#8220;g&#8221;: tratar linha inteira</a></h3>
<p>Já vimos o modificador g anteriormente, que serve para forçar o SED a aplicar a expressão na linha inteira.</p>
<p>É possível associar um número ao modificador &#8220;g&#8221;, para fazer com que o SED atue apenas a partir de uma determinada ocorrência do padrão.<br />
Por exemplo, vamos substituir por NULL todas as palavraas do texto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;palavra1 palavra2 palavra3&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'s/([a-zA-Z0-9]+)/NULL/g'</span></pre></div></div>

<p>Vamos supor que gostaríamos de remover todas as ocorrências, exceto a primeira. Para isso executaríamos o sed assim:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;palavra1 palavra2 palavra3&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'s/([a-zA-Z0-9]+)/NULL/2g'</span></pre></div></div>

<p>O &#8220;2&#8243; faz com que a substituição ocorra apenas a partir da segunda ocorrência do padrão.</p>
<h3><a name="mod_p">2.2. Modificador &#8220;p&#8221;: exibir na tela</a></h3>
<p>Por padrão, o SED imprime na saída padrão todas as linhas lidas &#8211; e modificadas. A opção -n impede que o sed faça a impressão das linhas. É nessa situação que o modificador &#8220;p&#8221; é útil. Quando quisermos imprimir somente as linhas alteradas pelo SED, usaremos o modificador &#8220;p&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;linha sem números <span style="color: #000099; font-weight: bold;">\n</span>Linha com números: 1 2 3 4 5 6 <span style="color: #000099; font-weight: bold;">\n</span>Linha com mais números 42 81&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">'s/[0-9]+/X/gp'</span></pre></div></div>

<p>Serão mostradas apenas as linhas que casaram com o padrão.</p>
<p>Como foi possível ver no exemplo acima, é possível misturar os modificadores.</p>
<h2><a name="limit_linha">3. Restringindo por linhas</a></h2>
<p>E possível fazer o SED atuar somente num intervalo de linhas.</p>
<p>Vamos mostrar os dez primeiros usuários do sistema, listando as dez primeiras linhas do arquivo /etc/passwd.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">'1,10 s/([^:]+).*/\1/p'</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span></pre></div></div>

<p>Note a opção -n e o modificador &#8220;p&#8221;, para mostrar somente o padrão casado.</p>
<p>É possível usar o caractere $ (cifrão) para se referir à última linha do arquivo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">'1,$ s/([^:]+).*/\1/p'</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span></pre></div></div>

<h2><a name="limit_pattern">4. Restringindo por padrões</a></h2>
<p>Além de restringir por número de linhas, podemos restringer por padrão:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;esta<span style="color: #000099; font-weight: bold;">\n</span>é<span style="color: #000099; font-weight: bold;">\n</span>uma<span style="color: #000099; font-weight: bold;">\n</span>linha<span style="color: #000099; font-weight: bold;">\n</span>usada<span style="color: #000099; font-weight: bold;">\n</span>para<span style="color: #000099; font-weight: bold;">\n</span>testar<span style="color: #000099; font-weight: bold;">\n</span>o<span style="color: #000099; font-weight: bold;">\n</span>comando<span style="color: #000099; font-weight: bold;">\n</span>sed&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span>  <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'/uma/,/comando/s/[ae]/X/g'</span></pre></div></div>

<h2><a name="comm_d">5. Remover linha: comando d</a></h2>
<p>O comando &#8220;d&#8221; do sed remove linhas.<br />
Vamos remover as dez primeiraas linhas de /etc/passwd:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'1,10 d'</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span></pre></div></div>

<h2><a name="comm_q">6. Sair: comando q</a></h2>
<p>O comando &#8220;q&#8221; faz o sed parar após encontrar o padrão</p>
<p>Imprime as dez primeiras linhas de /etc/passwd</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'10 q'</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span></pre></div></div>

<p>Para após encontrar um número:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;sou uma linha<span style="color: #000099; font-weight: bold;">\n</span>sou outra linha<span style="color: #000099; font-weight: bold;">\n</span>esta linha tem número 1<span style="color: #000099; font-weight: bold;">\n</span>esta já não tem número&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'/[0-9]+/ q'</span></pre></div></div>

<h2><a name="comm_a">7. Adicionando linha: comando &#8220;a&#8221;</a></h2>
<p>É possível inserir linha após achar um padrão:</p>
<p>Insere linha após uma linha que contenha número</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;sou uma linha<span style="color: #000099; font-weight: bold;">\n</span>sou outra linha<span style="color: #000099; font-weight: bold;">\n</span>esta linha tem número 1<span style="color: #000099; font-weight: bold;">\n</span>esta já não tem número&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'/[0-9]+/ a Oi. Sou novo aqui'</span></pre></div></div>

<h2><a name="comm_i">8. Adicionando linha: comando &#8220;i&#8221;</a></h2>
<p>Quase igual ao comando &#8220;a&#8221;, mas insere a nova linha antes da linha casada com o padrão</p>
<p>Insere linha antes de uma linha que contenha número</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;sou uma linha<span style="color: #000099; font-weight: bold;">\n</span>sou outra linha<span style="color: #000099; font-weight: bold;">\n</span>esta linha tem número 1<span style="color: #000099; font-weight: bold;">\n</span>esta já não tem número&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'/[0-9]+/ i Oi. Sou novo aqui'</span></pre></div></div>

<h2><a name="comm_c">9. Mudando uma linha: comando c</a></h2>
<p>Semelhante a &#8220;a&#8221; e &#8220;i&#8221;, mas muda a linha que casou com o padrão</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;sou uma linha<span style="color: #000099; font-weight: bold;">\n</span>sou outra linha<span style="color: #000099; font-weight: bold;">\n</span>esta linha tem número 1<span style="color: #000099; font-weight: bold;">\n</span>esta já não tem número&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'/[0-9]+/ c Fui modificado'</span></pre></div></div>

<h2><a name="links">10. Links</a></h2>
<p><a href="http://www.grymoire.com/Unix/Sed.html" onclick="urchinTracker('/outgoing/www.grymoire.com/Unix/Sed.html?referer=');">http://www.grymoire.com/Unix/Sed.html</a><br />
<a href="http://www.zago.eti.br/script/sed.html" onclick="urchinTracker('/outgoing/www.zago.eti.br/script/sed.html?referer=');">http://www.zago.eti.br/script/sed.html</a><br />
<a href="http://www.linuxmanpages.com/man1/sed.1.php" onclick="urchinTracker('/outgoing/www.linuxmanpages.com/man1/sed.1.php?referer=');">http://www.linuxmanpages.com/man1/sed.1.php</a><br />
<a href="http://guia-er.sourceforge.net/" onclick="urchinTracker('/outgoing/guia-er.sourceforge.net/?referer=');">http://guia-er.sourceforge.net/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/o-comando-sed-do-linux/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Executando scripts na inicialização do Debian/Ubuntu</title>
		<link>http://www.rberaldo.com.br/blog/executando-scripts-na-inicializacao-do-debianubuntu/</link>
		<comments>http://www.rberaldo.com.br/blog/executando-scripts-na-inicializacao-do-debianubuntu/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 21:09:32 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[inicialização]]></category>
		<category><![CDATA[init]]></category>
		<category><![CDATA[init.d]]></category>
		<category><![CDATA[initd]]></category>
		<category><![CDATA[Programação Shell]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=196</guid>
		<description><![CDATA[Como executar scripts na inicialização do Debian ou Ubuntu]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes desejamos executar algum comando ou iniciar serviços na inicialização do Sistema Operacional. É muito simples executar essa operação usando o Debian ou o Ubuntu.</p>
<p>Veja abaixo um passo-a-passo e um exemplo usando uma instalação manual do Servidor WEB Apache.</p>
<p><span id="more-196"></span></p>
<p><strong>Todos os comandos precisam ser executados como root.</strong></p>
<p>Primeiramente, vamos criar um script chamado <strong>meuScript</strong> em /etc/init.d com uma estrutura semelhante à abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># /etc/init.d/meuScript</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
    start<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Iniciando serviço...&quot;</span>
        <span style="color: #666666; font-style: italic;"># comando para iniciar o serviço</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
    stop<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Parando serviço...&quot;</span>
        <span style="color: #666666; font-style: italic;"># comando para parar o serviço</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
    restart<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Reiniciando serviço...&quot;</span>
        <span style="color: #666666; font-style: italic;"># comando para reiniciar o serviço</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Operação inválida&quot;</span>
        <span style="color: #000000; font-weight: bold;">;;</span>
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

<p>Dê permissão de execução para o script:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># chmod +x meuScript</span></pre></div></div>

<p>A partir desse momento você já pode executar os comandos abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># /etc/init.d/meuScript start</span>
<span style="color: #666666; font-style: italic;"># /etc/init.d/meuScript stop</span>
<span style="color: #666666; font-style: italic;"># /etc/init.d/meuScript restart</span></pre></div></div>

<p>Para inserir o script na inicialização do sistema, usamos o comando update-rc.d da seguinte maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-rc.d meuScript defaults</span></pre></div></div>

<p>O &#8220;meuScript&#8221; é o nome do script em /etc/init.d, não o caminho completo a ele, ou seja, não importa em qual diretório você está, apenas coloque o nome do script.</p>
<p>O &#8220;defaults&#8221; indica que desejamos inserir o script nos <em>runlevels</em> padrões do sistema.</p>
<p>Ao executar esse comando, um warning será mostrado, apesar de o comando ter funcionado. Aparecerá uma mensagem como esta:</p>
<p>&#8220;<strong>update-rc.d: warning: /etc/init.d/meuScript missing LSB information<br />
update-rc.d: see &lt;http://wiki.debian.org/LSBInitScripts&gt;</strong>&#8221;</p>
<p>Você pode ignorá-lo ou inserir as informações de LSB, o que é mostrado no link exibido no warning. É algo bem simples. =)</p>
<p>Para remover um script da inicialização:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-rc.d -f meuScript remove</span></pre></div></div>

<p>Como prometi, vou mostrar um exemplo que uso para uma instalação manual do Apache:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># /etc/init.d/apache2 </span>
&nbsp;
<span style="color: #666666; font-style: italic;">### BEGIN INIT INFO</span>
<span style="color: #666666; font-style: italic;"># Provides:          apache2</span>
<span style="color: #666666; font-style: italic;"># Required-Start:    $local_fs $syslog</span>
<span style="color: #666666; font-style: italic;"># Required-Stop:     $local_fs $syslog</span>
<span style="color: #666666; font-style: italic;"># Default-Start:     2 3 4 5</span>
<span style="color: #666666; font-style: italic;"># Default-Stop:      0 1 6</span>
<span style="color: #666666; font-style: italic;"># Short-Description: Start Apache at boot</span>
<span style="color: #666666; font-style: italic;"># Description:       Start Apache HTTP Server</span>
<span style="color: #666666; font-style: italic;">### END INIT INFO</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Path to Apache controller</span>
<span style="color: #007800;">BIN</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>apachectl
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> startApache<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Starting Apache...&quot;</span>
	<span style="color: #007800;">$BIN</span> start
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> stopApache<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Stopping Apache...&quot;</span>
	<span style="color: #007800;">$BIN</span> stop
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
	start <span style="color: #7a0874; font-weight: bold;">&#41;</span>
		startApache
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
		<span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;OK.&quot;</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
&nbsp;
	stop <span style="color: #7a0874; font-weight: bold;">&#41;</span>
		stopApache
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
		<span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;OK.&quot;</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
	restart <span style="color: #7a0874; font-weight: bold;">&#41;</span>
		stopApache
		<span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">1</span>
		startApache
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
		<span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;OK.&quot;</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
&nbsp;
	<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Invalid option&quot;</span>
		<span style="color: #000000; font-weight: bold;">;;</span>
<span style="color: #000000; font-weight: bold;">esac</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/executando-scripts-na-inicializacao-do-debianubuntu/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Comandos do Editor Vim</title>
		<link>http://www.rberaldo.com.br/blog/comandos-do-editor-vi/</link>
		<comments>http://www.rberaldo.com.br/blog/comandos-do-editor-vi/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 15:25:56 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[editor vi]]></category>
		<category><![CDATA[editor vim]]></category>
		<category><![CDATA[Programação Shell]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[vi]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=84</guid>
		<description><![CDATA[O Vi é um editor de textos do Unix. Ele vem por padrão em todas as distribuições Linux, portanto é bom conhecer alguns de seus comandos básicos. A vantagem desse editor sobre outros, como GEdit ou KEdit, é que o Vi roda em terminal, sem interface gráfica, o que permite utilizá-lo num ambiente de linha de comando, como numa conexão por SSH.]]></description>
			<content:encoded><![CDATA[<p>O <a title="Vi" href="http://pt.wikipedia.org/wiki/Vi" target="_blank" title="Vi" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Vi?referer=');">Vi</a> é um editor de textos do Unix. Ele vem por padrão em todas as distribuições Linux, portanto é bom conhecer alguns de seus comandos básicos. A vantagem desse editor sobre outros, como GEdit ou KEdit, é que o Vi roda em terminal, sem interface gráfica, o que permite utilizá-lo num ambiente de linha de comando, como numa conexão por <a href="http://pt.wikipedia.org/wiki/Ssh" target="_blank" title="ssh" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Ssh?referer=');">SSH</a>.</p>
<p><span id="more-84"></span></p>
<p><a href="#modos">1. Modos de trabalho do Vi</a><br />
<a href="#salvando">2. Salvando arquivos e saindo do editor</a><br />
<a href="#move">3. Movimentando o cursor</a><br />
<a href="#nav">4. Navegação no texto</a><br />
<a href="#move2">5. Movimentando textos</a><br />
<a href="#apagar">6. Apagando texto</a><br />
<a href="#copy">7. Copiando e colando textos</a><br />
<a href="#undo">8. Desfazendo ações</a><br />
<a href="#find">9. Localizando textos</a><br />
<a href="#replace">10. Localizando e substituindo textos</a><br />
<a href="#exec">11. Executando comandos no Shell sem sair do Vi</a><br />
<a href="#insert">12. Inserindo no texto a saída de um comando Shell</a><br />
<a href="#program">13. Facilidades para programadores e desenvolvedores</a><br />
<a href="#conf">14. Configuração do ambiente (comando <code>set</code></a></p>
<h3><a name="modos">1. Modos de trabalho do Vi</a></h3>
<p>O Vi possui dois modos de trabalho: modo de inserção e modo de comando. Ao ser iniciado, o programa estará <strong>sempre</strong> em modo de comando. Para alternar do modo de comando para o modo de inserção, há duas maneiras:</p>
<p>a -&gt; Ao pressionar a tecla &#8220;a&#8221;, o modo de inserção é ativado e o cursor de texto é posicionado logo após o caractere corrente;<br />
i -&gt; Ao pressionar a tecla &#8220;i&#8221;, o modo de inserção é ativado e o cursor de texto é posicionado à esquerda do caractere corrente.</p>
<p>Para alternar do modo de inserção para o modo de comando, basta pressionar a tecla &#8220;ESC&#8221;.</p>
<h3><a name="salvando">2. Salvando arquivos e saindo do editor</a></h3>
<p>Entrar no Vi é fácil. Sair, à primeira vista, é um dilema, podendo causar claustrofobia digital. :P<br />
Os seguintes comandos devem ser executados em modo de comando, claro.</p>
<p>:w -&gt; salva o  arquivo corrente. É possível passar um argumento, para definir o nome do arquivo. Por exemplo: <code>:w arq1.txt</code><br />
ZZ -&gt; salva o documento e sai do Vi. É conhecido como o comando &#8220;Zalva e Zai&#8221;. :)<br />
:wq -&gt; Salva o arquivo e sai do Vi<br />
:w! -&gt; O arquivo será salvo mesmo se aberto no modo somente leitura (<em>readonly</em>)<br />
:q -&gt; Sai do Vi. Se o arquivo não foi salvo, o programa emitirá um alerta.<br />
:q! -&gt; Força a saída, mesmo que o arquivo tenha sido modificado e não tenha sido salvo anteriormente</p>
<p>Os comandos &#8220;:wq&#8221; e &#8220;ZZ&#8221; fazem praticamente a mesma coisa. Porém, &#8220;ZZ&#8221; é mais rápido de se digitar e mais fácil de lembrar (Zalva e Zai!). ;)</p>
<h3><a name="move">3. Movimentando o cursor</a></h3>
<p>Isso parece fácil. Basta usar as setas. Mas e se você estiver num teclado sem as teclas das setas? Pode parecer jurássico, mas pode acontecer. Nesse caso, use os seguintes comandos:</p>
<p>h -&gt; Desloca para a esquerda<br />
j -&gt; Desloca para baixo<br />
k -&gt; Desloca para cima<br />
l -&gt; Desloca para a direita</p>
<p>É possível digitar um número antes desses comandos, informando o número de deslocamentos desejado.</p>
<h3><a name="nav">4. Navegação no texto</a></h3>
<p>[n]$ -&gt; Move o cursor para o fim da linha. Se especificado um número antes do &#8220;$&#8221; (cifrão), move para o final da linha com o número especificado (a linha corrente é 1; a conseguinte é 2 e assim sucessivamente)<br />
^ -&gt; Move o cursor para o início da linha corrente. Se o teclado for ABNT ou similares, com teclas para acentuação, você terá de digitar a tecla duas vezes, para o Vi compreender o comando literalmente, não como um acento para outra letra.<br />
0 (número zero) -&gt; Equivale ao comando &#8220;^&#8221;.<br />
[n]A -&gt; Move o cursor para o fim da linha e entra em modo de inserção. É possível inserir um numero antes do &#8220;A&#8221;, como no comando &#8220;$&#8221;.<br />
[n]G -&gt; Se não for especificado o número &#8220;n&#8221;, o cursor será movido para o fim do arquivo. Caso contrário, desloca o cursor para a linha &#8220;n&#8221;.</p>
<h3><a name="move2">5. Movimentando textos</a></h3>
<p>OBS: <code>^LETRA</code> corresponde à combinação das teclas CTRL e a letra especificada.</p>
<p>^e -&gt; Move o texto para cima, independentemente da posição do cursor.<br />
^y -&gt; Move o texto para baixo, independentemente da posição do cursor.</p>
<h3><a name="apagar">6. Apagando texto</a></h3>
<p>[n]x -&gt; Apaga o caractere sob o cursor. É possível especificar o número de caracteres a serem removidos.<br />
[n]X -&gt; Apaga o caractere à esquerda do cursor. É possível especificar o número de caracteres a serem removidos.<br />
[n]dd -&gt; Apaga a linha corrente. É possível especificar o número de linhas a serem removidas após a linha corrente.<br />
D -&gt; Apaga todos os caracteres da posição corrente até o final da linha.<br />
d$ -&gt; Equivale ao comando &#8220;D&#8221;.<br />
d^-&gt; Apaga todos os caracteres da posição corrente até o início da linha.<br />
dw -&gt; apaga os caracteres da posição corrente até o final da palavra.</p>
<h3><a name="copy">7. Copiando e colando textos</a></h3>
<p>Para copiar uma linha de textos, usamos o comando &#8220;yy&#8221;. É possível usar &#8220;[n]yy&#8221; para definir o número de linhas a serem copiadas.</p>
<p>Para colar o texto copiado, usa-se &#8220;[n]p&#8221; para colar à direita do cursor ou &#8220;[n]P&#8221; para colar à esquerda do cursor. O número &#8220;n&#8221; (opcional) determina o número de vezes que o texto será colado.</p>
<h3><a name="undo">8. Desfazendo ações</a></h3>
<p>Não existe o famoso CTRL+Z no Vi. Mas há como desfazer comandos.</p>
<p>u -&gt; Desfaz o último comando<br />
U -&gt; Desfaz todos os comandos executados na linha corrente</p>
<h3><a name="find">9. Localizando textos</a></h3>
<p>/texto -&gt; Busca pela ocorrência da palavra &#8220;texto&#8221; a partir da posição corrente do cursor até o fim do arquivo.<br />
?texto -&gt; Busca pela ocorrência da palavra &#8220;texto&#8221; a partir da posição corrente do cursor até o início do arquivo.<br />
n -&gt; Repete o último comando de busca (<em>next</em>)</p>
<h3><a name="replace">10. Localizando e substituindo textos</a></h3>
<p>Os comandos abaixo assemelham-se à sintaxe dos comandos de substituição do <a href="http://pt.wikipedia.org/wiki/Sed" target="_blank" title="sed" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Sed?referer=');"><code>sed</code></a>.</p>
<p>:s/busca/troca -&gt; Encontra a primeira ocorrência de &#8220;busca&#8221; e a modifica para &#8220;troca&#8221;, na linha corrente.<br />
:s/busca/troca/g -&gt; Faz a mesma coisa que o comando acima, porém o executa em toda a linha.</p>
<p>É possível definir o intervalo de linhas onde a busca será feita, da seguinte forma:</p>
<p>:<em>inicio,fim</em>s/busca/troca.</p>
<p>Por exemplo:</p>
<p>:1.42s/busca/troca -&gt; Executa a troca no intervalo das linhas 1 a 42<br />
:..42s/busca/troca -&gt; Executa a troca a partir da linha atual até a linha 42<br />
:..$s/busca/troca -&gt; Executa a troca a partir da linha atual até o fim do arquivo</p>
<p>A busca pode ser feita usando <a href="http://pt.wikipedia.org/wiki/Express%C3%B5es_regulares" target="_blank" title="Expressões Regulares" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Express_C3_B5es_regulares?referer=');">Expressões Regulares</a>.</p>
<h3><a name="exec">11. Executando comandos no Shell sem sair do Vi</a></h2>
<p>Para executar um comando no shell sems air do Vi, basta proceder da seguinte forma:</p>
<p>:! comando_shell</p>
<p>Por exemplo:</p>
<p>:! ls -l</p>
<h3><a name="insert">12. Inserindo no texto a saída de um comando Shell</a></h3>
<p>O comando anterior executa uma ação no Shell, mas descarta a saída. Se você pretende inserir a saída do comando no texto que está editando no Vi, basta proceder assim:</p>
<p>!! comando_shell</p>
<p>Por exemplo</p>
<p>!! ls -l</p>
<h3><a name="program">13. Facilidades para programadores e desenvolvedores</a></h3>
<h4>Indentação</h4>
<p>Para inserir <a href="http://pt.wikipedia.org/wiki/Endenta%C3%A7%C3%A3o" target="_blank" title="indentação" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Endenta_C3_A7_C3_A3o?referer=');">indentação</a>, primeiro devemos definir o tamanho da tabulação, usando o comando <code>:set</code> (mais a frente detalharei esse comando).</p>
<p>:set sw=n</p>
<p>Onde &#8220;n&#8221; é o tamanho da tabulação.</p>
<p>Feito isso, poderemos utilizar os seguintes comandos:</p>
<p>[n]&gt;&gt; -&gt; Indenta n linhas (ou apenas a linha corrente se &#8220;n&#8221; for omitido)<br />
[n]&lt;&lt; -&gt; Retira a indentação de n linhas (ou apenas da linha corrente se &#8220;n&#8221; for omitido)</p>
<h4>Correspondência entre parênteses, colchetes e chaves</h4>
<p>Com o cursor sobre um sinal de parênteses, colchete ou chave, execute o comando &#8220;%&#8221;. Se houver um caractere correspondente, o cursor será movido para ele.</p>
<h3><a name="conf">14. Configuração do ambiente (comando <code>set</code></a></h3>
<p>:set &lt;opcão&gt; -&gt; Ativa &lt;opção&gt;<br />
:set no&lt;opção&gt; -&gt; Desativa &lt;opção&gt;<br />
:set &lt;opção&gt;=&lt;valor&gt; -&gt; Define &lt;valor&gt; à &lt;opção&gt;<br />
:set &lt;opção&gt;? -&gt; Exibe o valor de &lt;opção&gt;<br />
:set all -&gt; Exibe todas as opções</p>
<p>Algumas opções do comando set:</p>
<p>ai -&gt; <em>Autoindent</em>. Indentação automática<br />
ic -&gt; <em>Ignore case</em>. Ignora maiúsculas e minúsculas numa busca.<br />
nu -&gt; Numeração de linhas<br />
sw -&gt; <em>shift width</em>. Tamanho da tabulação<br />
sm -&gt; <em>show match</em>. Ao fechar um parêntese, colchete ou chave, o Vi mostra onde ele foi aberto. Caso não haja correspondência, um bip será emitido.</p>
<p>Para não precisar definir todas essas configurações sempre que iniciar o Vi, você pode criar um arquivo de configuração. O Vi busca no arquivo ~/.exrc (arquivo oculto exrc na home do usuário) as configurações iniciais. Logo, você pode criar um arquivo assim:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">set</span> <span style="color: #668080;">sw</span>=<span style="color: #000000; font-weight:bold;">4</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">ai</span>
<span style="color: #804040;">set</span> <span style="color: #668080;">nu</span></pre></div></div>

<p></p>
<p>Links interessantes:<br />
<a href="http://jamielesouef.com/linux/vim-editor-100-commands-every-admin-should-know/" target="_blank" onclick="urchinTracker('/outgoing/jamielesouef.com/linux/vim-editor-100-commands-every-admin-should-know/?referer=');">Vim Editor : 100 commands every admin should know </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/comandos-do-editor-vi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial AWK</title>
		<link>http://www.rberaldo.com.br/blog/tutorial-awk/</link>
		<comments>http://www.rberaldo.com.br/blog/tutorial-awk/#comments</comments>
		<pubDate>Thu, 07 May 2009 12:27:00 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Shell Script (Bash)]]></category>
		<category><![CDATA[AWK]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Programação Shell]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/2009/05/07/tutorial-awk/</guid>
		<description><![CDATA[Não sou nenhum expert ou grande conhecedor da linguagem AWK, mas ela é muito útil e me ajudou muito nas provas sobre Shell Script na faculdade. Por isso resolvi escrever este pequeno e introdutório tutorial acerca dessa linguagem. É bom todo usuário Linux saber usá-la. =) AWK é uma linguagem utilizada para processamento de informações [...]]]></description>
			<content:encoded><![CDATA[<p>Não sou nenhum <em>expert</em> ou grande conhecedor da linguagem AWK, mas ela é muito útil e me ajudou muito nas provas sobre Shell Script na faculdade. Por isso resolvi escrever este pequeno e introdutório tutorial acerca dessa linguagem. É bom todo usuário Linux saber usá-la. =)</p>
<p>AWK é uma linguagem utilizada para processamento de informações em texto, como o conteúdo de um arquivo &#8211; principalmente informações em colunas &#8211; ou a saída de outros comandos, como <strong>cat</strong>, <strong>grep</strong> etc.</p>
<p><span id="more-15"></span><br />
A estrutura de um script AWK (pode estar em um arquivo ou ser escrito diretamente na linha de comando &#8211; Shell) é a seguinte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">BEGIN<span style="color: #7a0874; font-weight: bold;">&#123;</span>
 Comandos executados ao iniciar o processamento, antes de ler <span style="color: #c20cb9; font-weight: bold;">as</span> linhas <span style="color: #000000; font-weight: bold;">do</span> texto
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>condicao<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
 Comandos a serem executados em todas <span style="color: #c20cb9; font-weight: bold;">as</span> linhas <span style="color: #000000; font-weight: bold;">do</span> texto
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
END<span style="color: #7a0874; font-weight: bold;">&#123;</span>
 Comando final. Executado após o processamento de todas <span style="color: #c20cb9; font-weight: bold;">as</span> linhas
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></td></tr></table></div>

<p>A condição do segudo bloco é opcional. Se não especificada, os respectivos comandos do bloco serão executados em todas as linhas. Caso contrário, serão executados apenas nas linhas que satisfizerem a condição.<br />
A condição pode ser uma expressão regular. Basta colocá-la entre barras:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>^A<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
 Comando...
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></td></tr></table></div>

<p>Se um bloco de comandos estiver vazio, é executado <strong>print $0</strong>, ou seja, imprime a linha corrente.</p>
<p>Algumas variáveis definidas no AWK:</p>
<p>FS -> separador de campos<br />
NR -> número da linhas<br />
NF -> número de campos na linha</p>
<p>Para mais informações:</p>
<p>Manpage do AWK: <a href="http://www.linuxmanpages.com/man1/awk.1.php" target="_blank" onclick="urchinTracker('/outgoing/www.linuxmanpages.com/man1/awk.1.php?referer=');"><strong>$ man awk</strong></a><br />
<a href="http://www.gnu.org/software/gawk/manual/gawk.html" target="_blank" onclick="urchinTracker('/outgoing/www.gnu.org/software/gawk/manual/gawk.html?referer=');">http://www.gnu.org/software/gawk/manual/gawk.html</a><br />
<a href="http://en.wikipedia.org/wiki/Awk" target="_blank" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Awk?referer=');">http://en.wikipedia.org/wiki/Awk</a></p>
<p>Exemplos:</p>
<p>Filtra  as linhas com o padrão especificado. Linhas que terminam com conf</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #000000; font-weight: bold;">/</span>conf$<span style="color: #000000; font-weight: bold;">/</span></pre></td></tr></table></div>

<p>Usando outro separador de campos e imprimindo colunas</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> -F: <span style="color: #ff0000;">'{print $1}'</span></pre></td></tr></table></div>

<p>Usando separador de campos</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $1 FS $8}'</span></pre></td></tr></table></div>

<p>Numerando linhas</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print NR FS$1 FS $8}'</span></pre></td></tr></table></div>

<p>Filtra linhas com padrão especificado e mostra apenas as colunas 1 e 8.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'/conf$/{print $1&quot; &quot;$8}'</span></pre></td></tr></table></div>

<p>Imprime as linhas com mais de 3 campos. Elimina a primeira linha do ls -l (Total)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'NF &gt; 3'</span></pre></td></tr></table></div>

<p>Filtra linhas com arquivos cujos nomes possuem menos de 5 caracteres</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'length($8) &lt; 5'</span></pre></td></tr></table></div>

<p>Imprime linhas pares</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'NR % 2 == 0 {print NR&quot; &quot;$0}'</span></pre></td></tr></table></div>

<p>Substitui strings</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{sub(/conf$/,&quot;test&quot;); print $0}'</span></pre></td></tr></table></div>

<p>Procura expressão em determinado campo</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>etc <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'$8 ~ /^[ae]/'</span></pre></td></tr></table></div>

<p>Inserindo strings entre campos</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">passwd</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> -F: <span style="color: #ff0000;">'{print &quot;Login: &quot; $1}'</span></pre></td></tr></table></div>

<p>Filtra  a saída de <strong>ls -l</strong>, a fim de mostrar o nome do arquivo, suas permissões e seu tamanho (a condição <strong>NR != 1</strong> evita que a linha <strong>Total</strong> seja exibida):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'NR != 1{print &quot;Nome: &quot;$8&quot; Perm: &quot;$1&quot; Tamanho: &quot;$5}'</span></pre></td></tr></table></div>

<p>Imprime o comprimento da maior linha</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{ if (length($0) &gt; max) max = length($0)}; END { print max}'</span>; arquivo</pre></td></tr></table></div>

<p>Imprime as linhas com mais de 42 caracteres</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'length($0) &gt; 42'</span> arquivo</pre></td></tr></table></div>

<p>Exibe o número de linhas do arquivo</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'END { print NR }'</span> arquivo</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/tutorial-awk/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

