Comando seq: Gerando Sequências de Números
O que você vai conseguir fazer
- Gerar sequências com início, fim e passo usando `seq`
- Repetir tarefas sobre uma sequência com `for i in $(seq ...)`
- Explicar o preenchimento com zeros do `-w` e quando preferir `seq` a `{1..10}`
Pré-requisitos (leia estes primeiro)
Vai Digitar de 1 Até 100 na Mão?
seq constrói uma sequência como "1, 2, 3, ... 100" em um instante.As palavras usadas aqui (para não confundir depois)
- Sequência: números que vêm um atrás do outro, como 1, 2, 3.
- Argumento: um valor escrito depois do comando. Em
seq 5, o5é o argumento. - Incremento: quanto somar a cada passo. "Passo" quer dizer o mesmo.
- Loop: um jeito de repetir o mesmo trabalho. Aqui usamos o
for. - Preenchimento com zeros: acrescentar zeros na frente para alinhar os dígitos, transformando
1em01. - Variável: uma caixa que guarda um valor por um tempo. Aqui a caixa
irecebe os números um a um. - ShellUm programa interativo que interpreta os comandos digitados e os executa.: o programa do terminal que lê o que você digita e executa os comandos. "bash" é um dos nomes dele.
O Que Você Vai Aprender
- Como gerar uma sequência de números (1, 2, 3, ...) com
seq - Como definir o início, fim e incremento (passo)
- Como combinar com um loop
forpara repetir tarefas - Como preencher com zeros usando
-we mudar o separador com-s - Quando usar
seqvs a notação{1..10}do bash
1. O Que é o Comando seq?
Conclusão:
seqimprime uma sequência de números, um por linha.seq 5gera de 1 até 5.
seq 5.$ seq 5
1 2 3 4 5
2. Como Mudo o Número Inicial?
Conclusão: Passe dois argumentos e significa
seq INICIO FIM.seq 3 7gera de 3 até 7.
seq 5 10 significa "5 até 10".seq.$ seq 5 10
5 6 7 8 9 10
A quantidade de argumentos muda o significado
seq FIM--> 1 até FIMseq INICIO FIM--> INICIO até FIMseq INICIO PASSO FIM--> define um incremento (próxima seção)
3. Como Defino o Incremento (Passo)?
Conclusão: Passe três argumentos e significa
seq INICIO PASSO FIM.seq 0 2 10gera de 0 até 10 em passos de 2.
seq 2 2 10 significa "2 até 10 em passos de 2".$ seq 2 2 10
2 4 6 8 10
seq 5 -1 1 conta de trás para frente: "5, 4, 3, 2, 1".$ seq 5 -1 1
5 4 3 2 1
Também funciona com decimais. seq 1 0.5 3 gera 1.0, 1.5, 2.0, 2.5, 3.0 em passos de 0.5 (inteiros são preenchidos com o mesmo número de casas decimais).
4. Como Uso uma Sequência em um Loop for?
Conclusão: Escreva
for i in $(seq 1 5)para alimentar cada número gerado na variávelie repetir. Ótimo para criar arquivos numerados em massa.
for com o seq. A parte $(seq 1 5) é trocada pelo que o seq imprimiu.1 2 3 4 5. Cada valor entra em i e o corpo se repete.$ for i in $(seq 1 5); do
> touch "test${i}.txt"
> done$ ls
test1.txt test2.txt test3.txt test4.txt test5.txt
seq 1 100. Um trabalho de 100 linhas sai em uma só.4-1. Lina Tropeça: Esquecer o $( )
Limpe os arquivos que você acabou de criar antes de testar. Assim só os arquivos novos aparecem.
$ rm test1.txt test2.txt test3.txt test4.txt test5.txt $ ls
Com o ls sem imprimir nada, tente de novo.
$ for i in seq 1 5; do
> touch "test${i}.txt"
> done
$ lstest1.txt test5.txt testseq.txt
testseq.txt? E eu esperava cinco arquivos, mas vieram três.$( ). Sem ele, o shell lê seq, 1 e 5 como três palavras comuns.seq como comando?i recebe seq, depois 1, depois 5. Dá nisso: testseq.txt, test1.txt e test5.txt, três arquivos.$( ) significa "execute o comando de dentro e troque pelo resultado". Sempre use ao percorrer uma sequência.O seq ainda não existe no terminal virtual deste site. Teste os exemplos deste artigo no seu próprio Linux ou terminal.
Dá para limpar os arquivos que você acabou de criar. Sempre olhe os alvos com ls antes de apagar.
$ ls test*.txt $ rm test1.txt test5.txt testseq.txt
Diferente de um ambiente gráfico, o rm não manda os arquivos para a lixeira. Eles somem na hora. Se isso deixa você nervoso, use o rm -i, que pergunta arquivo por arquivo.
Se você esquecer o $( ) em for i in $(seq ...) e escrever for i in seq 1 5, o loop itera sobre as três strings literais seq, 1 e 5. O $( ) que substitui um comando por sua saída é obrigatório.
5. Como Alinho os Dígitos (Preenchimento com Zeros)?
Conclusão: Adicione
-wpara preencher números com zeros à esquerda até o valor mais largo.file01,file02, ...file10mantêm os dígitos alinhados para que a ordem de classificação fique correta.
ls, eles sairam em uma ordem estranha: test1, test10, test100, test2...ls compara os nomes como texto, letra por letra da esquerda, então 10 vem antes de 2.-w (width, largura) e ele preenche com zeros, como 001, 002, ... 100.$ seq -w 1 10
01 02 03 04 05 06 07 08 09 10
Combine com criação de arquivos assim:
for i in $(seq -w 1 100); do touch "log_${i}.txt"; doneIsso cria de log_001.txt até log_100.txt com dígitos alinhados.
6. Como Mudo o Separador ou Formato?
Conclusão: Use
-spara mudar o separador de nova linha para vírgula, espaço, etc. Use-fpara definir um formato no estilo printf.
-s, que vem de separador. -s , junta tudo com vírgulas.$ seq -s , 1 5
1,2,3,4,5
-s " " gera espaços.-f permite colocar texto na frente do número ou definir a largura dos dígitos.$ seq -f "page-%02g" 1 3
page-01 page-02 page-03
Em -f, %g representa um número. O 02 em %02g significa "2 dígitos, preenchido com zeros." Para preenchimento com zeros apenas, -w da seção anterior é mais simples, mas -f permite adicionar prefixos e casas decimais livremente.
7. Qual a Diferença do {1..10} do bash?
Conclusão: O bash também tem
{1..10}para sequências. Para valores fixos,{1..10}é mais rápido. Quando o intervalo vem de uma variável, useseq.
echo {1..5} imprimir uma sequência. Qual a diferença do seq?{1..5} é a expansão de chaves do bash, e ela é mais rápida que o seq.$ echo {1..5}1 2 3 4 5
$ n=5
$ echo {1..$n}{1..5}
{1..$n} não virou uma sequência; imprimiu o texto literal.seq 1 $n respeita a variável. Por isso o seq brilha quando a contagem do loop vem de uma.$ n=5 $ seq 1 $n
1 2 3 4 5
for i in $(seq 1 $n) expande toda a sequência na memória para números grandes. Para dezenas de milhares a milhões de iterações, o loop aritmético for ((i=1; i<=n; i++)) é mais eficiente. Para o intervalo cotidiano de dezenas a milhares, seq é suficiente.
8. Armadilhas Comuns e Correções
Conclusão: A maioria dos problemas vem de três coisas: leitura errada da quantidade de argumentos, esquecimento do
$( )e ordem de classificação quebrada por falta de preenchimento com zeros.
| Sintoma | Causa | Correção |
|---|---|---|
| Um intervalo diferente do esperado | Entendeu errado a quantidade de argumentos | Verifique a ordem seq INICIO PASSO FIM |
Loop itera sobre o texto seq 1 5 |
Esqueceu o $( ) |
Escreva for i in $(seq 1 5) |
| Arquivos se classificam em ordem errada | Sem preenchimento com zeros | Alinhe dígitos com seq -w |
{1..$n} não é uma sequência |
Expansão de chaves ignora variáveis | Use seq 1 $n |
| Saída é coluna, não linha | Separador padrão é nova linha | Mude com -s , ou -s " " |
O que não fazer
- Expandir um intervalo enorme de uma vez com
$(seq ...)e esgotar a memória - Criar arquivos numerados sem preenchimento com zeros e depois sofrer com a ordem de classificação
9. Mini Exercícios: Tente Você Mesmo
Conclusão: Três exercícios -- definir um passo, preencher com zeros e combinar com um loop -- confirmam na prática como o
seqfunciona.
$ mkdir -p ~/seq-practice && cd ~/seq-practice
Tarefa 1: Imprima números descendo de 10 para 1, diminuindo de 2 em 2.
Ver dica 1 (direcionamento)
Escreva três argumentos. Você quer descer, então o número do meio é negativo.
Ver dica 2 (nome do comando)
O comando é o seq. Os argumentos vão na ordem seq INICIO PASSO FIM.
Ver a resposta
$ seq 10 -2 1
10 8 6 4 2
O valor final é 1, mas o número depois do 2 seria 0, que fica abaixo de 1. Por isso ele para no 2.
Tarefa 2: Imprima de 1 a 12 com preenchimento de zeros em dois dígitos.
Ver dica 1 (direcionamento)
Existe uma opção para alinhar os dígitos. Ela apareceu na seção 5.
Ver dica 2 (nome do comando)
O comando é o seq. A opção que alinha os dígitos tem o nome de "width", largura.
Ver a resposta
$ seq -w 1 12
01 02 03 04 05 06 07 08 09 10 11 12
O maior número é 12, que tem dois dígitos, então o conjunto todo fica com dois dígitos.
Tarefa 3: Crie 12 arquivos de report_01.txt a report_12.txt em massa, com os dígitos alinhados.
Ver dica 1 (direcionamento)
Alimente a sequência da tarefa 2 em um loop e combine com o comando que cria arquivos.
Ver dica 2 (nome do comando)
Você precisa de um loop for e do touch. Veja na seção 4 como uma sequência é entregue a um loop.
Ver a resposta
$ for i in $(seq -w 1 12); do touch "report_${i}.txt"; done
$ ls report_*.txt | head -n 3report_01.txt report_02.txt report_03.txt
Confira também quantos foram criados.
$ ls report_*.txt | wc -l
12
Quando terminar o treino, dá para remover o diretório inteiro. Olhe o conteúdo antes de apagar.
$ cd ~ $ ls ~/seq-practice $ rm -r ~/seq-practice
O rm -r apaga o diretório junto com tudo que está dentro dele. Confirme que o caminhoUma sequência de texto que descreve a localização de um arquivo ou diretório. é mesmo ~/seq-practice antes de executar.
10. Revisão
seq muda com a quantidade de argumentos. Um é o fim, dois são início e fim, e três colocam o passo no meio.$( ). E o -w é o que alinha os nomes de arquivo.seq em vez de {1..10}.Resumo de Hoje em 3 Linhas
- O sentido do
seqmuda com a quantidade de argumentos:seq FIM,seq INICIO FIM,seq INICIO PASSO FIM - Dentro de um loop, inclua o
$( ). Sem ele, a palavraseqé percorrida como texto - Use
-wpara alinhar os dígitos e useseqno lugar de{1..10}quando o intervalo vier de uma variável