<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.guineves.com.br/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.guineves.com.br/" rel="alternate" type="text/html" hreflang="pt-BR" /><updated>2026-10-28T19:16:27-03:00</updated><id>https://blog.guineves.com.br/feed.xml</id><title type="html">guineves :: blog</title><subtitle>Dicas, comandos, scripts e anotações sobre Linux, Bash, Middleware, Infraestrutura e Automação por Guilherme Neves.</subtitle><author><name>Guilherme Neves</name><email>gmneves@gmail.com</email></author><entry><title type="html">Como testar conexões sem telnet</title><link href="https://blog.guineves.com.br/como-testar-conexoes-sem-telnet/" rel="alternate" type="text/html" title="Como testar conexões sem telnet" /><published>2022-04-18T15:27:09-03:00</published><updated>2022-04-18T15:27:09-03:00</updated><id>https://blog.guineves.com.br/como-testar-conexoes-sem-telnet</id><content type="html" xml:base="https://blog.guineves.com.br/como-testar-conexoes-sem-telnet/"><![CDATA[<p>Vamos a mais uma dica, dessa vez vou mostrar uma alternativa para testar conexão entre 2 pontos sem utilizar executáveis como <code class="language-plaintext highlighter-rouge">telnet</code>, <code class="language-plaintext highlighter-rouge">netcat</code> e afins.</p>

<p>Para isso vamos fazer uso de um <em>“device file”</em> nativo chamado <code class="language-plaintext highlighter-rouge">/dev/tcp</code>.</p>

<p>Utilizando esse método, podemos observar alguns comportamentos, os quais irei detalhar abaixo.</p>

<p>Vamos usar como exemplo um teste simples de conexão com este site, na porta <code class="language-plaintext highlighter-rouge">443</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="o">&gt;</span>/dev/tcp/guineves.com.br/443
</code></pre></div></div>

<h3 id="conexão-ok">Conexão OK</h3>

<p>Caso, imediatamente após dar um Enter, o cursor retorne para o terminal sem mensagens, a conexão foi estabelecida com sucesso.</p>

<p>Isso pode ser confirmado verificando o <em>“exit code”</em> da última execução e vendo o retorno <code class="language-plaintext highlighter-rouge">0</code>, que significa execução sem erros:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo</span> <span class="nv">$?</span>
0
</code></pre></div></div>

<h3 id="conexão-recusada">Conexão recusada</h3>

<p>A seguinte informação nos mostra, de forma geral, que a conexão chegou até o host, mas que a porta não está aberta:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bash: connect: Connection refused
bash: /dev/tcp/guineves.com.br/443: Connection refused
</code></pre></div></div>

<p>Nesse caso o retorno do comando é <code class="language-plaintext highlighter-rouge">1</code>, indicando um erro:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo</span> <span class="nv">$?</span>
1
</code></pre></div></div>

<h3 id="timeout">Timeout</h3>

<p>Agora, caso o comando prenda o terminal, é sinal de que a tentativa de conexão não chega no destino, sugerindo, entre outros motivos, um bloqueio de firewall.</p>

<p>Ao final do timeout (aqui ele leva 2 minutos para acontecer), a mensagem abaixo é exibida e o código de retorno também é <code class="language-plaintext highlighter-rouge">1</code>:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bash: connect: Connection timed out
bash: /dev/tcp/guineves.com.br/443: Connection timed out
</code></pre></div></div>

<p>E aqui vai uma dica dentro da dica 😀</p>

<p>Podemos fazer uso do comando <code class="language-plaintext highlighter-rouge">timeout</code> para reduzir essa espera e um condicional <em>in-line</em> para analisar o retorno e indicar se houve sucesso ou falha:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">timeout </span>5 bash <span class="nt">-c</span> <span class="s2">"&gt;/dev/tcp/guineves.com.br/443"</span> <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">"Conexão OK"</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"Conexão Falhou"</span>
</code></pre></div></div>

<p>Essa técnica pode ser utilizada para outros casos, e nada impede que você faça a análise do <code class="language-plaintext highlighter-rouge">"$?"</code> e a tratativa isolada.</p>

<p>Até a próxima!</p>]]></content><author><name>Guilherme Neves</name><email>gmneves@gmail.com</email></author><category term="bash" /><category term="rede" /><category term="tcp" /><category term="firewall" /><category term="linux" /><category term="dicas" /><summary type="html"><![CDATA[Uma alternativa nativa do Bash (/dev/tcp) para testar conexões de rede e portas entre dois pontos sem precisar de telnet, netcat e afins.]]></summary></entry><entry><title type="html">Contar ocorrências e ordenar listas</title><link href="https://blog.guineves.com.br/contar-ocorrencias-e-ordenar-listas/" rel="alternate" type="text/html" title="Contar ocorrências e ordenar listas" /><published>2022-04-09T11:48:21-03:00</published><updated>2022-04-09T11:48:21-03:00</updated><id>https://blog.guineves.com.br/contar-ocorrencias-e-ordenar-listas</id><content type="html" xml:base="https://blog.guineves.com.br/contar-ocorrencias-e-ordenar-listas/"><![CDATA[<p>Mais uma vez, um tipo de coleta que me vejo frequentemente fazendo e venho compartilhar com você.</p>

<p>Nessa dica, irei mostrar como podemos usar um conjunto de comandos para agregar quantidades e nos mostrar uma lista ordenada.</p>

<p>Vamos supor que temos o arquivo de log abaixo, já filtrado com o conteúdo de interesse:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2022-04-09 10:00:01 String interessante
2022-04-09 10:00:15 String interessante
2022-04-09 10:00:30 String interessante
2022-04-09 10:01:01 String interessante
2022-04-09 10:01:12 String interessante
2022-04-09 10:01:30 String interessante
2022-04-09 10:01:45 String interessante
2022-04-09 10:01:50 String interessante
2022-04-09 10:02:07 String interessante
2022-04-09 10:02:18 String interessante
2022-04-09 10:02:23 String interessante
2022-04-09 10:02:42 String interessante
2022-04-09 10:02:48 String interessante
2022-04-09 10:02:55 String interessante
2022-04-09 10:03:08 String interessante
2022-04-09 10:03:16 String interessante
2022-04-09 10:03:32 String interessante
2022-04-09 10:03:44 String interessante
2022-04-09 10:04:25 String interessante
</code></pre></div></div>

<p>Uma informação importante que eu quero nesse caso é saber quantas vezes por minuto a <code class="language-plaintext highlighter-rouge">"String interessante"</code> apareceu.</p>

<p>Para isso, primeiro vamos verificar como obter apenas o horário do log, utilizando o comando <code class="language-plaintext highlighter-rouge">awk</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">awk</span> <span class="s1">'{print $2}'</span> log.out
</code></pre></div></div>

<p>O separador padrão do <code class="language-plaintext highlighter-rouge">awk</code> é o espaço, por isso não foi necessário informar no comando.</p>

<p>A saída desse comando é a seguinte:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>10:00:01
10:00:15
10:00:30
10:01:01
10:01:12
10:01:30
10:01:45
10:01:50
10:02:07
10:02:18
10:02:23
10:02:42
10:02:48
10:02:55
10:03:08
10:03:16
10:03:32
10:03:44
10:04:25
</code></pre></div></div>

<p>Em seguida, queremos isolar somente os campos de hora e minuto. Poderia fazer isso com o <code class="language-plaintext highlighter-rouge">awk</code> também, mas para variar um pouco, irei utilizar o comando <code class="language-plaintext highlighter-rouge">cut</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">awk</span> <span class="s1">'{print $2}'</span> log.out | <span class="nb">cut</span> <span class="nt">-d</span> <span class="s1">':'</span> <span class="nt">-f</span> 1,2
</code></pre></div></div>

<p>No comando acima, estamos passando a saída do primeiro comando (<code class="language-plaintext highlighter-rouge">awk</code>) para o segundo comando (<code class="language-plaintext highlighter-rouge">cut</code>) com o auxílio do direcionador pipe (<code class="language-plaintext highlighter-rouge">|</code>).<br />
Para o <code class="language-plaintext highlighter-rouge">cut</code>, estou informando o delimitador <code class="language-plaintext highlighter-rouge">':'</code> e informando que quero os campos <code class="language-plaintext highlighter-rouge">1</code> e <code class="language-plaintext highlighter-rouge">2</code>.</p>

<p>Saída do comando, até o momento:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>10:00
10:00
10:00
10:01
10:01
10:01
10:01
10:01
10:02
10:02
10:02
10:02
10:02
10:02
10:03
10:03
10:03
10:03
10:04
</code></pre></div></div>

<p>O que queremos agora é agregar as linhas e contar quantas ocorrências temos para cada conjunto de <code class="language-plaintext highlighter-rouge">hora:minuto</code>.</p>

<p>Vale uma observação aqui:<br />
Para usar o comando <code class="language-plaintext highlighter-rouge">uniq</code> precisamos que a lista esteja ordenada e, nesse caso, por conta da natureza do log, isso já acontece.<br />
Para todos os efeitos, irei ordenar a lista de qualquer forma, com o comando <code class="language-plaintext highlighter-rouge">sort</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">awk</span> <span class="s1">'{print $2}'</span> log.out | <span class="nb">cut</span> <span class="nt">-d</span> <span class="s1">':'</span> <span class="nt">-f</span> 1,2 | <span class="nb">sort</span> | <span class="nb">uniq</span> <span class="nt">-c</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>3 10:00
5 10:01
6 10:02
4 10:03
1 10:04
</code></pre></div></div>

<p>E por fim, podemos ordenar essa lista do menor para o maior, utilizando novamente o comando <code class="language-plaintext highlighter-rouge">sort</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">awk</span> <span class="s1">'{print $2}'</span> log.out | <span class="nb">cut</span> <span class="nt">-d</span> <span class="s1">':'</span> <span class="nt">-f</span> 1,2 | <span class="nb">sort</span> | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-n</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      1 10:04
      3 10:00
      4 10:03
      5 10:01
      6 10:02
</code></pre></div></div>

<p>Caso queira inverter a lista, basta utilizar o argumento <code class="language-plaintext highlighter-rouge">-r</code> no último <code class="language-plaintext highlighter-rouge">sort</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">awk</span> <span class="s1">'{print $2}'</span> log.out | <span class="nb">cut</span> <span class="nt">-d</span> <span class="s1">':'</span> <span class="nt">-f</span> 1,2 | <span class="nb">sort</span> | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-nr</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      6 10:02
      5 10:01
      4 10:03
      3 10:00
      1 10:04
</code></pre></div></div>

<p>Espero que essa dica tenha sido esclarecedora e principalmente que lhe seja útil!</p>

<p>Até a próxima!</p>]]></content><author><name>Guilherme Neves</name><email>gmneves@gmail.com</email></author><category term="awk" /><category term="cut" /><category term="sort" /><category term="uniq" /><category term="logs" /><category term="linux" /><summary type="html"><![CDATA[Como usar um conjunto de comandos (awk, cut, sort e uniq) no terminal para agregar quantidades em logs e mostrar uma lista ordenada.]]></summary></entry><entry><title type="html">Fazer contas no Bash</title><link href="https://blog.guineves.com.br/fazer-contas-no-bash/" rel="alternate" type="text/html" title="Fazer contas no Bash" /><published>2022-04-08T09:03:12-03:00</published><updated>2022-04-08T09:03:12-03:00</updated><id>https://blog.guineves.com.br/fazer-contas-no-bash</id><content type="html" xml:base="https://blog.guineves.com.br/fazer-contas-no-bash/"><![CDATA[<p>Dia desses eu estava precisando coletar alguns números, saída de um comando no Linux, e somá-los. Eu poderia muito bem pegar esses números, levar para uma planilha e fazer a soma lá, mas, tendo tantas formas de realizar isso diretamente no terminal, considerei desnecessário.</p>

<p>Com isso, vou mostrar aqui algumas formas diferentes de realizar contas diretamente no Bash, utilizando os comandos <strong>bc, awk e até com o próprio bash</strong>.</p>

<p>Nota: Não vou mostrar grandes e complexas equações aqui, vamos focar no básico.</p>

<p>O primeiro <code class="language-plaintext highlighter-rouge">$</code> dos comandos é para representar a entrada de comandos no terminal bash e diferenciá-los da resposta dos comandos (que não tem <code class="language-plaintext highlighter-rouge">$</code> no início).</p>

<h3 id="comando--bc">Comando – bc</h3>

<p>Uma das formas mais comuns de se realizar operações aritméticas no Linux é utilizando o comando <code class="language-plaintext highlighter-rouge">bc</code>.</p>

<p>E na sua forma mais simples, podemos direcionar a saída de um comando para ele:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo </span>1+1 | bc
2
</code></pre></div></div>

<p>Uma outra forma de executar a mesma instrução (obs: não funciona em qualquer terminal):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>bc <span class="o">&lt;&lt;&lt;</span> 1+1
2
</code></pre></div></div>

<h3 id="função-nativa-do-bash-v-3">Função nativa do Bash (v. 3+)</h3>

<p>O Bash nos permite realizar cálculos utilizando expansão de comandos, conforme vemos abaixo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo</span> <span class="k">$((</span><span class="m">1</span><span class="o">+</span><span class="m">1</span><span class="k">))</span>
2
</code></pre></div></div>

<p>Ok, você deve estar se perguntando: mas eu preciso listar todos os números (<code class="language-plaintext highlighter-rouge">1+2+3+4…+N</code>) sempre que eu quiser fazer uma somatória?</p>

<p>Não, para isso podemos realizar iterações (loops) que irão facilitar a nossa vida.</p>

<h3 id="usando-o-for">Usando o for</h3>

<p>Em outro momento eu posso detalhar melhor o uso da estrutura/comando <code class="language-plaintext highlighter-rouge">for</code>, mas resumindo, iremos executar um loop em uma lista para atingir o nosso objetivo.</p>

<p>No exemplo abaixo irei somar uma lista definida, com o resultado sendo <code class="language-plaintext highlighter-rouge">1+1+1+1</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ x</span><span class="o">=</span>0
<span class="nv">$ </span><span class="k">for </span>i <span class="k">in </span>1 1 1 1
<span class="o">&gt;</span> <span class="k">do</span>
<span class="o">&gt;</span>  <span class="nv">x</span><span class="o">=</span><span class="k">$((</span><span class="nv">$x</span><span class="o">+</span><span class="nv">$i</span><span class="k">))</span>
<span class="o">&gt;</span> <span class="k">done</span>
<span class="nv">$ </span><span class="nb">echo</span> <span class="nv">$x</span>
4
</code></pre></div></div>

<p>E aqui outra forma de escrever a mesma coisa, em uma mesma linha:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ x</span><span class="o">=</span>0<span class="p">;</span><span class="k">for </span>i <span class="k">in </span>1 1 1 1<span class="p">;</span> <span class="k">do </span><span class="nv">x</span><span class="o">=</span><span class="k">$((</span><span class="nv">$x</span><span class="o">+</span><span class="nv">$i</span><span class="k">))</span><span class="p">;</span><span class="k">done</span><span class="p">;</span> <span class="nb">echo</span> <span class="nv">$x</span>
4
</code></pre></div></div>

<p>Certo, agora está melhorando!<br />
Vamos supor que temos um arquivo com os valores que desejamos calcular; no meu caso irá chamar <code class="language-plaintext highlighter-rouge">numeros.txt</code> e terá o conteúdo abaixo:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1
2
3
4
</code></pre></div></div>

<p>Podemos usar o <code class="language-plaintext highlighter-rouge">for</code> para fazer esse cálculo da seguinte forma:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ x</span><span class="o">=</span>0<span class="p">;</span> <span class="k">for </span>i <span class="k">in</span> <span class="si">$(</span><span class="nb">cat </span>numeros.txt<span class="si">)</span><span class="p">;</span> <span class="k">do </span><span class="nv">x</span><span class="o">=</span><span class="k">$((</span><span class="nv">$x</span><span class="o">+</span><span class="nv">$i</span><span class="k">))</span><span class="p">;</span><span class="k">done</span><span class="p">;</span> <span class="nb">echo</span> <span class="nv">$x</span>
10
</code></pre></div></div>

<p>Dessa maneira estamos usando o comando <code class="language-plaintext highlighter-rouge">cat</code> para ler o arquivo e passar para o <code class="language-plaintext highlighter-rouge">for</code> como parâmetro.</p>

<p>Isso já resolve o nosso problema inicial, mas e se tivéssemos outra forma de fazer isso? Apenas para ter opções mesmo 🙂</p>

<h3 id="comando--awk">Comando – awk</h3>

<p>O <code class="language-plaintext highlighter-rouge">awk</code> é um comando excepcional, que contém uma imensa gama de opções para manipular dados, mas no momento vamos nos ater a realizar a mesma coisa que fizemos com o último <code class="language-plaintext highlighter-rouge">for</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">awk</span> <span class="s1">'{x+=$1;} END{print x;}'</span> numeros.txt
10
</code></pre></div></div>

<p>Explicando o comando acima: estamos realizando um loop pelo arquivo <code class="language-plaintext highlighter-rouge">numeros.txt</code> e adicionando à variável <code class="language-plaintext highlighter-rouge">x</code> o valor atual mais o valor da linha corrente, e ao final exibindo o valor.</p>

<p>Espero que tenha gostado dessas dicas!<br />
Até a próxima 😀</p>]]></content><author><name>Guilherme Neves</name><email>gmneves@gmail.com</email></author><category term="bash" /><category term="awk" /><category term="bc" /><category term="for" /><category term="linux" /><summary type="html"><![CDATA[Algumas formas diferentes de realizar contas diretamente no terminal Bash utilizando os comandos bc, awk e funções nativas do próprio Bash.]]></summary></entry><entry><title type="html">vim – Salvar e sair do melhor editor do Linux</title><link href="https://blog.guineves.com.br/vim-salvar-e-sair/" rel="alternate" type="text/html" title="vim – Salvar e sair do melhor editor do Linux" /><published>2022-03-20T09:09:50-03:00</published><updated>2022-03-20T09:09:50-03:00</updated><id>https://blog.guineves.com.br/vim-salvar-e-sair</id><content type="html" xml:base="https://blog.guineves.com.br/vim-salvar-e-sair/"><![CDATA[<p>Como a minha primeira dica, optei em colocar o óbvio e sem muita enrolação.</p>

<p><strong>COMO EU SAIO DO VIM ???</strong><br />
Resumidamente:</p>

<blockquote>
  <p>Nota: Respeite as maiúsculas e minúsculas!</p>
</blockquote>

<ul>
  <li><strong>Salvar e sair</strong></li>
</ul>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;ESC&gt;
:wq
</code></pre></div></div>

<ul>
  <li><strong>Sair alterando arquivo protegido (read-only)</strong></li>
</ul>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;ESC&gt;
:wq!
</code></pre></div></div>

<ul>
  <li><strong>Sair, sem salvar e ignorando alterações</strong></li>
</ul>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;ESC&gt;
:q!
</code></pre></div></div>

<ul>
  <li><strong>E a forma que eu mais costumo usar para Salvar e sair (ou, como eu chamo, “Zalvar e Zair”)</strong></li>
</ul>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;ESC&gt;
ZZ
</code></pre></div></div>]]></content><author><name>Guilherme Neves</name><email>gmneves@gmail.com</email></author><category term="vim" /><category term="vi" /><category term="linux" /><category term="dicas" /><summary type="html"><![CDATA[Como a minha primeira dica, optei em colocar o óbvio e sem muita enrolação: COMO SAIR DO VIM???]]></summary></entry></feed>