LINUX.ORG.RU

Вывод чисел на экран

 


0

1

Привет. Есть небольшой скрипт вывода диапазона из целых чисел

Begin=101 End=105

for i in $(seq $Begin $End); do echo $i

Хочу написать тоже самое только вывод следующих диапазонов но с точками:

101.1-101.99 101.5-110.100 101.1.1-102.2.99

Желательно через цикл т.к. каждое число $i будет далее выдаваться на поиск в find строку.

привидите примеры пожалуйста.



Последнее исправление: vladrnd (всего исправлений: 1)

101.1.1-102.2.99

А это как понимать? До скольки будет 101.1.99999 пока не станет 101.2.0 ?

vodz ★★★★★
()

Желательно через цикл

Тогда что-то типа такого:

for k in {100..200}; do
  for v in {0..99}; do
    for i in {0..99}; do
      if find $k.$v.$i; then
        # do what you want here
      else
        continue 2
      fi
    done
  done
done
Но это набросок, я даже не проверял.

r3lgar ★★★★★
()
Ответ на: комментарий от shell-script

Да что же никто маны не читает-то?

Пффф. И что man seq говорит об IPv4 строках, к которым подбирается ТС?

vodz ★★★★★
()
Ответ на: комментарий от shell-script

что то уже ближе. но вот таких значений

101.00 102.00

хотелось бы избежать без . и 00. должно быть

101.01 101.02 101.03 и т.д.

из общего списка.

vladrnd
() автор топика

Задача задана предельно размыто, до сих пор не ясно, десятичные это дроби или айпишники или что. Попробуй echo {101..102}.{01..10}, вдруг понравится

legolegs ★★★★★
()
Ответ на: комментарий от vladrnd

Прочитай таки seq --help хотя бы. Для добавления нулей есть отдельная опция. .00 можно отрезать при формировании списка дополнительным исключением.

seq -w  101.1 0.01 102.99 | sed -e 's/\,00$//'

Хотя, возможно, это можно сделать и без sed. Просто мне сейчас лень info seq читать и экспериментировать с форматом вывода(про эту опцию я сказал в предыдущем сообщении).

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Я не вижу в топике ни слова про ip-адреса.

Оно и видно, что вы нихрена читать не умеете, но почему-то обвиняете в этом других. Где я сказал, что ТСу нужно именно IP адреса? Доказать сможете?

vodz ★★★★★
()
Ответ на: комментарий от shell-script

Ну тогда давай определение термина «ipv4 строка» в студию.

У вас русский не родной? Там было сказано, «подбирается», что в моём понимании есть: «будет похожее на адрес в следующих приближениях». Если вы думаете, что это я такой уникальный и увидел «современное искусство» там где его нет, то вон и legolegs тоже увидел. Ибо как не увидеть, что ТСу надо не только дроби, это может сделать только слепой или яркий представитель поколения Y, который уже не может прочитать длинный текст и к концу топика мозги переполняются и текст скипается.

vodz ★★★★★
()
Ответ на: комментарий от shell-script

Сначала у тебя ipv4-строки, потом

Как типичненько для ЛОРа. облажаться и начать врать и кривляться.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Как типичненько для ЛОРа. облажаться и начать врать и кривляться.

Чем ты и продолжаешь заниматься непонятно зачем.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Чем ты и продолжаешь заниматься непонятно зачем.

Для идиотов разжёвываю: берём первый коментарий в этой теме. Про 101.1.99 и так далее. Это похоже на десятичную дробь? Это решается «seq»? А может вы и есть ТС, раз одинаково с ТСом лажаете и продолжате кривляться несмотря на вполне обоснованные просьбы сформулировать точнее исходную задачу, прежде чем решать её в лоб неправильно?

vodz ★★★★★
()
Ответ на: комментарий от shell-script

Спасибо. Но man это просто ничего :) Наверно все таки будет корректна строка вида:

seq 101.1 0.01 102.99 | sed -e 's/.00$//'

ключ -w здесь роли вообще никакой не играет.вроде б как все хорошо но вот это (нули) мешает

102.01 102.02 102.03 102.04 102.05 102.06 102.07 102.08 102.09

как видим нули остаются для десяток. для целых - норма.

поскольку задан диапазон 101.1-102.99 то соот-но в списке должны быть и десятые. т.е. придется задавать диапазон seq 101.01 0.01 102.99 и убивать эти самые самые нули. я так думаю.

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

Вам же подсказали, что для одной точки нет никаких проблем при использовании seq с форматной строкой:

seq -f '101.%g' 1 99

vodz ★★★★★
()
Ответ на: комментарий от legolegs

это диапазоны версий (каталоги с содержимым) данных в репозитории. они могут быть разного варианта 101.1-101.99 103.5-110.100 101.1.1-102.22.101 не более. Это не IP адреса.

задача стоит

1. сформировать весь диапазон найденных вариантов версий в репозитории, имена которых имеют вид указанных выше. делается через find. это отдельная задача.

2. создать скрипт на входе которого обозначены переменные вида (их мы задаем в ручную):

A=101-105, B=122.34.2-122.34.98, C=133.2-134.99. Соот-но нужно сформировать список из заданного вида трех диапазонов ОТ и ДО. в отдельный список. это делается согласно этой темы :) причем никаких 0'ей в версиях не существует (т.е. 101.01 это есть фактически 101.1).

3. Сравнить оба списка и выкинуть то что попадает из списка п.2 в списке п.1. Оставшееся передать на удаление. как-то так.

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

мы указываем здесь шаг

А вопрос был

1) про конечное значение.

2) про конечное значение в каждой подстроки, отделенной точкой, может у вас там «подразумевается» разное.

Вот в похожем на подобное, но безусловно не ваш случай, в IP адресе всё специфицировано: 4 октета, каждый от 0 до 255. А у вас неспецифированно ничего, но вы вместо того, чтобы расписать условия на законные вопросы начали возмущаться.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

И так. Результатом у нас получился скрипт, у которого на входе данные версии для анализа, на выходе - файл листинг input.txt. Вроде б ничего не упустил. :)


#!/bin/bash

# Range XXX.x-XXX.xxx (example: 161.1-165.110)
RNGB1=161
RNGE1=165
MAXVERSION1=110

for ((i=$RNGB1;i<=$RNGE1;i++));
  do seq -f "$i.%g" 1 $MAXVERSION1 | sort -n >> input.txt
done

# Range XXX-XXX (example: 162-190)
RNGB2=162
RNGE2=190

for i in $(seq $RNGB2 $RNGE2);
 do
   echo $i | sort -n >> input.txt
done

# Range XXX.x.x-XXX.xx.xxx (example: 162.1.1-170.22.110)

RNGB3=162
RNGE3=170
SUBVERSION1=1
SUBVERSION2=22
GAPSB=1
GAPSE=110

for ((k=$RNGB3; k <= $RNGE3; k++)) do
  for ((v=$SUBVERSION1; v <= $SUBVERSION2; v++)) do
    for ((i=$GAPSB; i <= $GAPSE; i++)) do
      echo $k.$v.$i | sort -n >> input.txt
    done
  done
done
vladrnd
() автор топика
Ответ на: комментарий от vladrnd

Тут всё не верно, вы сортируете ровно один echo. Надо менять

for(....
 seq_echo  XXX | sort -n >> input.txt
done
на
for(....
 seq_echo  XXX 
done | sort -n >> input.txt

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

а как можно передать результат в find -name $ ?

согласно циклу

for ((i=$RNGB1;i<=$RNGE1;i++));
do seq -f «$i.%g» 1 $MAXVERSION1 >> input.txt
done

или же считать их файла input.txt и передать в find с параметром -name ?

vladrnd
() автор топика
Ответ на: комментарий от vladrnd

В данном случае find не отличается от echo. Проще вообще без seq:

for ((i=RNGB1;i<=RNGE1;i++)); do
    for ((j=1;j<=MAXVERSION1;j++)); do
        find -name $i.$j
    done
done

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.