seq
Последовательность чисел — с шагом, обратным счётом, дробями, нулями впереди и своим форматом
seq печатает ряд чисел от начала до конца с заданным шагом, по одному в строке. Им задают циклы (for i in $(seq 10)), генерируют тестовые данные, имена файлов с номерами и диапазоны для xargs.
Синтаксис
seq [опции] КОНЕЦ # от 1 до КОНЕЦ
seq [опции] НАЧАЛО КОНЕЦ # шаг 1
seq [опции] НАЧАЛО ШАГ КОНЕЦ # свой шаг; отрицательный — обратный отсчёт
Шаг — средний аргумент. Все три числа могут быть дробными и отрицательными. Ряд заканчивается, когда следующее число вышло бы за КОНЕЦ; сам КОНЕЦ печатается, только если в него точно попали.
Опции
| Опция | Что делает |
|---|---|
-w | выровнять ширину ведущими нулями: 08 09 10 |
-s СТРОКА | разделитель между числами вместо \n (в конце всё равно ставится \n) |
-f ФОРМАТ | формат числа в стиле printf для дробных: %g, %f, %e с шириной и точностью; вокруг можно добавить текст |
Форматы для -f
| Формат | Пример | Результат |
|---|---|---|
%g | seq -f %g 1 3 | 1 2 3 (по умолчанию для чисел вида 1e3) |
%.2f | seq -f %.2f 0 0.5 1 | 0.00 0.50 1.00 |
%03.0f | seq -f %03.0f 8 10 | 008 009 010 |
%5.1f | seq -f %5.1f 1 2 | 1.0 2.0 |
текст%gтекст | seq -f 'file%g.txt' 2 | file1.txt file2.txt |
%% | seq -f '%%%g' 1 1 | %1 — знак процента в выводе |
Целочисленные %d, %x не поддерживаются: seq работает с числами с плавающей точкой. Без -f формат подбирается сам: по числу знаков после точки во входных числах (seq 0 0.25 1 → 0.00 0.25 …).
Примеры
# 1..5
seq 5
# от 2 до 10 с шагом 2
seq 2 2 10
# обратный отсчёт — шаг обязательно отрицательный
seq 5 -1 1
# в одну строку через запятую или пробел
seq -s, 5
seq -s ' ' 3
# с ведущими нулями
seq -w 1 10
# дроби
seq 0 0.25 1
seq -f '%.1f' 1 0.5 3
# имена файлов: file001.txt … file005.txt
seq -f 'file%03g.txt' 5
# цикл
for i in $(seq 3); do echo "attempt $i"; done
# создать 100 файлов одним вызовом touch
seq -f 'part%03g.log' 100 | xargs touch
# сумма 1..100 (bc в песочнице нет)
echo $(( $(seq -s+ 100) ))
# отрицательные числа
seq -3 -1
Подводные камни
- Шаг — второй аргумент, а не третий.
seq 1 10 2— это «от 1 до 2 с шагом 10», выведет только1. Правильно:seq 1 2 10. seq 5 1молча ничего не печатает и возвращает 0: шаг по умолчанию+1даже когда конец меньше начала. Для обратного счёта пишиseq 5 -1 1.- Шаг 0 — ошибка (
invalid Zero increment value). -f %gна больших числах даёт экспоненту:seq -f 'id-%g' 1000000 1000000→id-1e+06. Для целых в формате бери%.0fили%06.0f.-wи-fвместе нельзя (format string may not be specified when printing equal width strings). Для нулей с текстом используй-f '%03g'.- Конец печатается, только если точно попали.
seq 0 0.1 0.95кончится на0.9, аseq 1 3 8— на7. - Для простых целых диапазонов в bash есть
{1..10}и{01..10}(с нулями) — без отдельного процесса. Но в фигурных скобках нельзя использовать переменные:{1..$n}не раскроется, тогда и нуженseq 1 "$n".
См. также
shuf · xargs · paste · циклы · арифметика · echo и printf