Forum » Programiranje » bash programiranje
bash programiranje
atomant ::
Imam sledeč problem: v configuracijski datoteki so posamezni sklopi označeni z [SKLOP_A], [SKLOP_B], itd. Vsak sklop ima 2 parametra in sicer param_a=ime_datoteke in param_b=velikost_datoteke-v-bajtih:
[SKLOP_A]
param_a=ime_datoteke
param_b=velikost_datoteke-v-bajtih
[SKLOP_B]
param_a=ime_datoteke
param_b=velikost_datoteke-v-bajtih
.
.
.
Želim namreč primerjati oba parametra s pripadajočo resnično datoteko za posamezen sklop ter če se velikost ne ujema se param_a vpiše v novo datoteko_B, za vsak sklop v novo vrstico.
Kako bi to naredil z bash programiranjem? Ali pa obstaja kakšna enostavnejša varianta (C,php, perl)
[SKLOP_A]
param_a=ime_datoteke
param_b=velikost_datoteke-v-bajtih
[SKLOP_B]
param_a=ime_datoteke
param_b=velikost_datoteke-v-bajtih
.
.
.
Želim namreč primerjati oba parametra s pripadajočo resnično datoteko za posamezen sklop ter če se velikost ne ujema se param_a vpiše v novo datoteko_B, za vsak sklop v novo vrstico.
Kako bi to naredil z bash programiranjem? Ali pa obstaja kakšna enostavnejša varianta (C,php, perl)
lp,
S
purgovich ::
hm... sem napisal rešitev v perlu, samo ne vem če je to to kar si hotel
...program prebira en fajl, ter vsaki sklop posebej primerja z istim iz drugega fajla, nato izpiše parametre a v novo datoteko (če so seveda parametri b različni v teh dveh datotekah)
Glede kode pa se opravičujem ker sem še noob v programiranju, pa sem to bolj ali manj spocal skup.
...program prebira en fajl, ter vsaki sklop posebej primerja z istim iz drugega fajla, nato izpiše parametre a v novo datoteko (če so seveda parametri b različni v teh dveh datotekah)
Glede kode pa se opravičujem ker sem še noob v programiranju, pa sem to bolj ali manj spocal skup.
#!/usr/bin/perl sub preveri { ($sklop,$a,$b) = @_; open FAJL2, $ARGV[1] or die "$! : $ARGV[1] \n"; while (<FAJL2>) { if (/^\[($sklop)\]/) { $a2 = readline(FAJL2); $b2 = readline(FAJL2); print "$1 $a2 $b2"; if ($b2 ne $b) { open FAJL3, ">>$ARGV[2]"; $a2 =~ s/^.*=//; print FAJL3 "$a2"; close FAJL3; } } } close FAJL2; } if (@ARGV < 3) { die "Uporaba : $0 conf_file true_conf_file nova_datoteka \n" }; open FAJL1, $ARGV[0] or die "$! : $ARGV[0] \n"; while (<FAJL1>) { if (/^\[(.*)\]/) { $para = readline(FAJL1); $parb = readline(FAJL1); &preveri($1,$para,$parb); } # print $_; }
Jean-Paul ::
while read xxx; do IFS='=' read xxx fname; IFS='=' read xxx fsize; FILESIZE=$(stat -c%s "$fname"); if [[ $fsize -ne $FILESIZE ]]; then echo $fname; fi; done < sklop.cfg
atomant ::
Sem pozabil napisat, da bi to uporabil na FreeBSD 7 mašini.
@Jean-Paul: ja to je to ampak opcija -c pri ukazu stat je v FreeBSD neveljavna:
------------
[root@server ~]# stat -c%s datoteka
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
------------
@purgovich: mislim, da si me narobe razumel. Iz datoteke A primerjam parametre z resnično velikostjo in imenom datoteke X za vsaki sklop posebej.
@Jean-Paul: ja to je to ampak opcija -c pri ukazu stat je v FreeBSD neveljavna:
------------
[root@server ~]# stat -c%s datoteka
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
------------
@purgovich: mislim, da si me narobe razumel. Iz datoteke A primerjam parametre z resnično velikostjo in imenom datoteke X za vsaki sklop posebej.
lp,
S
fiction ::
Ekvivalent "stat -c%s datoteka" je na FreeBSD-ju "stat -f%z datoteka".
Se pa da velikost datoteke v bajtih dobiti tudi na kaksen drug (malo daljsi) nacin.
Sicer pa se vedno ne razumem tocno problema.
Recimo ce pise:
in ti dobis v trenutnem direktoriju datoteko datoteka1, ki je velika 200 bajtov hoces
v tej konfiguracijski datoteki spremeniti vrstico, da bo param_b=200?
Se pa da velikost datoteke v bajtih dobiti tudi na kaksen drug (malo daljsi) nacin.
Sicer pa se vedno ne razumem tocno problema.
Recimo ce pise:
[SKLOP_A]
param_a=datoteka1
param_b=100
in ti dobis v trenutnem direktoriju datoteko datoteka1, ki je velika 200 bajtov hoces
v tej konfiguracijski datoteki spremeniti vrstico, da bo param_b=200?
atomant ::
Ekvivalent "stat -c%s datoteka" je na FreeBSD-ju "stat -f%z datoteka".
Se pa da velikost datoteke v bajtih dobiti tudi na kaksen drug (malo daljsi) nacin.
Sicer pa se vedno ne razumem tocno problema.
Recimo ce pise:
[SKLOP_A]
param_a=datoteka1
param_b=100
in ti dobis v trenutnem direktoriju datoteko datoteka1, ki je velika 200 bajtov hoces
v tej konfiguracijski datoteki spremeniti vrstico, da bo param_b=200?
Hvala za stat.
Ne, jaz hočem, da se v tem primeru samo ime datoteke (datoteka1) vpiše v novo datoteko.log
lp,
S
Zgodovina sprememb…
- spremenil: atomant ()
snow ::
Dajte v naslov bolj pameten naslov. Naslov problema.
Vse teme v tem oddelku so v zvezi s programiranjem ;)
Vse teme v tem oddelku so v zvezi s programiranjem ;)
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c] Enaki datotekiOddelek: Programiranje | 1026 (886) | Spura |
» | [C++][Naloga] Tekstovne datoteke, realna številaOddelek: Programiranje | 4004 (3620) | Gundolf |
» | Unix ukazOddelek: Operacijski sistemi | 1073 (1004) | iNN |
» | c# vprasanjeOddelek: Programiranje | 1840 (1519) | user4683 |
⊘ | eMULE in nje problemiOddelek: Programska oprema | 1741 (1222) | Gandalfar |