Автор Тема: Помощ с bash  (Прочетена 2390 пъти)

philip_petev

  • Напреднали
  • *****
  • Публикации: 20
  • Distribution: Linux Mint 10 x64
  • Window Manager: Gnome
    • Профил
Помощ с bash
« -: Jul 05, 2012, 10:50 »
Здравейте, може ли някой да ми каже има ли начин с bash скрипт да се прави функцията byte flip, която я има повече по инженерните калкулатори, накратко имам 0x30e4 и търся резултат 0xe430, тоест да сменя местата на байтовете, а примерно 0x7ed да става 0xed07. Претърсих доста места в интернет, но не можах да намеря нещо което да ме насочи как може да стане това. Благодаря предварително.
Активен

sudo

  • Напреднали
  • *****
  • Публикации: 73
    • Профил
Re: Помощ с bash
« Отговор #1 -: Jul 05, 2012, 12:22 »
Не казваш от къде четеш входящите данни и за това мога само да гадая, но като едно добро начало "dd conv=swab if=infputfile of=outputfile", другото което ми идва на ум е една миниатюрна програма на С където всичко е ясно.
Активен

philip_petev

  • Напреднали
  • *****
  • Публикации: 20
  • Distribution: Linux Mint 10 x64
  • Window Manager: Gnome
    • Профил
Re: Помощ с bash
« Отговор #2 -: Jul 05, 2012, 12:56 »
Не казваш от къде четеш входящите данни и за това мога само да гадая, но като едно добро начало "dd conv=swab if=infputfile of=outputfile", другото което ми идва на ум е една миниатюрна програма на С където всичко е ясно.

Входните данни ги дърпам в този вид, в който съм писал, от един dump с помощта на grep и sed. Идеята е да ги преобразува вътре в скрипта, а не да ползвам външни файлове за това. Това, което си написал, сменя местата, но на съседни байтове, а не това е условието на задачката.
« Последна редакция: Jul 05, 2012, 13:04 от philip_petev »
Активен

sudo

  • Напреднали
  • *****
  • Публикации: 73
    • Профил
Re: Помощ с bash
« Отговор #3 -: Jul 05, 2012, 13:46 »
За да изясним докрай условието на задачата, ти имаш string който има стойност '0x30e4' или имаш binary data file в който има 30e4 (което са си точно 2 байта и ти ги искаш разменени) ?
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Помощ с bash
« Отговор #4 -: Jul 05, 2012, 14:27 »
За да изясним докрай условието на задачата, ти имаш string който има стойност '0x30e4' или имаш binary data file в който има 30e4 (което са си точно 2 байта и ти ги искаш разменени) ?
Първо да уточня, че в самия шел май имаш само сметки $((израз)) за елементарни аритметики с цели числа.

Ако имаш нещо от сорта на str='0x30e4' (променлива, т.е. низ, на който искаш да разменяш буквите), поднизове в bash (като надмножество на POSIX възможностите) можеш да получаваш по схемата ${str:position:length}:
Код
GeSHi (Bash):
  1. mara@OVNIWatermelon:~$ str='0x30e4'
  2. mara@OVNIWatermelon:~$ echo ${str:0:2}
  3. 0x
  4. mara@OVNIWatermelon:~$ echo ${str:0:2}${str:4:2}${str:2:2}
  5. 0xe430
  6. mara@OVNIWatermelon:~$

Ако имаш файл с два байта и искаш да ги размениш, може да пробваш head/tail с опцията -c (тя не е POSIX опция, има я в GNU варианата на програмата):
Код
GeSHi (Bash):
  1. mara@OVNIWatermelon:~$ printf 'ab' > two_bytes
  2. mara@OVNIWatermelon:~$ hd two_bytes
  3. 00000000  61 62                                             |ab|
  4. 00000002
  5. mara@OVNIWatermelon:~$ head -c 1 two_bytes | hd
  6. 00000000  61                                                |a|
  7. 00000001
  8. mara@OVNIWatermelon:~$ tail -c 1 two_bytes | hd
  9. 00000000  62                                                |b|
  10. 00000001
  11. mara@OVNIWatermelon:~$ tail -c 1 two_bytes > reversed_two_bytes
  12. mara@OVNIWatermelon:~$ head -c 1 two_bytes >> reversed_two_bytes
  13. mara@OVNIWatermelon:~$ hd reversed_two_bytes
  14. 00000000  62 61                                             |ba|
  15. 00000002
  16. mara@OVNIWatermelon:~$

Надявам се това да ти даде някакви насоки :)
Активен

solarflux

  • Напреднали
  • *****
  • Публикации: 100
    • Профил
Re: Помощ с bash
« Отговор #5 -: Jul 05, 2012, 15:14 »
Здравейте, може ли някой да ми каже има ли начин с bash скрипт да се прави функцията byte flip, която я има повече по инженерните калкулатори, накратко имам 0x30e4 и търся резултат 0xe430, тоест да сменя местата на байтовете, а примерно 0x7ed да става 0xed07. Претърсих доста места в интернет, но не можах да намеря нещо което да ме насочи как може да стане това. Благодаря предварително.
ако можеш да си гарантираш, че няма да има 0х7ed вместо 0х07ed можеш да ползваш:

$ echo 0x30e4 | sed 's/.\{2\}/&\ /g' | awk '{ {printf "0x"} {for (i=NF; i>1; i--) printf "%s", $i," " } print ""}'
0xe430
$ echo 0x07ed | sed 's/.\{2\}/&\ /g' | awk '{ {printf "0x"} {for (i=NF; i>1; i--) printf "%s", $i," " } print ""}'
0xed07
Активен

philip_petev

  • Напреднали
  • *****
  • Публикации: 20
  • Distribution: Linux Mint 10 x64
  • Window Manager: Gnome
    • Профил
Re: Помощ с bash
« Отговор #6 -: Jul 05, 2012, 16:31 »
За да изясним докрай условието на задачата, ти имаш string който има стойност '0x30e4' или имаш binary data file в който има 30e4 (което са си точно 2 байта и ти ги искаш разменени) ?
Първо да уточня, че в самия шел май имаш само сметки $((израз)) за елементарни аритметики с цели числа.

Ако имаш нещо от сорта на str='0x30e4' (променлива, т.е. низ, на който искаш да разменяш буквите), поднизове в bash (като надмножество на POSIX възможностите) можеш да получаваш по схемата ${str:position:length}:
Код
GeSHi (Bash):
  1. mara@OVNIWatermelon:~$ str='0x30e4'
  2. mara@OVNIWatermelon:~$ echo ${str:0:2}
  3. 0x
  4. mara@OVNIWatermelon:~$ echo ${str:0:2}${str:4:2}${str:2:2}
  5. 0xe430
  6. mara@OVNIWatermelon:~$

Ако имаш файл с два байта и искаш да ги размениш, може да пробваш head/tail с опцията -c (тя не е POSIX опция, има я в GNU варианата на програмата):
Код
GeSHi (Bash):
  1. mara@OVNIWatermelon:~$ printf 'ab' > two_bytes
  2. mara@OVNIWatermelon:~$ hd two_bytes
  3. 00000000  61 62                                             |ab|
  4. 00000002
  5. mara@OVNIWatermelon:~$ head -c 1 two_bytes | hd
  6. 00000000  61                                                |a|
  7. 00000001
  8. mara@OVNIWatermelon:~$ tail -c 1 two_bytes | hd
  9. 00000000  62                                                |b|
  10. 00000001
  11. mara@OVNIWatermelon:~$ tail -c 1 two_bytes > reversed_two_bytes
  12. mara@OVNIWatermelon:~$ head -c 1 two_bytes >> reversed_two_bytes
  13. mara@OVNIWatermelon:~$ hd reversed_two_bytes
  14. 00000000  62 61                                             |ba|
  15. 00000002
  16. mara@OVNIWatermelon:~$

Надявам се това да ти даде някакви насоки :)

Да, моя е грешката, явно снощи ми е дошло малко повече пиенето, че днес навсякъде ги пиша едни...

Как стоят нещата - с една команда вадя един дълъг лог (който си е чисто стрингов тип), след това в него търся реда който ми трябва с grep, след което резултата го филтрирам през sed и след като всичко това се изпълни в един ред (команда | grep критерий | sed 's/.*0x//'), крайния резултат е това въпросно DeviceID от вида 30e4, което се намира в края на въпросния ред и на което трябва да завъртя местата на байтовете (е430), след което да го обърна в стринг, но десетичната стойност (това обаче знам как става). Губеше ми се само обръщането, но явно съм забравил че това си е преди всичко стринг, а него мога да си го правя каквото си искам, има достатъчно оператори за това. Проблема е че това DeviceID може да бъде три или четири символа (и доколкото знам не може да е пет или повече символа, както и два или по-малко), като ако е от вида 7ed, трябва да се обърне на 0d7e, но и това се сетих как ще стане. В комбинация с един case за трите случая (при дължина 4, 3 или всичко останало, в който ще връща грешка) ще стане идеално. Благодаря на всички за отговорите, наистина ми бяха полезни за да се сетя какво да правя.
« Последна редакция: Jul 05, 2012, 16:35 от philip_petev »
Активен

morbid_viper

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: (Open)SUSE since v5.3 (1999)
  • Window Manager: KDE ориентиран
    • Профил
Re: Помощ с bash
« Отговор #7 -: Jul 05, 2012, 17:17 »
Абе има си и побитови операции в bash… но…
веднъж го ядох този, защото има значение дали си на 32-битова или 64-битова и с някои операции не получаваш точно желания резултат.
лично аз писах едни алгоритми за преобразуване на IP адрес към целочислено и обратно, където масово се ползват побитови операции.

така или иначе щом имаш низове за въртене, нещата са драматично по-прости…  :-)
Активен

-------------------------------------------------
Blessed are we to taste this life of sin!
-------------------------------------------------
Registered Linux user #251276

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Помощ с bash
« Отговор #8 -: Jul 05, 2012, 17:27 »
Губеше ми се само обръщането, но явно съм забравил че това си е преди всичко стринг, а него мога да си го правя каквото си искам, има достатъчно оператори за това. Проблема е че това DeviceID може да бъде три или четири символа (и доколкото знам не може да е пет или повече символа, както и два или по-малко), като ако е от вида 7ed, трябва да се обърне на 0d7e, но и това се сетих как ще стане. В комбинация с един case за трите случая (при дължина 4, 3 или всичко останало, в който ще връща грешка) ще стане идеално. Благодаря на всички за отговорите, наистина ми бяха полезни за да се сетя какво да правя.
Да, то си има ${#string} за дължината на низа и другото са вече подробности (щом като имаш само два-три варианта за дължината на низа).
Активен

remotex

  • Напреднали
  • *****
  • Публикации: 344
    • Профил
Re: Помощ с bash
« Отговор #9 -: Jul 06, 2012, 02:46 »
7ed - 07ed - ed07
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
BASH: Как да поддържам една програма работеща
Общ форум
Regia 1 9570 Последна публикация Feb 16, 2005, 08:51
от
bash
Настройка на програми
tuxi 7 5096 Последна публикация Jun 11, 2005, 19:12
от tuxi
Моля за малко помощ за BASH
Настройка на програми
bonbon 3 3841 Последна публикация Dec 04, 2005, 16:37
от bonbon
BASH
Общ форум
Dean79 3 3972 Последна публикация Jan 13, 2006, 00:24
от Dean79
Bash присвояване на стойност от файл
Общ форум
Pulear 6 4599 Последна публикация May 21, 2006, 17:20
от Pulear