Seq в Linux: как генерировать и применять последовательности

Что такое команда seq
Команда seq в Linux выводит числовую последовательность в стандартный вывод. Её простота — сильная сторона: три аргумента позволяют задать начало, шаг и конец. Часто seq используют в сочетании с другими утилитами или в скриптах для генерации наборов аргументов или имен файлов.
Определение: seq — утилита для последовательной генерации чисел, подходящая для скриптов и конвейеров командной строки.
Важно: реализация seq входит в пакет coreutils у большинства дистрибутивов GNU/Linux; поведение в BSD-образцах может отличаться.
Базовый синтаксис
Базовый синтаксис выглядит так:
seq [опции] числаГде опции — флаги (например, -s, -f, -w), а числа — аргументы, задающие последовательность.
Форматы ввода
Поддерживаются три варианта вызова:
seq last
seq first last
seq first increment lastПримеры ниже иллюстрируют каждое поведение.
Примеры использования
Сгенерировать список чисел от 1 до 5
seq 5Вывод:
1
2
3
4
5Указание начала и конца
seq 4 8Вывод:
4
5
6
7
8Указание шага (increment)
seq 3 2 13Вывод:
3
5
7
9
11
13Пользовательский разделитель
По умолчанию разделитель — символ новой строки. Флаг -s задаёт строковый разделитель между элементами.
seq -s . 3 7Вывод:
3.4.5.6.7Если разделитель может интерпретироваться оболочкой (например, тильда ~), его нужно брать в кавычки:
seq -s ~ 3 7Этот вызов напечатает путь к домашней директории, если оболочка подставит ~. Чтобы избежать подстановки:
seq -s '~' 3 7Вывод:
3~4~5~6~7Форматирование вывода
Флаг -f позволяет задать шаблон формата, аналогично printf. Если вход содержит дробные значения, seq по умолчанию унаследует формат.
seq 0.1 0.1 0.5Вывод:
0.1
0.2
0.3
0.4
0.5Принудительный формат с плавающей точкой:
seq -f %f 4 7Вывод:
4.000000
5.000000
6.000000
7.000000С точностью до двух знаков:
seq -f %0.2f 4 7Вывод:
4.00
5.00
6.00
7.00Шаблон можно использовать для создания шаблонных строк, например IP-адресов:
seq -f 192.168.5.%g 1 233Вывод (фрагмент):
Выравнивание ширины
Флаг -w сохраняет одинаковую ширину вывода в соответствии с наибольшим числом.
seq -w 1 100 1000Вывод (первые строки):
0001
0101
0201
0301
0401
...Помощь по команде
seq --helpВыведет краткую справку и список опций.
Практические примеры и сценарии
Быстрая арифметика с expr
Вы можете сгенерировать выражение и подать его в expr для вычисления суммы ряда.
expr $(seq -s ' + ' 1 100)Seq сформирует строку вроде 1 + 2 + 3 + ... + 100, а expr вычислит её и вернёт 5050.
Можно менять оператор разделителя, чтобы выполнять другие операции.
Быстро создать множество файлов
Чтобы создать файлы file1.txt … file10.txt:
touch $(seq -f 'file%g.txt' 1 10)Этот вызов создаст 10 файлов в текущей директории.
Генерация списка IP:порт для скрипта-сканера
Для перебора всех портов хоста 1.2.3.4 можно сгенерировать список строк 1.2.3.4:порт:
seq -f 1.2.3.4:%g 1 65535 > ports.txtЗатем проход по списку в скрипте:
while IFS= read -r target; do
# пример проверки порта (nc, nmap, или собственная логика)
nc -z -v ${target%:*} ${target#*:} && echo "open: $target"
done < ports.txtТестирование производительности
Seq генерирует последовательности очень быстро. Простой тест времени:
time seq 1000000 > /dev/nullНа современных машинах генерация миллиона чисел занимает секунды; реальное время зависит от CPU и I/O.
Когда seq не подойдёт или даст неожиданный результат
- Плавающая точка: ограничения точности и накопление ошибок при дробных шагах. Для задач с высокой точностью лучше использовать Python/Perl.
- Очень большие диапазоны: при перенаправлении в память или оболочку учитывайте потребление памяти (хотя seq печатает стримом, использование $(…) может собрать всё в память).
- Портируемость: BSD seq может иметь другой набор опций; для кросс-платформенных скриптов проверяйте man.
- Локаль: формат чисел (разделитель десятичной дроби) зависит от локали; при необходимости экспортируйте LC_NUMERIC=C.
- Отрицательные и убывающие последовательности: убедитесь в порядке аргументов.
Альтернативные подходы
- Bash-цикл for:
for i in {1..10}; do echo $i; doneНо выражение {1..N} не поддерживает дробные шаги и медленнее при больших объёмах, если используется внутри командной подстановки.
- Использовать awk для гибкости и точности с плавающей точкой:
awk 'BEGIN{for(i=0;i<=1;i+=0.1) printf("%.1f\n", i)}'- Python/Perl для сложных вычислений и контроля ошибок округления.
Практические советы и шаблоны (cheat sheet)
- Последовательность с шагом 5:
seq 1 5 50 - Однострочный список через пробел:
seq -s ' ' 1 10 - Шаблонированные имена:
seq -f 'img_%03g.jpg' 1 100 - Сохранить в файл:
seq 1 100 > numbers.txt - Использовать с xargs:
seq 1 100 | xargs -n1 -P8 -I{} cmd {}
Безопасность и экранирование
- Всегда экранируйте разделители и шаблоны, которые может интерпретировать оболочка: используйте одинарные кавычки
'...'. - При подстановке результата в команду проверьте, не формирует ли seq строки с небезопасными символами.
Критерии приёмки для скрипта, использующего seq
- Скрипт корректно обрабатывает границы (включая отрицательные и убывающие диапазоны).
- Нет неожиданных подстановок от оболочки (все нестандартные разделители в кавычках).
- Для больших списков используется потоковая обработка, а не сбор всего вывода в памяти.
- Поведение при дробных шагах соответствует требуемой точности.
Модель принятия решений (Mermaid)
flowchart TD
A[Нужно сгенерировать последовательность?] --> B{Диапазон и шагы}
B -->|Целые, простой| C[Использовать seq]
B -->|Дробные, требование точности| D[Использовать awk или Python]
B -->|Портируемость на BSD| E[Проверить man; возможно адаптировать]
C --> F{Нужно форматирование}
F -->|Да| G[seq -f или -w]
F -->|Нет| H[seq без опций]Рольовые чек-листы
- Для разработчика: проверить поведение с разными локалями и дробными шагами; добавить unit-тесты для крайних значений.
- Для системного администратора: использовать seq в массовых операциях с touch, mv, tar; избегать подстановки в память.
- Для автора скриптов безопасности: эскейпить любые пользовательские данные, не доверять автоматическому форматированию.
Короткая методология внедрения в проект
- Определите требуемый диапазон и шаг.
- Выберите формат вывода (
-f,-w) перед тем как передавать результат в другую команду. - Проверяйте поведение в тестовом окружении (особенно при дробных шагах).
- При больших объёмах используйте потоковую обработку (
while read,xargs,parallel).
Итог и рекомендации
Seq — это простая и быстрая утилита для генерации последовательностей. Она идеально подходит для автоматизации рутинных задач: массового создания файлов, генерации списков портов, тестов и прочего. Однако при работе с дробными значениями, очень большими диапазонами или при необходимости кросс-платформенной совместимости стоит рассмотреть альтернативы.
В следующих случаях выбирайте альтернативу:
- нужна высокая точность с плавающей точкой — используйте Python/awk;
- требуется портируемость между GNU и BSD — тестируйте и адаптируйте;
- результат не должен собираться в память — избегайте подстановок, которые делают это.
Краткий чек: используйте -s для разделителей, -f для шаблонов и -w для одинаковой ширины. Всегда экранируйте символы оболочки.
Extras: краткая сводка приведена в конце для быстрого применения на практике.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента