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 | 1150 (1010) | Spura | 
| » | [C++][Naloga] Tekstovne datoteke, realna številaOddelek: Programiranje | 4197 (3813) | Gundolf | 
| » | Unix ukazOddelek: Operacijski sistemi | 1166 (1097) | iNN | 
| » | c# vprasanjeOddelek: Programiranje | 1961 (1640) | user4683 | 
| ⊘ | eMULE in nje problemiOddelek: Programska oprema | 1859 (1340) | Gandalfar |