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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

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

Непрочитанное сообщение levantuev » 2009-10-28 20:34:19

есть строка:

Код: Выделить всё

user1 xxxxxxx UH 0 1378811 ng3
как выдернуть оттуда 1378811

Или как присвоить результат команды

Код: Выделить всё

netstat -r | awk '/default/ { print $5 }' 
в sh скрипте в качестве переменной

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение gloom » 2009-10-28 20:45:39

Код: Выделить всё

netstat -r | awk '/default/ { print $5 }' |xargs proga



Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение gloom » 2009-10-28 20:54:55

proga ето та команда которой передать параметры надо

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение levantuev » 2009-10-28 20:59:21

netstat -r | awk '/default/ { print $5 }' | xargs $a - так?
Приношу извинения за свою неграмотность, не могли бы вы пример привести

Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение gloom » 2009-10-28 21:06:10

netstat -r | awk '/default/ { print $5 }' | xargs прогакоторойпередатьпеременную
еси ето перловый скрипт blabla.pl то пишете
netstat -r | awk '/default/ { print $5 }' | xargs blabla.pl

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение levantuev » 2009-10-28 21:09:20

а если у меня sh скрипт и переменную нужно передать в тот файл в котором выполняется скрипт

Код: Выделить всё

netstat -r | awk '/default/ { print $5 }' | xargs x.sh
а где имя переменной в качестве, которой передается в файл?

Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение gloom » 2009-10-28 21:13:39

нету тут переменных

хотя-бы попытайтесь почитать man xargs

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение paradox » 2009-10-28 21:23:12

Код: Выделить всё

peremennaya_plat="netstat -r | awk '/default/ { print $5 }' "
как то так)))

Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение gloom » 2009-10-28 21:24:10

paradox писал(а):

Код: Выделить всё

peremennaya_plat="netstat -r | awk '/default/ { print $5 }' "
как то так)))
тогда не в одну строку :roll:

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение paradox » 2009-10-28 21:25:27

в одну строку тоже должно работать
токо я не помню как правильно екранировать
двумя " или одинарной '

Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение gloom » 2009-10-28 21:35:08

echo `netstat -r | awk '/default/ { print $5 }' `

Гость
проходил мимо

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение Гость » 2009-10-28 21:56:39

paradox писал(а):

Код: Выделить всё

peremennaya_plat="netstat -r | awk '/default/ { print $5 }' "
как то так)))

Код: Выделить всё

peremennaya_plat=$(netstat -r | awk '/default/ { print $5 }' )
или

Код: Выделить всё

peremennaya_plat=`netstat -r | awk '/default/ { print $5 }' `
второй вариант не умеет вложения, напр. $(...$(...$(...) ) )

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение levantuev » 2009-10-28 22:00:02

спасибо, а еще доп.вопрос, как полученное число например: 4924079 , разделить пробелами, что бы получилось вроде этого: 4 924 079

Гость
проходил мимо

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение Гость » 2009-10-29 17:30:10

levantuev писал(а):спасибо, а еще доп.вопрос, как полученное число например: 4924079 , разделить пробелами, что бы получилось вроде этого: 4 924 079
через localeconv(3) устроит[1]?

Код: Выделить всё

$ echo 4924079 | LC_NUMERIC=ru_RU.UTF-8 awk '{ printf ("%'"\'"'d\n", $0) }'
4 924 079
вместо echo подставь команду, коя генерирует число на stdout

LC_NUMERIC можно не указывать, если у тебя стоит русская локаль в LANG. Если использовать локаль en_US, то разделение будет запятыми, а не пробелами.

[1] см. printf(3), %'d
printf(3) писал(а):
  • `''
    • Decimal conversions (d, u, or i) or the integral portion
      of a floating point conversion (f or F) should be
      grouped and separated by thousands using the non-mone-
      tary separator returned by localeconv(3).
если я не оишбаюсь, этот способ используется и при `sysctl -h'

Аватара пользователя
gloom
лейтенант
Сообщения: 738
Зарегистрирован: 2008-03-13 16:29:12
Откуда: UA

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение gloom » 2009-10-29 17:39:09

Гость писал(а):

Код: Выделить всё

$ echo 4924079 | LC_NUMERIC=ru_RU.UTF-8 awk '{ printf ("%'"\'"'d\n", $0) }'
под линей не пашет

Гость
проходил мимо

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение Гость » 2009-10-29 18:21:33

gloom писал(а):под линей не пашет
должно, там обычно стоит lang/gawk на месте awk'а (во FreeBSD используется nawk)

Код: Выделить всё

$ echo 4924079 | LC_NUMERIC=ru_RU.UTF-8 gawk '{ printf ("%'"\'"'d\n", $0) }'
gawk: warning: escape sequence `\'' treated as plain `''
4 924 079
Однако на некоторых Лялихах используется ru_RU.utf8 вместо ru_RU.UTF-8. Попробуй поэксперементировать с локалями.

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение levantuev » 2009-10-30 4:07:10

а как доделать так:
если число 6 748 525 , то автоматически пишет 6.7 Гбайт,
если число 755 087 , то пишет 755 Кбайт
если число 378 , то пишет 378 Байт

Гость
проходил мимо

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение Гость » 2009-10-30 14:15:16

levantuev, заюзать humanize_number(3) или считать вручную с помощью awk(1)

Код: Выделить всё

#! /bin/sh

echo '
3000000000
6748525
755087
378
' |
awk -v OFMT=%.1f '
  BEGIN {
     h[1] = "Ki"
     h[2] = "Mi"
     h[3] = "Gi"
     h[4] = "Ti"
  }

  /[[:digit:]]/ {
     n=$0
     for(i = 0; n > 2^10; i++) {
         n /= 2^10
     }
     if(n > 10)
         n = int(n)
     print n, h[i] "B"
  }
'

Код: Выделить всё

$ ./a.sh
2.8 GiB
6.4 MiB
737 KiB
378 B
сие можно уместить и в одну строку, воспользовавшись разделителем `;', но будет нечитабельно.
Касательно бинарного префикса (`Ki', а не `K')
w:Binary prefix писал(а):Most Unix-like systems which use the ls command to display file sizes use powers of 1024 indicated as KB/MB. In Linux, the directory listing tool (ls) has options for decimal file size listings. Microsoft Windows reports file sizes using prefixes in binary meaning but does not use IEC standard prefixes. Prior to Snow Leopard, Apple's Mac OS X reported file sizes in the same way. Since Snow Leopard, file sizes are reported in decimal units.
Т.е. никто не использует SI-приставки для подсчета байтов.

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение levantuev » 2009-10-30 14:33:02

в данном примере байты в Кбайты, Мбайты, Гбайты переводятся, а как сделать что бы Кбайты в Мегабайты и Гигабайты переводило? пробовал экспериментировать с числом 10, не получается

Гость
проходил мимо

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение Гость » 2009-10-30 15:24:25

levantuev, достаточно чуток поправить скрипт

Код: Выделить всё

#! /usr/bin/awk -f

BEGIN {
    OFMT = "%.1f"
    split("Ki:Mi:Gi:Ti:Pi:Ei:Zi:Yi", h, ":")
}

/^[[:digit:]]+$/ {
    n=$0
    for(i = 0; n > 2^10; i++)
        n /= 2^10
    if(n > 10)
        n = int(n)
    print n, h[i] "B"
}

/[[:digit:]]+ [[:alpha:]]*B$/ {
    n=$1
    s=$2
    sub("B$", "", s)
    for(i = 0; i <= 4; i++)
        if(s == h[i])
            print n * 2^(10 * i)
}

Код: Выделить всё

$ echo 3000000000 | ./a.awk
2.8 GiB

$ echo 2.8 GiB | ./a.awk
3006477107.2

$ printf "6.4 MiB\n737 KiB\n378 B\n" | ./a.awk
6710886.4
754688
378

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение levantuev » 2009-10-30 17:59:24

10634128 - данное число должно выдавать 10 Гбайт ну или что то приблизительное

Гость
проходил мимо

Re: Присвоение результата команды в качестве переменной

Непрочитанное сообщение Гость » 2009-10-30 19:08:15

levantuev писал(а):10634128 - данное число должно выдавать 10 Гбайт ну или что то приблизительное
пардон? ты считаешь не в байтах? или не видел табличку по ссылке на википедию, кою я выше приводил?
Gi = 2 ^ 30 = 1 073 741 824; G = 1 000 000 000
Mi = 2 ^ 20 = 1 048 576; M = 1 000 000
Ki = 2 ^ 10 = 1 024; K = 1 000
http://en.wikipedia.org/wiki/Binary_prefix#Prefixes

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

Отсюда вопрос: 10 634 128 - это величина в байтах или килобайтах?