9 практических способов использования команды seq в Linux

9 практических способов использования команды seq в Linux


Перейти по ссылкам

  • Базовая генерация чисел
  • Генерировать форматированные последовательности
  • Создать тестовые файлы с текстом
  • Повторите команду определённое количество раз
  • Создать временные метки или интервалы времени
  • Проверить доступность порта
  • Перебор диапазонов в скриптах
  • Разделить файлы по строкам
  • Выполнять математические операции

Команда seq — это не просто генератор чисел. Это фундаментальный элемент, который можно использовать для создания тестовых файлов, управления циклами, выполнения сетевых сканирований и проведения математических вычислений. Вот несколько распространённых способов использования команды seq.

Базовая генерация чисел

В своей основе команда seq выводит числа по порядку. Вам нужно всего лишь указать одно число, и она будет считать от 1 до этого числа. Например:

seq 5     

Это выводит числа от 1 до 5. Это самая простая форма, но магия начинается, когда вы изменяете начало, шаг, формат или передаете вывод в другие команды.

Например, если вы хотите начать с определённого числа, укажите начальное число в качестве первого аргумента и конечное число в качестве второго.

seq 3 7

Это сгенерирует числа от 3 до 7 (т.е. 3, 4, 5, 6, 7).

Иногда нужно пропускать числа в последовательности, например, генерировать только чётные числа или считать с шагом пять. Аргумент increment, расположенный между начальным и конечным значениями, управляет этим. Например, чтобы сгенерировать нечётные числа от 1 до 10, используйте шаг 2:

seq 1 2 10

Эта команда сообщает seq начинать с 1, доходить до 10, но делать шаги по 2, создавая 1, 3, 5, 7 и 9.

Вы также можете считать в обратном порядке. Для этого укажите отрицательное значение приращения, например:

seq 10 -1 1

Это выводит числа от 10 до 1 с шагом -1.

Генерировать числа с плавающей запятой

seq не ограничивается целыми числами; он также легко работает с числами с плавающей запятой (десятичными числами). Это полезно для научных расчетов или при работе с данными, требующими десятичной точности.

Например, чтобы посчитать от 0,5 до 2,0 с шагом 0,3, выполните:

seq 0.5 0.3 2.0

И вы получите последовательность десятичных чисел с определённым шагом.

Использование пользовательского разделителя

По умолчанию команда seq разделяет каждое число символом новой строки. Флаг -s (separator) позволяет задать пользовательский разделитель. Например, чтобы сгенерировать числа от 1 до 5 в одной строке, разделённые запятой и пробелом, выполните:

seq -s ", " 1 5     

В качестве альтернативы вы можете передать вывод через xargs, чтобы разместить все числа в одной строке, разделённые пробелами. xargs считывает элементы из стандартного ввода и преобразует их в аргументы для другой команды (по умолчанию — echo).

seq 1 10 | xargs

Создать форматированные последовательности

Предположим, вы хотите сгенерировать числа от 1 до 10, но чтобы все они состояли из двух цифр с ведущим нулем. Для этого вы можете использовать опцию -f вместе с спецификатором формата следующим образом:

seq -f "%02g" 1 10

Здесь %g — это стандартный формат числа, а 02 указывает seq дополнять число до 2 цифр с ведущими нулями.

Для простой задачи добавления ведущих нулей ко всем числам, чтобы они имели одинаковую ширину, seq предлагает ещё более простой флаг -w (равная ширина).

seq -w 1 100

Эта команда обеспечивает одинаковую ширину всех чисел, добавляя ведущие нули, создавая 001, 002 и 099 до 100.

Этот тип форматирования также идеально подходит для создания файлов без отступов, которые правильно сортируются. Комбинируя seq с touch и xargs, вы можете создать несколько пустых файлов. Например, чтобы создать 5 пустых текстовых файлов с нулевыми заполнениями, выполните следующее:

seq -f "text_%02g.txt" 1 5 | xargs touch

После запуска этой команды у вас будет список файлов (text_01.jpg, text_02.jpg и т.д.), которые всегда будут сортироваться в правильном числовом порядке. Вы также можете создавать файлы с именами на основе даты:

seq -f "2025-03-%02g.txt" 1 31 | xargs touch

Этот цикл дает вам файлы на каждый день марта 2025 года.

Создать тестовые файлы с текстом

Помимо генерации чисел, вы можете использовать seq для создания тестовых файлов с фиктивными данными. Просто объедините seq с конвейером и перенаправлением вместе с циклом for.

Например, для тестирования скрипта вам могут понадобиться фиктивные файлы с каким-то содержимым. Этот скрипт создает пять файлов, каждый из которых содержит строку текста с указанием его номера:

for i in $(seq 1 5); do  echo "This is test file number $i" > testfile_$i.txt done     

Кроме того, я также рекомендую использовать опцию -w (seq -w 1 5), чтобы дополнить числа нулями, чтобы файлы сортировались аккуратно.

Вы также можете создавать файлы с несколькими строками содержимого. Следующий скрипт создаёт пять файлов, каждый из которых содержит 100 уникально пронумерованных строк:

for i in $(seq 1 5); do  for line in $(seq 1 100); do    echo "File $i, Line $line: Some random content here"  done > "file_$i.txt" done     

Здесь внешний цикл перебирает числа от 1 до 5 для имен файлов, а внутренний цикл генерирует 100 строк на файл, при этом вывод перенаправляется в файл с именем, основанным на счётчике внешнего цикла.

Повторите команду определённое количество раз

Иногда нужно выполнить команду несколько раз, когда вас интересует сама повторяемость, а не конкретные числа. Например, вы можете проверять задержку сети с помощью ping или многократно запускать скрипт, чтобы найти баг. Команда seq предоставляет простой способ сделать это без написания традиционного цикла for.

Например, вы можете использовать seq с xargs для стресс-тестирования приложений или проверки, запускается ли сервис правильно.

seq 10 | xargs -I {} curl -s http://mywebsite.com > /dev/null

Эта команда отправляет запрос на веб-сайт десять раз, что может помочь проверить, правильно ли ваш веб-сервер обрабатывает одновременные запросы.

seq также прекрасно сочетается с циклами for для повторения действий. Чтобы вывести «Hello, World!» пять раз, вы можете использовать:

for i in $(seq 1 5); do    echo "Hello, world!";  done     

Это выводит сообщение пять раз.

Создать временные метки или интервалы времени

Еще один отличный вариант использования seq — это генерация серии временных меток, особенно при создании тестовых данных или моделировании логов. Они могут представлять секунды, минуты или дни.

Предположим, вам нужен список каждого 15-минутного интервала в час для отчета.

seq -f "%02g" 0 15 59

Это дает 00, 15, 30 и 45.

Вы также можете генерировать точные метки времени. Этот пример выводит метку времени для каждой минуты в течение следующих 10 минут:

start=$(date +%s) for i in $(seq 0 9); do  echo "$(date -d "@$((start + i*60))" +"%Y-%m-%d %H:%M:%S")" done     

Скрипт сразу выводит все 10 будущих отметок времени. Он не ждет одну минуту между выводами. Если вы хотите получить тикер в реальном времени, который выводит одну строку в минуту, добавьте sleep 60 внутри цикла.

Чтобы создать временные метки в формате ЧЧ:ММ для полного часа, вы можете использовать простой цикл:

for minute in $(seq -f "%02g" 0 59); do  echo "14:$minute" done     

Это распечатает 14:00, 14:01, и так далее до 14:59. Это мощный способ создавать структурированные временные ряды данных прямо из вашего терминала.

Проверить доступность порта

Если вы системный администратор или разработчик, вы также можете использовать seq для сканирования диапазона портов и проверки их доступности. Например, вам может понадобиться развернуть приложение, но вы не уверены, какой порт свободен. Давайте просканируем диапазон портов на вашем локальном компьютере, чтобы узнать, какие из них открыты.

Мы можем использовать seq для генерации номеров портов и передавать их сетевой утилите, такой как nc, для проверки соединений.

for port in $(seq 8000 8010); do  nc -z -v -w 1 localhost $port &> /dev/null && echo "Port $port is OPEN" done     

Вот разбор команды:

  • для порта в &#36 (seq 8000 8010): Перебирает каждый номер порта.
  • nc -z -v -w 1 localhost $port: Это основная команда, которая пытается установить соединение.
  • -z: Сканирует службы прослушивания без отправки данных.
  • -v: Выводит подробную информацию (которую мы скрываем).
  • -w 1: Устанавливает тайм-аут в 1 секунду.
  • &> /dev/null: Перенаправляет весь вывод от nc, чтобы мы видели только наше финальное сообщение.
  • && echo «Порт $port ОТКРЫТ»: оператор && гарантирует, что команда echo выполняется только в том случае, если команда nc выполнена успешно (т.е. порт открыт).

Эти методы требуют соответствующих привилегий и инструментов. Используйте их ответственно и только на системах, которые принадлежат вам или на которых у вас есть разрешение на тестирование.

В качестве альтернативы вы можете использовать специфичную для Bash функцию, которая не требует nc:

for port in $(seq 8000 8100); do  (echo > /dev/tcp/localhost/$port) &> /dev/null && echo "Port $port is open" done     

Для серьёзного сканирования портов следует использовать специализированные инструменты, такие как nmap, но для быстрых проверок во время разработки этот метод с seq работает отлично.

Перебор диапазонов в скриптах

Хотя Bash имеет собственные способы создания циклов, использование seq часто является более переносимым и читаемым, особенно для сложных диапазонов или чисел с плавающей запятой. При написании скриптов seq делает перебор числовых диапазонов чистым и понятным.

Например, чтобы обработать пакет элементов между двумя точками, вы можете определить переменные START и END. Цикл позаботится обо всём остальном:

#!/bin/bash START_ITEM=25 END_ITEM=75 echo "Starting to process items from $START_ITEM to $END_ITEM..." for item_number in $(seq $START_ITEM $END_ITEM); do  echo "Processing item #$item_number..."  sleep 0.1 # simulate work done echo "All items processed!"     

Этот скрипт легко поддерживать, вам нужно лишь изменить переменные вверху.

Кроме того, вы можете применить ту же идею к реальным сценариям, таким как пакетная обработка данных. Например, вы можете проверить использование диска для серии пронумерованных каталогов с помощью этого:

for i in $(seq 1 10); do  du -sh /var/log/archive_$i 2>/dev/null done     

Поскольку seq поддерживает заполнение, вы можете поддерживать все в аккуратном порядке. Создание ежедневных резервных копий на целый месяц становится простым с помощью:

for day in $(seq -w 1 31); do  tar -czf backup_2025-09-$day.tar.gz /data done     

Эта однострочная команда создаёт 31 сжатый архив с правильно отформатированными именами (backup_2025-09-01.tar.gz и т.д.), что значительно упрощает сортировку и поиск.

Разделить файлы по строкам

Если вам нужно разбить большой файл на меньшие части, команда seq может помочь вычислить диапазоны строк для каждой части. Хотя команда split предназначена для этого, использование seq предоставляет более точный контроль над процессом и именованием файлов.

Например, чтобы разделить файл bigfile на части по 100 строк каждая, выполните следующее:

lines=$(wc -l < bigfile) for start in $(seq 1 100 $lines); do  end=$((start + 99))  sed -n "${start},${end}p" bigfile > chunk_$(printf "%04d" $start).txt done     

Этот скрипт сначала получает общее количество строк. Затем цикл for использует seq для генерации номера начальной строки для каждого блока (1, 101, 201 и т.д.). Внутри цикла sed извлекает этот блок строк и сохраняет его в файл с уникальным именем.

Выполнять математические операции

seq — отличный помощник для калькуляторов командной строки, таких как bc и awk. Вы можете передавать последовательность чисел напрямую в другую программу для выполнения вычислений.

Чтобы суммировать все числа от 1 до 100, используйте это:

seq -s "+" 1 100 | bc

Здесь, вместо того чтобы разделять числа переносами строк, мы ставим между ними знак +. Выходные данные представляют собой одну строку, которая передается в bc для вычисления выражения.

С помощью awk вы можете достичь того же результата:

seq 1 100 | awk '{s+=$1} END{print s}'

Этот способ генерации, форматирования и вычислений чрезвычайно полезен для быстрого анализа данных в командной строке.


Хотя seq кажется незначительной утилитой, она элегантно решает многие мелкие повторяющиеся задачи. Она сочетает в себе другие команды Linux, позволяя создавать мощные однострочные команды и скрипты, делая ее незаменимым инструментом для любого пользователя командной строки.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *