Forum » Programiranje » Bash skripta
Bash skripta
poweroff ::
Torej, imam nek program (okolje Linux), ki mi podatke na stdout izpiše na sledeč način:
Skratka, v vsakem stolpcu je 7 parametrov, ki so opisani v obliki: "ime parametra", ":", "vrednost parametra", ",". Pri zadnji vrednosti ni vejice.
To bi rad spravil v CSV ali tab-delimited datoteko s 7 stolpci. Nekako takole:
Kako to narediti v bashu?
PAR1: 8, PAR2: 935, PAR3: 51041, PAR4: 244, PAR5: 333, PAR6: 434, PAR7: -33 PAR1: 9, PAR2: 5635, PAR3: 43435, PAR4: 030, PAR5: 453, PAR6: 488, PAR7: -232 PAR1: 11, PAR2: 4435X, PAR3: 3431, PAR4: 245, PAR5: 367, PAR6: 404, PAR7: -8
Skratka, v vsakem stolpcu je 7 parametrov, ki so opisani v obliki: "ime parametra", ":", "vrednost parametra", ",". Pri zadnji vrednosti ni vejice.
To bi rad spravil v CSV ali tab-delimited datoteko s 7 stolpci. Nekako takole:
PAR1;PAR2;PAR3;PAR4;PAR5;PAR6;PAR7 8;935;51041;244;333;434;-33 9;5635;43435;030;453;488;-232 11;4435X;3431;245;367;404;-8
Kako to narediti v bashu?
sudo poweroff
rasta ::
Nekaj zelo na hitro, prav gotovo se da tudi bolje:
tmpf=$(tempfile) nek_program > $tmpf head -n1 $tmpf | awk 'BEGIN {FS="[:, ]+"} {print $1";"$3";"$5";"$7";"$9";"$11";"$13}' > izpis.csv cat $tmpf | awk 'BEGIN {FS="[:, ]+"} {print $2";"$4";"$6";"$8";"$10";"$12";"$14}' >> izpis.csv rm $tmpf
Ribič ::
Z vejcami:
S podpičjem:
sed -e 's/PAR.://g' -e 's/ //g'
S podpičjem:
sed -e 's/PAR.://g' -e 's/ //g' -e 's/,/;/g'
poweroff ::
Ja, ta del mi deluje, problem je, da ne morem zajeti podatkov iz stdouta.
app.py -p 34 2>&1 > data.txt
Vrne mi samo prvi dve vrstici, ostalega pa ne...
Pa isto z nohup.
app.py -p 34 2>&1 > data.txt
Vrne mi samo prvi dve vrstici, ostalega pa ne...
Pa isto z nohup.
sudo poweroff
Zgodovina sprememb…
- spremenilo: poweroff ()
OrkAA ::
Kaj pa ce pozenes samo osnovni program: ./app.py -p 34
Kako zgleda output? Najprej caka in pljune vse naenkrat ali pocasi pise vrstico za vrstico ... ?
Kako zgleda output? Najprej caka in pljune vse naenkrat ali pocasi pise vrstico za vrstico ... ?
čuhalev ::
Kaj če se bi ta app.py preuredil, da ti vrne že v ustrezni obliki?
Menim, da je programski jezik python, napisan človeku razumljivo ter nimaš pravnih oziroma licenčnih ovir, zaradi katerih bi moral spremembe objaviti.
Menim, da je programski jezik python, napisan človeku razumljivo ter nimaš pravnih oziroma licenčnih ovir, zaradi katerih bi moral spremembe objaviti.
poweroff ::
OrkAA - program vrača vrstico za vrstico.
V bistvu je to skener baznih postaj. Ki se pač vozi po spektru in ko postajo najde, izpiše podatke o njej.
Jaakaa - hja, žal nisem programer. Sicer znam nekaj malega PHP in Perla, ampak to je pa več ali manj vse...
V bistvu je to skener baznih postaj. Ki se pač vozi po spektru in ko postajo najde, izpiše podatke o njej.
Jaakaa - hja, žal nisem programer. Sicer znam nekaj malega PHP in Perla, ampak to je pa več ali manj vse...
sudo poweroff
poweroff ::
A je to tole:
return "ARFCN: %4u, Freq: %6.1fM, CID: %5u, LAC: %5u, MCC: %3u, MNC: %3u, Pwr: %3i" % (self.arfcn, self.freq/1e6, self.cid, self.lac ...
return "ARFCN: %4u, Freq: %6.1fM, CID: %5u, LAC: %5u, MCC: %3u, MNC: %3u, Pwr: %3i" % (self.arfcn, self.freq/1e6, self.cid, self.lac ...
sudo poweroff
videc ::
poweroff ::
Lej, imam sicer željo naučit se malo bolj resno programirat, ampak mi preprosto zmanjkuje časa. Pač resoursi so omejeni in človek en more imeti vsega.
Pa ni to vprašanje sploh. Oziroma so take opazke nerelevantne za to temo. Vprašanje je, zakaj preusmeritev iz stdout ne dela. Če ne znaš odgovoriti na to vprašanje, se ne oglašaj. Razen, če seveda želiš jasno povedati, da glede tega pojma nimaš.
Sploh je pa stvar v tem, da sprememba vejic v podpičja ni rešitev. Stvar je v tem, da hočem poganjati ta skener v loopu, pa da mi podatke izpisuje v txt datoteko. To bom potem importal v PSQL. Tam je sicer vseeno ali so ločilni znaki vejice, podpičja ali kaj tretjega.
On a long shot hočem zadevo poganjati na več RPi-jih in output preko omrežja preusmeriti v bazo.
Pa še tole - rabim dosti generično rešitev problema, ker poleg GSM skenerja obstaja še LTE, itd...
Pa ni to vprašanje sploh. Oziroma so take opazke nerelevantne za to temo. Vprašanje je, zakaj preusmeritev iz stdout ne dela. Če ne znaš odgovoriti na to vprašanje, se ne oglašaj. Razen, če seveda želiš jasno povedati, da glede tega pojma nimaš.
Sploh je pa stvar v tem, da sprememba vejic v podpičja ni rešitev. Stvar je v tem, da hočem poganjati ta skener v loopu, pa da mi podatke izpisuje v txt datoteko. To bom potem importal v PSQL. Tam je sicer vseeno ali so ločilni znaki vejice, podpičja ali kaj tretjega.
On a long shot hočem zadevo poganjati na več RPi-jih in output preko omrežja preusmeriti v bazo.
Pa še tole - rabim dosti generično rešitev problema, ker poleg GSM skenerja obstaja še LTE, itd...
sudo poweroff
Zgodovina sprememb…
- spremenilo: poweroff ()
misek ::
V datoteko ne zapisuje sproti, ker se rezultat shranjuje v buffer.
Na začetek python datoteke dodaj 'import sys', nato pa za print sys.stdout.flush().
A to uporabljaš gr-gsm? Če ja potem je mesto za flush() za klicem 'print info'.
Na začetek python datoteke dodaj 'import sys', nato pa za print sys.stdout.flush().
A to uporabljaš gr-gsm? Če ja potem je mesto za flush() za klicem 'print info'.
johnnyyy ::
Ja, ta del mi deluje, problem je, da ne morem zajeti podatkov iz stdouta.
app.py -p 34 2>&1 > data.txt
Vrne mi samo prvi dve vrstici, ostalega pa ne...
Pa isto z nohup.
Ne vem zakaj najprej redirektaš in potem zapišeš v datoteko?
Raje poizkusi neposredno:
app.py -p 34 &> data.txt
primer:
echo "xxx" 1>&2 > data.txt
"xxx" se bo zapisal v datoteko, čeprav ga redirektaš na stderr...
Spura ::
#!/bin/bash SRC=`cat <<EOF PAR1: 8, PAR2: 935, PAR3: 51041, PAR4: 244, PAR5: 333, PAR6: 434, PAR7: -33 PAR1: 9, PAR2: 5635, PAR3: 43435, PAR4: 030, PAR5: 453, PAR6: 488, PAR7: -232 PAR1: 11, PAR2: 4435X, PAR3: 3431, PAR4: 245, PAR5: 367, PAR6: 404, PAR7: -8 EOF` HEADERS=$(echo "$SRC" | head -n1 | sed -E 's/([A-Z0-9]*):[^A-Z]*/\1;/g') echo "$HEADERS" for line in "$SRC" do echo "$line" | sed -E 's/\w*: *([^,])*,? */\1;/g' done
Izpise kar zahtevas.
Invictus ::
sed -i 's/PAR[0-9]:\s*//g' ime_datoteke
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
OrkAA ::
Matthai: Tisto kar si pejstal je samo return funkcije. Potem se mora rezultat tega se prikazat na ekran. Isci kaksen 'print' oz. 'sys.stdout.write' ..
misek ::
Glede na omenjeno vrstico je to tale projekt: https://github.com/ptrkrysik/gr-gsm
file https://github.com/ptrkrysik/gr-gsm/blo...
file https://github.com/ptrkrysik/gr-gsm/blo...
Zgodovina sprememb…
- spremenil: misek ()
poweroff ::
Če poženeš tkole kaj pomaga?
stdbuf -oL app.py -p 34 2>&1 > data.txt
That did tha trick.
Hvala!
sudo poweroff
poweroff ::
V bistvu je tole točno to, kar rabim:
Zdaj se rabim samo še poigrat z avtomatsko kalibracijo (-p 34) in da dam zadevo v en loop ter dodam še ~timestamp, pa je zadeva približno gotova.
tmpf=$(tempfile) stdbuf -oL airprobe_rtlsdr_scanner.py -p 34 >&1 > $tmpf echo "ARFCN;Freq;CID;LAC;MCC;MNC;Pwr" > data.csv more +3 $tmpf | awk 'BEGIN {FS="[:, ]+"} {print $2";"$4";"$6";"$8";"$10";"$12";"$14}' >> data.csv rm $tmpf
Zdaj se rabim samo še poigrat z avtomatsko kalibracijo (-p 34) in da dam zadevo v en loop ter dodam še ~timestamp, pa je zadeva približno gotova.
sudo poweroff
poweroff ::
Evo, tole mi sedaj zadevo poganja v loopu:
Ven pade data.csv, ki ga uvozimo v psql:
In potem lahko naredimo kakšno preprosto analizico:
#!/bin/bash echo "date;time;ARFCN;Freq;CID;LAC;MCC;MNC;Pwr" > data.csv while true; do tmpf=$(tempfile) grtime="$(date +"%Y-%m-%d;%H":%M:%S)" echo "Scanning GSM... [Current scan started at: $grtime. Hit CTRL+C to stop!]" stdbuf -oL airprobe_rtlsdr_scanner.py -p 35 >&1 > $tmpf more +3 $tmpf | awk -v x="$grtime" 'BEGIN {FS="[:, ]+"} {print x";"$2";"$4";"$6";"$8";"$10";"$12";"$14}' >> data.csv rm $tmpf done
Ven pade data.csv, ki ga uvozimo v psql:
create table gsmscan (date date, time time, arfcn text, freq text, cid text, lac text, mcc text, mnc text, pwr text); \COPY gsmscan from 'data.csv' with csv header delimiter ';'; alter table gsmscan add column bs_id text; update gsmscan set bs_id = arfcn || '-' || freq || '-' || cid || '-' || lac || '-' || mcc || '-' || mnc;
In potem lahko naredimo kakšno preprosto analizico:
select freq, count(*) as num_of_detections, min(pwr) as min_pwr, max(pwr) as max_pwr from gsmscan group by freq, bs_id order by freq, num_of_detections;
freq | num_of_detections | min_pwr | max_pwr --------+-------------------+---------+--------- 935.2M | 1 | -30 | -30 935.2M | 64 | -28 | -33 936.2M | 2 | -35 | -37 936.2M | 4 | -35 | -36 936.2M | 5 | -33 | -37 937.2M | 3 | -57 | -59 937.2M | 4 | -54 | -58 937.2M | 11 | -56 | -59 937.6M | 1 | -57 | -57 937.8M | 1 | -55 | -55 937.8M | 4 | -49 | -56 937.8M | 12 | -54 | -56 938.6M | 65 | -26 | -26 939.4M | 65 | -27 | -27 956.6M | 65 | -26 | -27 958.0M | 65 | -26 | -27
sudo poweroff
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Python - pomoč (strani: 1 2 3 )Oddelek: Programiranje | 17932 (8680) | black ice |
» | Uvoz txt datoteke v excelOddelek: Programska oprema | 4996 (4633) | sebavet |
» | [javascript] zazeni, pocakaj, osveziOddelek: Programiranje | 983 (816) | detroit |
⊘ | python pomočOddelek: Programiranje | 3394 (2315) | Mavrik |
» | Makroji v exceluOddelek: Programska oprema | 2465 (2359) | smetko |