O comando `seq` no Linux é uma ferramenta poderosa para gerar sequências numéricas de maneira eficiente. Mas, como podemos realmente utilizar essa funcionalidade? Este artigo mostrará as aplicações práticas do `seq` e como ele pode otimizar suas tarefas.
O Comando `seq`
À primeira vista, o comando `seq` pode parecer um tanto enigmático. Ele é projetado para gerar listas de números de forma rápida e direta. A principal vantagem aqui é a velocidade de processamento. Você ficará surpreso com a rapidez com que este comando pode ser executado.
Mas, qual a utilidade de uma lista de números? O comando `seq` foi incorporado ao Unix na sua 8ª edição em 1985 e permanece relevante até hoje, indicando seu valor. A filosofia Unix preza por pequenos utilitários que realizam tarefas específicas de maneira eficiente. Um princípio fundamental dessa filosofia é a interoperabilidade, ou seja, a capacidade de um programa utilizar a saída de outro como entrada. O comando `seq` se destaca nesse cenário, sendo extremamente útil quando combinado com outros comandos.
Geração de Listas Básicas
Se você executar o comando `seq` com um único número como argumento, ele gerará uma sequência de 1 até esse número, imprimindo cada número em uma linha separada. Veja o exemplo:
seq 6
Se você fornecer dois números, o primeiro será o valor inicial e o segundo o valor final da sequência. Observe:
seq 4 10
É possível definir um intervalo entre os números utilizando um terceiro argumento. Esse argumento será o incremento entre os números da sequência. Por exemplo, para gerar uma lista de números de 6 a 48 com um incremento de 6, use:
seq 6 6 48
Contagem Regressiva
O comando `seq` também pode gerar sequências em ordem decrescente. Para isso, é necessário usar um incremento negativo.
O comando abaixo gera uma lista de 24 a 12, com um decremento de 6:
seq 24 -6 12
Trabalhando com Decimais
Além de inteiros, `seq` também aceita números decimais como argumentos. Se um dos números for decimal, todos os outros serão tratados como decimais. O comando abaixo gera uma sequência com um incremento de 0.2:
seq 1 0.2 2
Velocidade do `seq`
O comando `seq` é surpreendentemente rápido, com o tempo de execução limitado apenas pela velocidade com que você digita o comando no terminal. Para demonstrar sua velocidade, vamos gerar uma lista com 250.000 números.
Para isso, usaremos o comando `time` para medir o tempo de execução:
time seq 250000
Os resultados abaixo da lista mostram que, mesmo em um computador comum, o comando `seq` é muito eficiente.
A lista inteira foi gerada e exibida na tela em aproximadamente 1/3 de segundo. Se direcionarmos a saída para um arquivo, evitamos o tempo gasto para imprimir na tela.
Para isso, executamos:
time seq 250000 > numbers.txt
O tempo total para gerar a lista e criar o arquivo diminuiu para aproximadamente 1/7 de segundo.
Utilizando um Separador
Por padrão, cada número em uma sequência é separado por uma quebra de linha, fazendo com que a lista seja exibida verticalmente. No entanto, você pode especificar um separador personalizado.
Por exemplo, você pode criar uma lista delimitada por vírgulas, dois pontos ou qualquer outro caractere. O delimitador pode ser uma string, permitindo o uso de múltiplos caracteres.
Para utilizar um separador, usamos a opção `-s`. O seguinte comando gera uma lista separada por vírgulas:
seq -s, 6 6 36
Este comando usa dois pontos (:) como separador:
seq -s: 6 6 36
E este comando usa dois hífens (–) como separador:
seq -s-- 6 6 36
Strings de Formatação
O comando `seq` também oferece suporte a strings de formatação estilo linguagem C, que permitem um controle maior sobre a saída. Para usar uma string de formato, utilize a opção `-f` (formato).
O comando abaixo usa zeros para preencher a saída com dois caracteres:
seq -f "%02g" 6
É possível formatar a string com qualquer texto e colocar o número em qualquer posição. Veja:
seq -f "Number %02g in a C-like format string" 6
Preenchimento com Zeros
A opção `-w` (largura igual) é uma forma rápida de preencher números com zeros, garantindo que todos os números tenham a mesma largura do maior número na sequência.
O comando abaixo conta de 0 a 1000 com incremento de 100 e todos os números são preenchidos com zeros:
seq -w 0 100 1000
O maior número tem quatro caracteres, portanto, todos os números menores são preenchidos com zeros para atingir essa largura (até mesmo o 0 é preenchido com quatro zeros).
Integrando `seq` com `bc`
Ao definir um separador matemático e direcionar a saída do `seq` para o comando `bc`, podemos avaliar expressões aritméticas.
O comando abaixo gera uma lista de números separados por asteriscos:
seq -s* 6
Começando com 1 e terminando com 6:
seq -s* 6 | bc
Ao direcionar essa lista para `bc`, ela é avaliada utilizando os asteriscos como símbolos de multiplicação.
seq -s+ 5
O mesmo pode ser feito utilizando o símbolo de adição:
seq -s+ 5 | bc
O comando abaixo usa um sinal de mais (+) para criar uma lista em que todos os números são somados.
Digitamos o seguinte para direcionar a lista para `bc` e avaliar a expressão: Criando arquivos com `seq`. O comando `touch`
atualiza os carimbos de data e hora
touch $(seq -f "file-%g.txt" 1 10)
em arquivos. Se um arquivo não existe, `touch` o cria. Podemos usar a expansão de linha de comando com `touch` e `seq` para criar uma coleção de arquivos com nomes temáticos, mas numerados de maneira diferente.
ls file*
Em seguida, executamos o seguinte comando para verificar os arquivos:
touch $(seq -f
Usando `seq` em Loops Bash
#!/bin/bash for val in $(seq 5 0.2 6.6); do echo "The value is now: $val" done
Podemos usar `seq` em scripts Bash para controlar loops com números decimais.
chmod +x loop.sh
Copie o seguinte texto para um editor de texto e salve-o como “loops.sh”:
./loop.sh
Em seguida, executamos o comando abaixo para tornar o script executável:
Quando executamos o script, o contador de loop é impresso na tela. Podemos então executar o comando seguinte para ver o contador decimal aumentar a cada iteração do loop:
Lembre-se de que `seq` também pode contar regressivamente, o que pode ser usado em loops da mesma forma. Simples e Direto. Uma das vantagens do comando `seq` é a sua facilidade de uso. Ele tem uma
documentação sucinta, mas oferece várias possibilidades.
Frequentemente precisamos criar arquivos de teste rapidamente com tamanhos realistas. Usamos `seq` combinado com uma string de formato e redirecionamos a saída para criar um arquivo com a quantidade desejada de linhas de dados fictícios.