Schrift
[thread]11165[/thread]

Shell-Error durchs benutzen von ``



<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
FlorianL
 2008-01-21 15:12
#104982 #104982
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

Ich habe ein ksh script gebastelt das den ls-output in eine Datei schreibt und per perl regex den output so abändert wie ich ihn brauche.

Das Script funktioniert zwar, aber ich bin damit nicht zufrieden und wollte es nun mal eben in perl umschreiben:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl
use strict;

my $filespath = "/home/re17830/chksize/checksize_db";

my $date = `date +%y-%m-%d`;
my $day = `date +%d`;
my $predaycheck = $date--;
my $preday = $day--;
my $month = `date +%m`;
my $premonth = $month--;

if ($month == 01) {
        $premonth = "12";
}

chomp(my $prechk = `echo $preday |wc -ck`);

if ($prechk == 2) {
        $preday = "0$predaycheck";
}

my $pre_date = "`date +%y-%m`-$preday";

my $newfile = "$filespath/SizeCheck-$date\.dat";
my $oldfile = "$filespath/SizeCheck-$pre_date\.dat";

my @filesystem = `ls -Rlgo /`;

open(REWRITE, ">$newfile");

foreach(@filesystem) {
        chomp();
        my @line = split(/ +/);
        if ($line[0] =~ m/^\//g) {
                print REWRITE "\n$line[0]\n";
        } elsif (($line[0] =~ m/^dr/g) || ($line[0] =~ m/^-r/g)) {
                print REWRITE "$line[2]\t\t$line[6]\n";
        } else { next; }
}

if ($day == 28) {
        `rm $filespath/SizeCheck-*-\$premonth\-*`;
}


Problem 1:

Die Datei wird nicht richtig benannt, Output file (REWRITE) hat den namen "SizeCheck-7.dat" statt "SizeCheck-08-01-21.dat"

Ich schätze das bekomm ich noch hin, aber das andere Problem ist seltsam...

Problem 2:

Beim ausführen bekomme ich folgende Fehlermeldung:
Quote
xtest11 # perl build_checksize_db.pl
sh[2]: 0403-057 Syntax error at line 2 : `|' is not expected.
xtest11 #


Dabei kann es sich ja nur um diese Zeile handeln:
Code (perl): (dl )
chomp(my $prechk = `echo $preday |wc -ck`);


Jemand dazu ne idee? Vor allem bei Punkt 2 hab ich kein plan?!

Danke & Schönen Tag noch :)
renee
 2008-01-21 15:18
#104985 #104985
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du machst ein $date--

Damit wird aus my $date = "08-01-21"; eine Zahl gemacht (in dem Fall eine 8). Und dann wird 1 abgezogen, also "7"...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2008-01-21 15:22
#104986 #104986
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Ouhhh... wie dämlich....

Ja.. $date-- in $day-- abgeändert (wie es auch gedacht war) und nun funzt es, auch ohne die Meldung in Punkt 2.

Danke... Manchma braucht es halt einfach mehr als 2 Augen um so was offensichtliches zu sehn ;)
renee
 2008-01-21 15:29
#104987 #104987
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde an Deiner Stelle vielleicht Date::Calc einsetzen, das vieles von Dir abnimmt...

Ich habe mir zwar nicht alles angeschaut (und ich konnte es hier nicht testen)...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl

use strict;
use warnings;
use Date::Calc qw(AddDeltaDays AddDeltaYM);

my $filespath = "/home/re17830/chksize/checksize_db";

my ($day,$month,$year)    = (localtime time)[3..5];
my $date                  = sprintf "%02d-%02d-%02d", $year % 100, $month+1, $day;
my ($pyear,$pmonth,$pday) = Add_Delta_Days( $year+1900,$month+1,$day, -1 );
my ($lyear,$lmonth,$lday) = Add_Delta_YM( $year+1900, $month+1, $day, 0, -1 );
my $predate               = sprintf "%02d-%02d-%02d", $pyear % 100, $pmonth, $pday;


chomp(my $prechk = `echo $pday | wc -ck`);

if ($prechk == 2) {
        $preday = "0$predaycheck";
}

my $newfile = "$filespath/SizeCheck-$date\.dat";
my $oldfile = "$filespath/SizeCheck-$predate\.dat";

my @filesystem = `ls -Rlgo /`;

open(REWRITE, ">$newfile");

foreach(@filesystem) {
        chomp();
        my @line = split(/ +/);
        if ($line[0] =~ m/^\//g) {
                print REWRITE "\n$line[0]\n";
        } elsif (($line[0] =~ m/^dr/g) || ($line[0] =~ m/^-r/g)) {
                print REWRITE "$line[2]\t\t$line[6]\n";
        } else { next; }
}

if ($day == 28) {
        `rm $filespath/SizeCheck-*-\$premonth\-*`;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2008-01-21 15:30
#104988 #104988
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was machst Du wenn $day = 1 ist? Dann wäre $preday ja 0.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2008-01-21 16:39
#104990 #104990
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Oh, du hast recht!

In meinem Ursprungs-Script ist der Fall auch vermerkt:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
# Wenn der Tag einstellig ist, muss eine 0 vorangestellt werden.
if [ $(echo $PREDAYCHECK | wc -ck) -eq 2 ] ; then
PREDAY=0$PREDAYCHECK
else
PREDAY=$(($DAY -1))
fi

# Wenn das Script am 1. des Monats ausgeführt wird,
# vergleiche das Filesystem mit dem 28. des vor-Monats.
if [ $DAY -eq 1 ] ; then
PREDAY=28
fi
FlorianL
 2008-01-23 08:13
#105036 #105036
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Ich versteh das nich :(

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
chomp(my $day = $ARGV[1]);

chomp(my $month = `date +%m`);
chomp(my $premonth = $month--);
if ($month == 01) {
$premonth = 12;
}

chomp(my $year = `date +%y`);
print ("year-1: $year\n");
chomp(my $preyear = $year--);
print ("year-2: $year\n");

my $file = "$filespath\SizeCheck-$year\-$month\-$day\.dat";

print ("File: $file\n");


Ausgabe:

Code: (dl )
1
2
3
4
xtest11 # ./checksize.pl /home 11
year-1: 08
year-2: 7
File: /home/re17830/chksize/checksize_db/SizeCheck-7-0-11.dat
renee
 2008-01-23 10:05
#105037 #105037
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zahlen haben keine führende Nullen...

Durch das $year-- wird die führende Null bei "08" entfernt. Deswegen kann man gut sprintf verwenden:

Code (perl): (dl )
1
2
3
4
my $year = "08";
$year--;
print "Test1: $year\n";
print "Test2: ", sprintf( "%02d", %year),"\n";


Ich habe bewusst nicht alles in das sprintf gepackt, um Dir das zu zeigen, was dafür sorgt, dass aus "7" ein "07" wird.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FlorianL
 2008-01-23 12:39
#105041 #105041
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/perl
use strict;

my $filespath = "/home/re17830/chksize/checksize_db/";

if (defined $ARGV[0]) {} else {
                print("Error: No argument\n\nUsage: checksize <path> <day>\n");
                exit 0;
}

chomp(my $mountpt = $ARGV[0]);
chomp(my $day = $ARGV[1]);

chomp(my $month = `date +%m`);
chomp(my $premonth = ($month -1));
if ($month == 01) {
        $premonth = 12;
}

chomp(my $year = `date +%y`);
chomp(my $preyear = ($year - 1));

my $file = "$filespath\SizeCheck-$year\-$month\-$day\.dat";
my $monthfile = "$filespath\SizeCheck-$year\-$premonth\-$day\.dat";
my $yearfile = "$filespath\SizeCheck-$preyear\-$premonth\-$day\.dat";

if (-T "$file") {} else {
        $file = "$monthfile";
}

my @fslist = `ls -Rlgo $mountpt`;

my $tmpfile = "/tmp/SizeCheck.tmp";
open(REWRITE, ">$tmpfile");
print REWRITE "$mountpt\:\n";

foreach(@fslist) {
        chomp();
        my @line = split(/ +/);
        if ($line[0] =~ m/^\//g) {
                print REWRITE "\n$line[0]\n";
        } elsif (($line[0] =~ m/^dr/g) || ($line[0] =~ m/^-r/g)) {
                print REWRITE "$line[2]\t\t$line[6]\n";
        }
}

my $tmp2 = "/tmp/sizecheck.tmp";
system("sdiff $file $tmpfile \|egrep \[\:\\\<\\\>\\\|\] > $tmp2");
open(TMP, "$tmp2");
my @diff = <TMP>;

sub calcdiff {
   my $old = shift;
   my $new = shift;
   if ($new > $old) {
      my $ergebniss_1 = ($new - $old);
      return($ergebniss_1);
   }
   elsif ($old > $new) {
     my $ergebniss_2 = ($old - $new);
     return ($ergebniss_2);
   }
}

my @order;
while( my $line  = @diff ){
   if ( $line =~ m/^(.+):\s+\/.+:$/) {
      push @order, [$1."\n"];
   }
   elsif ( $line =~ m/(^\d+)\s+(.+)\s+(.)\s+(\d+)\s+(.+)\s+$/ ) {
      if ($3 eq "\|") {
         push @{ $order[-1] },"\t$2\t$1\t$4\t" . "Diff: " . &calcdiff("$1","$4") . "\n";
      }
      elsif ($3 eq "\<") {
         push @{ $order[-1] }, "\tNew File:\t$5\tSize: $4\n";
      }
      elsif ($3 eq "\>") {
         push @{ $order[-1] },"\tFile deleted:\t$5\n";
      }
   }
}

for( @order ){
   next if @$_ == 1;
   print $_ for @$_;
}


Wenn ich das Script ausführe kommt er bis zur calcdiff function und dann passiert nix mehr, CPU last geht auf 100%...

und natürlich ma wieder keinen plan was falsch sein könnte.. :(
Gast Gast
 2008-01-23 13:04
#105043 #105043
Hallo,

Quote

Code (perl): (dl )
1
2
3
while( my $line  = @diff ){
 ...
}


Damit hast du eine Endlosschleife gebaut :-(.
Besser wäre mit 'foreach' über jedes Element des Array zu iterieren ...

Grüße
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



View all threads created 2008-01-21 15:12.