» »

Bash skripta

Bash skripta

poweroff ::

Torej, imam nek program (okolje Linux), ki mi podatke na stdout izpiše na sledeč način:

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:
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.
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 ... ?

č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.

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...
sudo poweroff

OrkAA ::

Matthai: Ce odpres app.py, na kaksen nacin pise vrstice? Navaden print ali kaj drugega?

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 ...
sudo poweroff

ziga7 ::

Ja no. Zamenjaj dvopicja in vecice s podpicji. Oh joj.

videc ::

ziga7 je izjavil:

Ja no. Zamenjaj dvopicja in vecice s podpicji. Oh joj.
Ma lej, človek ima doktorat, nima on časa za kodo. :P

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...
sudo poweroff

Zgodovina sprememb…

  • spremenilo: poweroff ()

Senitel ::

Če poženeš tkole kaj pomaga?
stdbuf -oL app.py -p 34 2>&1 > data.txt

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'.

johnnyyy ::

poweroff je izjavil:

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.

poweroff ::

johnnyyy je izjavil:


app.py -p 34 &> data.txt


Ne dela.
sudo poweroff

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

misek ::

Matthai, si prebral moj in Senitelov post?

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' ..

Ribič ::

Se ti da tale app.py nekam naložiti, da pogledamo izvorno kodo?

lp

misek ::

Glede na omenjeno vrstico je to tale projekt: https://github.com/ptrkrysik/gr-gsm

file https://github.com/ptrkrysik/gr-gsm/blo...

Zgodovina sprememb…

  • spremenil: misek ()

poweroff ::

Senitel je izjavil:

Č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:

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:

#!/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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10317176 (7924) black ice
»

Uvoz txt datoteke v excel

Oddelek: Programska oprema
294699 (4336) sebavet
»

[javascript] zazeni, pocakaj, osvezi

Oddelek: Programiranje
6909 (742) detroit

python pomoč

Oddelek: Programiranje
393300 (2221) Mavrik
»

Makroji v excelu

Oddelek: Programska oprema
62329 (2223) smetko

Več podobnih tem