BASH (вопросы и ответы.)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
20.05.2009 23:43
Zeus писал(а):
20.05.2009 21:51
А что не так?

ну у вас как-бы сказать...
на самом деле, вы получаете строку из строки, а потом строку считаете тоже строкой, только из шестнадцатеричных символов :)
А как вы эти BLOB'ы читаете? у меня почему-то получаются обычные символы...


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

echo $SQL | mysql -U $USER -H $HOST -E $DATABASE |
{
while read NUM_STR && read DATA_STR; do
echo $DATA_STR | while read -e -n 2 BYTE; do
#... и вот тут мне нужно было этот байт преобразовать в символ
done
done
}

Концептуально примерно так.
В синтаксисе стопудово где-нибудь накосячил - я в bash-скриптинге далеко не ас, а самогО кода под рукой нет.
Но в целом - понятно:
mysql вываливает построчно выборку в блок операторов, которые читают эти записи, а DATA_STR разбирается ещё и побайтно.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: BASH

Сообщение sash-kan »

Zeus
perl-овый pack будет, пожалуй, значительно более эффективным решением.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

sash-kan писал(а):
21.05.2009 02:33
perl-овый pack будет, пожалуй, значительно более эффективным решением.

+1
ИМХО тут все эти read не к месту...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

Ради одной задачи вспоминать perl, которым я мимоходом занимался пару месяцев 10 лет назад - лишнее это.
Поизучать bash для линуксоида полезнее будет.
И потом, в конторе perl вообще никто не знает: сопровождать ПО некому будет. С башем хоть как-то...

Ну а насчёт эффективности...
Этот скрипт на самом деле CGI-скрипт для веб-морды просмотра протоколов работы одной хреновины.
Ею будут пользоваться... хорошо если раз в квартал. А то и ещё реже.
Короче, при разборе полётов, когда будут выяснять почему команда не исполнилась или сигнал не пришёл.
Так что там особая прям "эффективность" (в плане скорострельности) - не нужна.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
21.05.2009 09:27
Ради одной задачи вспоминать perl,

согласен. я тоже перл не знаю :)
А почему бы просто не загнать всё в текстовый файл, а потом разобрать этот файл разными шелловскими утилитами?
gawk, sed, и проч...
bash имхо очень не удобен для работы с текстом, даже 2 строки сложно сравнить(благодаря заботливо расставленным граблям).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

Ну во-первых, никто ж не мешает в bash'евском скрипте использовать и "разные шелловские утилиты".
Ну а анализировать данные лучше всего доверить базе данных. И от неё забирать уже готовую выборку.
Там в общем-то все поля как есть можно сливать в HTML. Ну или почти как есть.
И только одно поле - с массивом данных, требует обработки.
Причём специфической: в одном случае их нужно как таблицу представить, в другом - в виде структуры определённого формата (в т.ч. и с текстовыми полями), в третьем - это дата: надо переделать 4 двухзначных шестнадцатиричных числа в одно десятичное и полученный unixtime передать date, который в определённом формате отдаст уже человекочитаемую дату - и вот её уже можно записывать в HTML.
И таких особенностей отображения этого единственного поля - кучи. И далеко не все они текстовые. Даже скорее почти всегда данные этого поля обрабатываются как числа. Так что sed и проч - вряд ли тут помогут.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
21.05.2009 14:25
4 двухзначных шестнадцатиричных числа в одно десятичное и полученный unixtime передать date,

Zeus писал(а):
21.05.2009 14:25
sed и проч - вряд ли тут помогут.

очень даже помогут - sed будет разбираться с байтами и если надо, вызывать утилиты, например ту-же date, а затем формировать из этого html.
мало того, это наверное самый простой и быстрый способ(если не брать спецпрограммы на C/C++), так как я понял, вам надо данные из одного формата преобразовать в другой. BASH этого не умеет, bash вообще, имхо, нормально умеет только собирать в одно целое другие утилиты...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
21.05.2009 17:47
как я понял, вам надо данные из одного формата преобразовать в другой. BASH этого не умеет, bash вообще, имхо, нормально умеет только собирать в одно целое другие утилиты...

Вы, собственно, это же на sed собирались возложить:

drBatty писал(а):
21.05.2009 17:47
sed будет разбираться с байтами и если надо, вызывать утилиты, например ту-же date


:)

sed может из двух шестнадцатиричных цифр сделать один символ, ASCII-кодом которого является число, составленное из этих цифр?

Или, вот раз уж зашёл разговор про unixtime и date:
sed может собрать четыре двухразрядных шестнадцатиричных числа (4 байта) в одно десятичное число (чтобы передать его потом date)?
Т.е. есть такая строка: 63B8154A
Это строка символов. Щестнадцатиричных цифр.
А из неё нужно получить строку: 1242937443 - тоже строка символов.
Но это уже десятичные цифры. То же самое число.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
22.05.2009 00:23
sed может из двух шестнадцатиричных цифр сделать один символ, ASCII-кодом которого является число, составленное из этих цифр?

sed может всё :)
с данной постановкой вопроса ИМХО быстрее(и по выполнению и по написанию) всего справится как раз-таки sed, которая вызывает в нужных местах текста командой s/ / /e специализированную программу на Си(которую я напишу за 5-30 минут).

PS: а что вы меня путаете?
0x63B8154A==1673008458
если брать по символам, то

$

echo "63B8154A"|sed -r 's/[0-9a-f]{2}/\\x&/ig; s/.*/echo -e "&"/e' c�J

фигня какая-то...
как вы получили 1242937443?

Zeus писал(а):
22.05.2009 00:23
Т.е. есть такая строка: 63B8154A
Это строка символов. Щестнадцатиричных цифр.

?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

$

echo "3634"|sed -r 's/[0-9a-f]{2}/\\x&/ig; s/.*/echo -e "ibase=16;&"|bc/e' 100

"3634" это символы 6 и 4, в 16иричном виде.
число 0x64, это в десятичной 100.


ЗЫЖ вопрос к гуру BASH - а как называется формат для printf, что-бы символы печатать?

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

int c='X';
printf("%c", c);

А как в bash?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
22.05.2009 05:39
sed может всё :)

...если ему в помощь написать специализированную программу на C :D

drBatty писал(а):
22.05.2009 05:39
PS: а что вы меня путаете?
0x63B8154A==1673008458

Это long-овое значение на платформе х86. В начале идут младшие байты, в конце - старшие.

drBatty писал(а):
22.05.2009 05:50

$

echo "3634"|sed -r 's/[0-9a-f]{2}/\\x&/ig; s/.*/echo -e "ibase=16;&"|bc/e' 100

"3634" это символы 6 и 4, в 16иричном виде.
число 0x64, это в десятичной 100.

А зачем sed?
В bc можно просто шестнадцатиричное число сливать. Основание системы счисления (ibase) указано же.

drBatty писал(а):
22.05.2009 05:50
ЗЫЖ вопрос к гуру BASH - а как называется формат для printf, что-бы символы печатать?

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

int c='X';
printf("%c", c);

А как в bash?


Так я же в самом вопросе сразу и ответ написал:
Zeus писал(а):
20.05.2009 16:38
У меня есть строка состоящая из двух шестнадцатиричных цифр.



Требуется получить символ ASCII-кодом которого является значение переменной A.
Чем это делается?

=========
Кажется сам нашёл:

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

A="31"
printf "\x$A\n"

1

Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
22.05.2009 05:39

$

echo "63B8154A"|sed -r 's/[0-9a-f]{2}/\\x&/ig; s/.*/echo -e "&"/e' c�J

А вот этот эпизод можно поподробнее?
"Кто" тут из чисел сделал символы? echo что-ли? И как он тут вызывается?

P.S. Просто я sed знаю весьма поверхностно. Можно сказать совсем не знаю.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
22.05.2009 09:59
...если ему в помощь написать специализированную программу на C

зависит от задачи. sed текстовый редактор, если вам надо биты двигать, то проще на C.
Zeus писал(а):
22.05.2009 09:59
0x63B8154A==1673008458


Это long-овое значение на платформе х86. В начале идут младшие байты, в конце - старшие.

0x4A15B863
Это?
т.е. надо ещё байты переставить?
вот тут sed и нужна, потому как bc переставлять символы как раз и не умеет.
Zeus писал(а):
22.05.2009 09:59
А зачем sed?

потому что в тексте не только число, и ещё и не в том виде как нужно для bc. для того и sed - найти, подготовить, и запустить bc(или там прогу на C, или ещё что-то)

Zeus писал(а):
22.05.2009 09:59
Так я же в самом вопросе сразу и ответ написал:
это не printf, printf это форматный вывод, даёшь ей формат, она так и выводит, скажешь - 16иричное - выведет 64, скажешь простое целое - выдаст 100, хотя аргумент одинаковый... Скажешь двоичное - выдаст 1100100...

Zeus писал(а):
22.05.2009 10:11
echo "63B8154A"|sed -r 's/[0-9a-f]{2}/\\x&/ig; s/.*/echo -e "&"/e'
c�J



А вот этот эпизод можно поподробнее?

сначала перед каждой парой символов 0-9 или a-f я поставил \x, получилось \x63\xB8\x15\x4A,
сделал из этого echo -e "\x63\xB8\x15\x4A"
ну и запустил...
\x63 это c
а вот что такое
\xB8 - не в курсе...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
22.05.2009 16:06
Zeus писал(а):
22.05.2009 09:59

Это long-овое значение на платформе х86. В начале идут младшие байты, в конце - старшие.

0x4A15B863
Это?

Угу.

drBatty писал(а):
22.05.2009 16:06
т.е. надо ещё байты переставить?
вот тут sed и нужна, потому как bc переставлять символы как раз и не умеет.

Зато можно управлять последовательностью символов, которые ему на вход подаются.
Прочитал четыре двухзначных числа, а потом пихай их в bc как хошь. Хоть справа налева, хоть слева направо, хоть "на первый второй рассчитайсь"...

drBatty писал(а):
22.05.2009 16:06
это не printf, printf это форматный вывод

Ну не знаю. Написано printf.

drBatty писал(а):
22.05.2009 16:06
сначала перед каждой парой символов 0-9 или a-f я поставил \x, получилось \x63\xB8\x15\x4A,
сделал из этого echo -e "\x63\xB8\x15\x4A"

Семё-ён Семёныч! Что ж раньше-то молчал?!
А я тут printf'ы какие-то прикручиваю...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
22.05.2009 17:35
0x4A15B863
Это?

Угу.

Zeus писал(а):
22.05.2009 17:35
Зато можно управлять последовательностью символов, которые ему на вход подаются.

сам bc может жрать числа в любом порядке? С каким ключом? Я не ёрничаю, просто в мане не видел такой опции..
Zeus писал(а):
22.05.2009 17:35
Семё-ён Семёныч! Что ж раньше-то молчал?!
А я тут printf'ы какие-то прикручиваю...

ну да. это BASH... как-бы printf тут рядом и не стояла, может и echo, и другая sed так сделать...

ЗЫЖ ну как sed умеет переставлять символы просто лень писать... Это в info написано. Просто - умеет :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
22.05.2009 20:45
сам bc может жрать числа в любом порядке? С каким ключом? Я не ёрничаю, просто в мане не видел такой опции..


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

BYTE1=4A
BYTE2=15
BYTE3=B8
BYTE4=63

echo "ibase=16;$BYTE1$BYTE2$BYTE3$BYTE4" | bc
echo "ibase=16;$BYTE4$BYTE3$BYTE2$BYTE1" | bc
echo "ibase=16;$BYTE1$BYTE4$BYTE3$BYTE2" | bc

...
Короче, изголяйся как хочешь.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
23.05.2009 08:14
сам bc может жрать числа в любом порядке?

Zeus писал(а):
23.05.2009 08:14
BYTE1=4A
BYTE2=15
BYTE3=B8
BYTE4=63

не, это вы его с ложечки кормите :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
23.05.2009 19:22
не, это вы его с ложечки кормите :)

:pardon:
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
24.05.2009 00:19
drBatty писал(а):
23.05.2009 19:22
не, это вы его с ложечки кормите :)

:pardon:

$

echo "вот пример числа для анализа:63B8154Aтакое вот число..." | sed -rn ' s/.*([0-9a-f]{8}).*/выкусываем число:\1/ip s/[^0-9a-f]*([0-9a-f]{4})([0-9a-f]{4})/меняем слова местами\(16 бит\):\2\1/ip s/([0-9a-f]{2})([0-9a-f]{2})/\2\1/ig s/.*([0-9a-f]{8})/а теперь мы поменяли и байты:\1/ip s/.*([0-9a-f]{8})/echo "ibase=16;\1"|bc/ie s/.*/Вот, sed скормила калькулятору число, и калькулятор выдал: &/p s/.*/Кроме того, sed проверяет, что мы скармливаем, а не как обычно :-)/p' выкусываем число:63B8154A меняем слова местами(16 бит):154A63B8 а теперь мы поменяли и байты:4A15B863 Вот, sed скормила калькулятору число, и калькулятор выдал: 1242937443 Кроме того, sed проверяет, что мы скармливаем, а не как обычно :-)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: BASH

Сообщение sash-kan »

Shell

$ echo '123abcABCда; нет. Go!' | sed 's/[[:xdigit:]]//g' да; нет. Go!
«i» — это, конечно, прекрасно, но малоэффективно. к тому же не всегда желательно.
а без «i» вообще монстр получается: 0-9a-fA-F

p.s. это я так, для справки.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

sash-kan писал(а):
24.05.2009 12:50

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

[:xdigit:]

sash-kan писал(а):
24.05.2009 12:50

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

0-9a-fA-F

чем ваш монстр хуже моего? мой короче, и его проще запомнить и набрать. 0-9a-fA-F всем понятно, кто понимает символьные классы. и на 1 символ короче. Я кстати и пишу по этому так, мне все ваши [[:.+:]] запоминать лень :) B[ их же много разных...

да, s/ / /i тоже для справки, а то тут некоторые перед sed уже tr заюзали :(

ЗЫЖ засунул в [code], а то кажется что мой монстрик длиннее. ;)

ЗЗЫЖ ещё для справки - в sed есть своя tr, к счастью она a-f не понимает, потому одностроки на sed невозможны(в отличие от перла) :)
а для хитрых манипуляций с регистром есть

$

doc ~/chat $ echo 'привет ВСЕМ!' | sed 's/\w*/\l&/g' привет вСЕМ! doc ~/chat $ echo 'привет ВСЕМ!' | sed 's/\w*/\L&/g' привет всем! doc ~/chat $ echo 'привет ВСЕМ!' | sed 's/\w*/\u&/g' Привет ВСЕМ! doc ~/chat $ echo 'привет ВСЕМ!' | sed 's/\w*/\U&/g' ПРИВЕТ ВСЕМ!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

ОМГ!

Я лучше read'ом прочту 4 байта и перемножу-сложу как надо - чисто средствами bash'а, чем вызывать sed с такой монструозной программой действий, а потом передать его вывод калькулятору с огромной функциональностью из которой мне нужно, наверное, меньше десятой доли процента!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: BASH

Сообщение sash-kan »

drBatty писал(а):
24.05.2009 15:42
B[ их же много разных
man 7 regex
стандартные классы:

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

              alnum       digit       punct
              alpha       graph       space
              blank       lower       upper
              cntrl       print       xdigit


drBatty писал(а):
24.05.2009 15:42
всем понятно, кто понимает
те, кто понимает, пишут в уме машинными кодами (улыбка). а незамутнённому сознанию мнемоника ближе.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
24.05.2009 18:36
Я лучше read'ом прочту 4 байта и перемножу-сложу как надо - чисто средствами bash'а, чем вызывать sed с такой монструозной программой действий

ага. просто это простой случай. в более сложных вам будет сложнее :(
а программа не только что-то делает, но и ещё коментирует то что делает. Это не так-то просто, учитывая то, что я храню числа в той-же области где и комментирую(в sed всего 2 переменных, а я использую одну).

$

sed -rn ' s/.*([[:xdigit:]]{8}).*/\1/ s/([[:xdigit:]]{4})([[:xdigit:]]{4})/\2\1/g s/([[:xdigit:]]{2})([[:xdigit:]]{2})/\2\1/g s/[[:xdigit:]]{8}/echo "ibase=16;&"|bc/iep' 1242937443

так попроще. к тому-же это всё можно и масштабировать... на любое количество чисел например... В BASH их очень неудобно искать и расфасовывать по переменным.
Что до bc, так вы тоже его используете :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

sash-kan писал(а):
24.05.2009 19:51
man 7 regex
стандартные классы:

info sed
\w == [[:alnum:]]
\s == [[:space:]] (об этом в info не нашёл)
\d не работает :(
а как пишется отрицание? \W например?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: BASH

Сообщение Zeus »

drBatty писал(а):
25.05.2009 05:20
Zeus писал(а):
24.05.2009 18:36
Я лучше read'ом прочту 4 байта и перемножу-сложу как надо - чисто средствами bash'а, чем вызывать sed с такой монструозной программой действий

ага. просто это простой случай. в более сложных вам будет сложнее :(

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

drBatty писал(а):
25.05.2009 05:20
а программа не только что-то делает, но и ещё коментирует то что делает. Это не так-то просто, учитывая то, что я храню числа в той-же области где и комментирую(в sed всего 2 переменных, а я использую одну).

Честно говоря, какое-то "натянутое" достоинство sed :)
А чего программе "комментировать"? Особенно CGI-скрипту.
Ему результат надо выдать.

drBatty писал(а):
25.05.2009 05:20

$

sed -rn ' s/.*([[:xdigit:]]{8}).*/\1/ s/([[:xdigit:]]{4})([[:xdigit:]]{4})/\2\1/g s/([[:xdigit:]]{2})([[:xdigit:]]{2})/\2\1/g s/[[:xdigit:]]{8}/echo "ibase=16;&"|bc/iep' 1242937443

:blink:

drBatty писал(а):
25.05.2009 05:20
так попроще. к тому-же это всё можно и масштабировать... на любое количество чисел например... В BASH их очень неудобно искать и расфасовывать по переменным.
Что до bc, так вы тоже его используете :)

$

echo $DUMP | { read -e -n 2 BYTE1 && read -e -n 2 BYTE2 && read -e -n 2 BYTE3 && read -e -n 2 BYTE4 echo "$( (($BYTE4 * 0x1000000 + $BYTE3*0x10000 + $BYTE2*0x100 + $BYTE1)) )" }

Для моей задачи вполне достаточно. И заметьте, только bash. Никаких sed'ов и bc.
А если надо поставить скрипт на контроллер, где дистрибутив неполный?
Из-за одного скрипта тащить туда sed и bc?

(код опять-таки примерный: настоящего под рукой нет, а проверять некогда)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: BASH

Сообщение sash-kan »

drBatty писал(а):
25.05.2009 05:32
\w == [[:alnum:]]
нет, эти классы не идентичны.
drBatty писал(а):
25.05.2009 05:32
а как пишется отрицание?
как обычно:

Shell

$ echo '"12 34"'|sed 's/[[:alnum:]]*//g' " " $ echo '"12 34"'|sed 's/[^[:alnum:]]*//g' 1234 $ echo '"12 34"'|sed 's/[^[:alnum:][:space:]]*//g' 12 34
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: BASH

Сообщение Naruto-kun »

Возвращаясь снова к моей проблеме, со сравнением с использованием echo+bc. Например, при попытке ввода следущего:

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

 echo "1.2>1.1" | bc

Выдавалась ошибка:

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

 syntax error on line 1, teletype

Но, на одном из форумов подсказал, как всё таки можно обойти эту ошибку:

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

 echo "if (1.2>1.1) 1" | bc

Может, кому пригодится.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH

Сообщение drBatty »

Zeus писал(а):
25.05.2009 08:05
А я для конкретного случая программу пишу.

безусловно. вопрос - на чём. на sed или на C или там ещё на чём-то. В некоторых случаях sed - оптимальное решение, часто - примерно эквивалентное. я просто хочу показать, что sed 's/x/y/' это далеко не всё, что можно сделать с sed.
Zeus писал(а):
25.05.2009 08:05
Из-за одного скрипта тащить туда sed и bc?
про bc - ну есть, есть, если нет, можно и что-то другое. read и echo тоже наверное не везде есть, с такими ключиками...

Naruto-kun писал(а):
01.06.2009 15:11
Возвращаясь снова к моей проблеме, со сравнением с использованием echo+bc. Например, при попытке ввода следущего:
Код
echo "1.2>1.1" | bc

$

$ echo "1.1-1.2" | bc | sed 's/^-.*/0/;t;s/.*/1/' 0 $ echo "1.2-1.1" | bc | sed 's/^-.*/0/;t;s/.*/1/' 1

замена > на вычитание, а затем анализируем знак. ну правда у меня тут >=. впрочем для плавающей точки это не важно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: BASH

Сообщение Naruto-kun »

Неплохая идея. Надо будет попробовать.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали: