Як використовувати команду seq в Linux

Команда Linux `seq` дозволяє миттєво створювати переліки чисел. Але яким чином цю функціональність можна застосувати в повсякденній роботі? Зараз ми покажемо вам, як `seq` може стати корисним інструментом.

Команда `seq`

На перший погляд, команда Linux `seq` може здатися дещо незвичайною. Вона забезпечує швидке створення числових послідовностей, і на цьому все! Проте, ключовим словом тут є “швидке”. Ви одразу побачите, наскільки оперативно може працювати ця невелика команда.

Яким би чином не створювались, наскільки корисним може бути набір чисел? Команда `seq` була включена до 8-ї версії Unix ще в 1985 році. З того часу вона залишається актуальною, а це означає, що вона повинна бути дійсно корисною.

Філософія Unix базується на принципі використання невеликих утиліт, кожна з яких виконує конкретне завдання якісно. Одним з основних принципів цієї філософії є створення програм, що приймають вхідні дані від інших програм. Звичайно, це також передбачає, що ці програми повинні генерувати вихідні дані, які можуть бути використані іншими програмами як вхідні.

Команда `seq` виявляє свою справжню цінність у поєднанні з іншими командами, які використовують її результати, або через канали, або за допомогою розширення командного рядка.

Створення базового переліку

Якщо ви запускаєте `seq` з одним числовим аргументом, вона буде рахувати від одиниці до цього числа. Згенеровані числа будуть виводитись у вікні термінала, по одному на кожному рядку, як показано нижче:

seq 6

При введенні двох чисел, перше буде початковим значенням, а друге – кінцевим, як показано тут:

seq 4 10

Ви можете налаштувати розмір кроку, додавши третє число. Воно розташовується між початковим і кінцевим значеннями. Наступна команда створює послідовність чисел, яка починається з шести, закінчується на 48, і використовує крок у шість:

seq 6 6 48

Зворотний відлік

Можливо створювати списки чисел у зворотному порядку, від більшого до меншого. Для цього необхідно задати від’ємне значення кроку.

Наступна команда створює перелік чисел, що зменшуються від 24 до 12 з кроком -6, оскільки ми задаємо крок як від’ємне значення:

seq 24 -6 12

Робота з десятковими значеннями

Початкове, кінцеве значення та значення кроку також можуть бути десятковими числами. Якщо хоча б одне з них десяткове, інші також будуть інтерпретовані як десяткові. Наступна команда створить перелік чисел з кроком 0.2:

seq 1 0.2 2

Швидкість виконання `seq`

Команда `seq` працює надзвичайно швидко – єдиним обмеженням є час, необхідний для введення команди у терміналі. Для перевірки швидкості, спробуємо створити перелік з 250 000 чисел.

Використовуючи команду `time`, ми виміряємо час виконання процесу:

time seq 250000

Результати з’являться під переліком. Навіть на нашому тестовому комп’ютері з помірною продуктивністю, `seq` працює надзвичайно швидко.

Весь перелік був згенерований і виведений на екран приблизно за 1/3 секунди. Якщо перенаправити вивід у файл, ми зможемо уникнути зайвих витрат часу на виведення у терміналі.

Для цього вводимо наступне:

time seq 250000 > numbers.txt

Час, витрачений на генерацію переліку та створення файлу, зараз становить приблизно 1/7 секунди.

Використання роздільника

Символ нового рядка є стандартним роздільником, що вставляється між кожним числом у списку. Саме тому числа виводяться вертикальним переліком, де кожне число знаходиться на окремому рядку. Якщо потрібно, ви можете задати інший роздільник.

Наприклад, якщо необхідно створити перелік, розділений комами, двокрапками, або будь-якими іншими символами. Роздільник може бути довільним рядком, тому можна використовувати декілька символів одночасно.

Для задання роздільника використовується параметр `-s`. Наступна команда створить перелік, розділений комами:

seq -s, 6 6 36

Ця команда використає двокрапку (:) як роздільник:

seq -s: 6 6 36

Ця команда вказує `seq` використати два дефіси (–) як роздільник:

seq -s-- 6 6 36

Використання рядків форматування

Команда `seq` також підтримує форматування рядків у стилі C. Це надає більш точний контроль над виведенням, ніж просто задання роздільника. Для використання рядка форматування, застосовується параметр `-f` (формат).

Наступна команда вказує `seq` доповнити вивід нулями до двох символів:

seq -f "%02g" 6

Ми можемо відформатувати рядок довільним текстом і розмістити число у будь-якому місці рядка, як показано нижче:

seq -f "Number %02g in a C-like format string" 6

Швидкий спосіб задати нульове заповнення

Найшвидший спосіб застосувати нульове заповнення – використовувати параметр `-w` (рівна ширина). Він наказує `seq` використовувати нулі для доповнення чисел, щоб вони мали однакову ширину, як і найбільше число.

Наступна команда рахує від 0 до 1000 з кроком 100, і всі числа будуть доповнені нулями:

seq -w 0 100 1000

Найдовше число займає чотири символи, тому всі коротші числа доповнюються нулями до цієї ширини (навіть 0 буде доповнене чотирма нулями).

Використання `seq` в конвеєрі з `bc`

Задавши роздільник як математичний символ та передавши результат в команду `bc`, ми зможемо обчислити значення переліку.

Наступна команда створює перелік чисел, розділених зірочками

seq -s* 6

починаючи з одного і закінчуючи шістьма:

seq -s* 6 | bc

Якщо ми передамо цей перелік в `bc`, він обчислить вираз, використовуючи зірочки

seq -s+ 5

як символ множення:

seq -s+ 5 | bc

Також можна використовувати інші символи. Наведена нижче команда використовує знак плюса (+), щоб створити перелік, де всі числа додаються:

Для передачі переліку в `bc` і обчислення його значення, вводимо наступне: Створення файлів за допомогою команди `touch`.

Команда `touch` оновлює позначки часу та дати

touch $(seq -f "file-%g.txt" 1 10)

на файлах. Якщо файлу не існує, `touch` його створить. Ми можемо скористатися розширенням командного рядка, використовуючи `touch` та `seq` для створення набору файлів із іменами за шаблоном, але з різними номерами.

ls file*

Для перевірки файлів вводимо наступне:

touch $(seq -f

Використання `seq` в циклах Bash

#!/bin/bash

  for val in $(seq 5 0.2 6.6); do

  echo "The value is now: $val"

done

Ми можемо використовувати `seq` у сценаріях Bash для керування циклами з десятковими значеннями.

chmod +x loop.sh

Введіть наведений вище код у редакторі та збережіть його як “loops.sh”:

./loop.sh

Далі, вводимо наступне, щоб зробити наш новий сценарій виконуваним:

При запуску скрипту, лічильник циклу виводиться у терміналі. Ми бачимо, як значення лічильника десяткового циклу збільшується з кожною ітерацією циклу:

Пам’ятайте, що `seq` може рахувати і в зворотньому порядку; це можна використовувати в циклах аналогічним чином. Просто та зрозуміло Головна перевага `seq` — відсутність потреби в довгому навчанні. Її man-сторінка є

надзвичайно короткою

та зрозумілою, але це не заважає використовувати її для вирішення багатьох цікавих задач.

Оскільки нам часто потрібно оперативно створювати тестові файли з реалістичними розмірами, ми часто використовуємо `seq` з рядком форматування. Потім перенаправляємо вивід для створення файлу з потрібною кількістю рядків фіктивних даних.