bash - zmienna tablicowa

Potrzebujesz pomocy z C, C++, perl, python, itp.
kuleczek
Posty: 36
Rejestracja: 16 grudnia 2007, 12:24

bash - zmienna tablicowa

Post autor: kuleczek »

Witam,
plik cell. txt wyglada nastepujaco:

Kod: Zaznacz cały

cat cell.txt
          Cell 01 - Address: 00:08:A1:AF:CE:FC
          Cell 02 - Address: 00:08:A1:AF:CA:98
          Cell 03 - Address: 00:90:4C:7E:00:29
          Cell 04 - Address: 00:19:5B:BC :D F:EF
          Cell 05 - Address: 00:15:E9:0D:30:60
          Cell 06 - Address: 00:06:25:98:41:C4
                    ESSID:"mechaniczny rządzi !!!! chwasty"
                    ESSID:"MISIAKI"
                    ESSID:"aurelia"
                    ESSID:"KACZOR"
                    ESSID:"kazek"
                    ESSID:"dom"
Stworzylem zmienna tablicowa w ten sposob:

Kod: Zaznacz cały

tab_sieci=(`cat /home/lukasz/cell.txt`)
Chcialbym, zeby kolejne wiersze pliku byly kolejnymi elementami tablicy, tymczasem:

Kod: Zaznacz cały

echo ${tab_sieci[0]}
echo ${tab_sieci[1]}
daje taki rezultat:

Kod: Zaznacz cały

Cell
01
itd...
Jak to zmienic?
Poza tym, czy sie da sie jakos usunac spacje z poczatkow wszytskich wierszy? I jak polaczyc wiersz 1 z 6, 2 z 7 itd.?
Z gory dziekuje za pomoc.
Gość

Re: bash - zmienna tablicowa

Post autor: Gość »

kuleczek pisze:Chcialbym, zeby kolejne wiersze pliku byly kolejnymi elementami tablicy
No to masz:

Kod: Zaznacz cały

#!/bin/bash

numer=0
while read linia]="$linia"
	numer="$(( ++numer ))"
done< cell.txt
kuleczek pisze:I jak polaczyc wiersz 1 z 6, 2 z 7 itd.?
To pomyśl nad tym, by dane do pliku był zapisywane w ten sposób aby nie było to potrzebne.


Pozdrawiam
kuleczek
Posty: 36
Rejestracja: 16 grudnia 2007, 12:24

Post autor: kuleczek »

Dzieki. Co do drugiego to nie mam pojecia jak to zrobic (narazie to jest 2x uzyty grep z przekierowaniem), ale bede walczyl.
Gość

Post autor: Gość »

kuleczek pisze:Dzieki. Co do drugiego to nie mam pojecia jak to zrobic (narazie to jest 2x uzyty grep z przekierowaniem), ale bede walczyl.
A z czego i w jaki sposób zapisujesz ten plik?
kuleczek
Posty: 36
Rejestracja: 16 grudnia 2007, 12:24

Post autor: kuleczek »

Kod: Zaznacz cały

#!/bin/sh
iwlist eth1 scan > sieciwifi.txt
grep 'Cell' sieciwifi.txt > cell.txt
grep 'ESSID' sieciwifi.txt >> cell.txt
Na razie doszedlem do tego, ze moze zrobic 2 pliki cell.txt i essid.txt i ich wiersze przypisac do tablic i dalej jakos nimi operowac, tzn. moze latwiej bedzie wysiwtelic cell + mac + essid w jednej linii.
Gość

Post autor: Gość »

Daj wynik z

Kod: Zaznacz cały

iwlist eth1 scan
to pomyślimy jak to ładniej zapisać w jeden plik :)
kuleczek
Posty: 36
Rejestracja: 16 grudnia 2007, 12:24

Post autor: kuleczek »

Prosze bardzo :)

Kod: Zaznacz cały

laptop:/home/lukasz# iwlist eth1  scan
eth1      Scan completed :
          Cell 01 - Address: 00:08:A1:AF:CE:FC
                    ESSID:"mechaniczny rzondzi !!!! chwasty"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    Encryption key :o n
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=51/100  Signal level=-78 dBm  Noise level=-78 dBm
                    Extra: Last beacon: 764ms ago
          Cell 02 - Address: 00:1B:11:F9:0F:6E
                    ESSID:"ChudyWiFi"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key :o n
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=31/100  Signal level=-90 dBm  Noise level=-90 dBm
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (1) : TKIP
                        Authentication Suites (1) : PSK
                    Extra: Last beacon: 8624ms ago
          Cell 03 - Address: 00:1B:11:9B:99:4C
                    ESSID:"Markowskiego_8"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key :o ff
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=43/100  Signal level=-83 dBm  Noise level=-83 dBm
                    Extra: Last beacon: 5992ms ago
          Cell 04 - Address: 00:08:A1:AF:CA:98
                    ESSID:"MISIAKI"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:13
                    Frequency:2.472 GHz (Channel 13)
                    Encryption key :o n
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=54/100  Signal level=-76 dBm  Noise level=-76 dBm
                    Extra: Last beacon: 436ms ago
          Cell 05 - Address: 00:19:5B:BC :D F:EF
                    ESSID:"KACZOR"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key :o n
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=37/100  Signal level=-87 dBm  Noise level=-87 dBm
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (1) : TKIP
                        Authentication Suites (1) : PSK
                    Extra: Last beacon: 8620ms ago
          Cell 06 - Address: 00:15:E9:0D:30:60
                    ESSID:"kazek"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:11
                    Frequency:2.462 GHz (Channel 11)
                    Encryption key :o n
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=43/100  Signal level=-83 dBm  Noise level=-83 dBm
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (1) : TKIP
                        Authentication Suites (1) : PSK
                    Extra: Last beacon: 520ms ago
          Cell 07 - Address: 00:06:25:98:41:C4
                    ESSID:"dom"
                    Protocol:IEEE 802.11b
                    Mode:Master
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key :o n
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s
                    Quality=30/100  Signal level=-91 dBm  Noise level=-91 dBm
                    Extra: Last beacon: 3360ms ago
          Cell 08 - Address: 00:30:AB:20:38:6E
                    ESSID:"Wireless"
                    Protocol:IEEE 802.11b
                    Mode:Master
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key :o ff
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s
                    Quality=28/100  Signal level=-92 dBm  Noise level=-92 dBm
                    Extra: Last beacon: 8628ms ago
Oczywiscie zawartosc tego pliku jest dynamiczna.
Gość

Post autor: Gość »

No to troszkę pomieszamy :)

Plik skanuj:

Kod: Zaznacz cały

#!/bin/bash

[[ -z $1 ]] && exit 1

iwlist "$1" scan \
| grep [CE][eS][lS][lI] \
| tr -d '\n' \
| sed 's/Cell/\nCell/g;s/   //g;' \
> $HOME/cell.txt
odpalasz jako: skanuj eth1
Wynik:

Kod: Zaznacz cały

 Cell 01 - Address: 00:08:A1:AF:CE:FC  ESSID:"mechaniczny rządzi !!!! chwasty" 
Cell 02 - Address: 00:1B:11:F9:0F:6E  ESSID:"ChudyWiFi" 
Cell 03 - Address: 00:1B:11:9B:99:4C  ESSID:"Markowskiego_8" 
Cell 04 - Address: 00:08:A1:AF:CA:98  ESSID:"MISIAKI" 
Cell 05 - Address: 00:19:5B:BC :D F:EF  ESSID:"KACZOR" 
Cell 06 - Address: 00:15:E9:0D:30:60  ESSID:"kazek" 
Cell 07 - Address: 00:06:25:98:41:C4  ESSID:"dom" 
Cell 08 - Address: 00:30:AB:20:38:6E  ESSID:"Wireless"
zostaje zapisany do pliku $HOME/cell.txt

Następnie plik datatab:

Kod: Zaznacz cały

#!/bin/bash

nr=0
while read x; do
	declare tab_s["$(( nr-1 ))"]="$x"
	nr="$(( ++nr ))"
done< $HOME/cell.txt
wczyta Ci ładnie cały plik do tablicy - cała linia jako jedna komórka.

Nie mam pojęcia co działasz i jak to ma ostatecznie wyglądać, dlatego na razie rozbiłem na 2 oddzielne pliki byś miał ładnie poglądowo :)
Gdyby całość robić jako jeden skrypt, to można od razu robić potokiem bez zapisywania do pliku.

Pozdrawiam
kuleczek
Posty: 36
Rejestracja: 16 grudnia 2007, 12:24

Post autor: kuleczek »

To moze napisze, co robie :)
Wymyslilem sobie, ze chce napisac skrypt, ktory ulatwi zycie posiadaczowi laptopa (mnie) w laczeniu sie z publicznymi hot spotami, ale i nie tylko.
Na ta chwile uruchomienie skryptu mialoby wyswietlic liste dostepnych sieci (w dalszej wersji z ew. zabezpieczeniami). Uzytkownik, z listy wybralby siec ( w dalszej wersji, jesli siec bylaby zabezpieczona, wpisalby klucz). Po zatwierdzeniu nastapilaby edycja pliku /etc/network/interfaces oraz restart sieci. To tak w ogolnym zarysie. :)
Na poczatek chce zrobic tylko niezabezpiecozne sieci.

Dzieki za powyzsze listingi. Wieczorem je sobie poanalizuje.

[ Dodano: 2008-02-28, 20:12 ]
Czy mogę prosić o objaśnienie tej linii:

Kod: Zaznacz cały

| sed 's/Cell/\nCell/g;s/   //g;' \ 
Tzn. wiem za co ona odpowiada - rozbija jeden długi wiersz na tyle ile jest Cell, ale nie umiem rozgryźć składni. man sed i google trochę pomogły, ale nie do końca.
ODPOWIEDZ