Команда 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` з рядком форматування. Потім перенаправляємо вивід для створення файлу з потрібною кількістю рядків фіктивних даних.