Schrift
[thread]11165[/thread]

Shell-Error durchs benutzen von `` (Seite 2)



<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
renee
 2008-01-23 13:36
#105046 #105046
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
aus
Code: (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
50: my @diff = <TMP>;
51:
52: sub calcdiff {
53: my $old = shift;
54: my $new = shift;
55: if ($new > $old) {
56: my $ergebniss_1 = ($new - $old);
57: return($ergebniss_1);
58: }
59: elsif ($old > $new) {
60: my $ergebniss_2 = ($old - $new);
61: return ($ergebniss_2);
62: }
63: }
64:
65: my @order;
66: while( my $line = @diff ){
67: if ( $line =~ m/^(.+):\s+\/.+:$/) {
68: push @order, [$1."\n"];
69: }
70: elsif ( $line =~ m/(^\d+)\s+(.+)\s+(.)\s+(\d+)\s+(.+)\s+$/ ) {
71: if ($3 eq "\|") {
72: push @{ $order[-1] },"\t$2\t$1\t$4\t" . "Diff: " . &calcdiff("$1","$4") . "\n";
73: }
74: elsif ($3 eq "\<") {
75: push @{ $order[-1] }, "\tNew File:\t$5\tSize: $4\n";
76: }
77: elsif ($3 eq "\>") {
78: push @{ $order[-1] },"\tFile deleted:\t$5\n";
79: }
80: }
81: }


mach
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my @order;
while( my $line  = <TMP> ){
   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: " . abs($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";
      }
   }
}
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 13:59
#105049 #105049
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
nu gibts garkeinen output mehr, aber hey, ich komm aus der schleife wieder raus :D
renee
 2008-01-23 14:05
#105051 #105051
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hast Du vielleicht die for-Schleife am Ende des Programms mitgelöscht?
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 14:05
#105052 #105052
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
nein nein, natürlich nicht.. ein bischen nachdenken tu ich schon beim copy & paste *g*
renee
 2008-01-23 14:10
#105054 #105054
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mal mit Data::Dumper angeschaut, was in @order steht (nach der while-Schleife)? Lass Dir mal $line innerhalb der while-Schleife ausgeben und schau Dir's an, ob es korrekt ist...
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/
betterworld
 2008-01-23 23:29
#105080 #105080
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
FlorianL+2008-01-21 14:12:50--
Code (perl): (dl )
chomp(my $prechk = `echo $preday |wc -ck`);


Also das sieht eh nicht so besonders hübsch aus. Und bis man bei so etwas alle möglichen Sonderzeichen in $preday richtig escapet hat, ist auch einige Zeit vergangen. Ferner ist es nicht besonders portabel, ich konnte weder bei GNU noch bei Solaris eine Option -k für wc finden. Daher weiß ich nicht genau, was dieser Befehl tun soll, aber ich nehme mal an, er soll einfach die Zeichen zählen.
Wenn wir nun eh schon Perl statt Shell programmieren, können wir dazu auch einfach length() verwenden. Backticks zu verwenden, um irgendwelche Stringmanipulationen zu machen, ist in so gut wie 100% aller Fälle unnötig, weil Perl das auch kann.

Um mit Datumsangaben zu rechnen: CPAN:Date::Calc, CPAN:Date::Parse et. al.
Um Verzeichnisse auszulesen: perldoc -f opendir, perldoc IO::Dir
Oder rekursiv: CPAN:File::Find
renee
 2008-01-24 09:49
#105081 #105081
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
betterworld+2008-01-23 22:29:29--

[...] Um mit Datumsangaben zu rechnen: CPAN:Date::Calc [...]



Habe ich ja auch schon vorgeschlagen ;-)
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-24 10:14
#105083 #105083
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Ich werd eure Vorschläge auf jeden fall noch beherzigen, im moment ist es halt nur ne fleisarbeit weil ich das fertige script schon in shellscript durch hab aber das durch das nutzen von 3 tmp-files zu viel i7O auf die platte haut... Perl hats eher im Speicher, und da das Bottleneck hier wenn überhaupt die Platten sind wollt ichs umstellen...

wc -ck zählt übrigens die Buchstaben, haste richtig geraten betterworld :) (Ich arbeite übrigens auf IBM AIX)

Ich hab immernoch keinen Output raus, $line gibts nichts mehr aus genauso wie ein print @order...

im @diff ist wie gewünscht die file-liste vorhanden

mal schaun was da falsch läuft... ;)
renee
 2008-01-24 13:04
#105090 #105090
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zeig mal Deinen aktuellen Code...
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-24 13:40
#105096 #105096
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
#!/usr/bin/perl
use strict;
use Data::Dumper;

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 @diff = `sdiff $file $tmpfile \|egrep \[\:\\\<\\\>\\\|\]`;

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: " . abs($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 @$_;
}


Analog dazu mein hässliches, jedoch funktionierendes shell-perl-script :D

Code: (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#Lokation der CheckSize Files
FILESPATH="/home/re17830/chksize/checksize_db/"

if [ ! -d "$FILESPATH" ] ; then
mkdir $FILESPATH
fi

# Commandline Options definieren
if [[ $# -eq 0 ]];then
print "No Arguments given!\n\nUsage: ckecksize <path> <day>"
exit
fi

MOUNTPT=$1
DAY=$2

# Datum definieren
MONTH=`date +%m`
PREMONTH=$(($MONTH -1))
if [ $MONTH -eq 01 ] ; then
PREMONTH=12
fi
YEAR=`date +%y`
PREYEAR=$(($YEAR -1))

# Dateinamen deklarieren
FILE=$FILESPATH\SizeCheck-$YEAR-$MONTH-$DAY.dat

# Bei einer abfrage auf einen Tag wird im Fall das im Aktuellen Monat nichts gefunden wird,
# mit dem Tag des vor-Monats verglichen. (Umgeht das Problem beim Monatswechsel)
if [ ! -f "$FILE" ] ; then
FILE=$FILESPATH\SizeCheck-$YEAR-$PREMONTH-$DAY.dat
if [ ! -f "$FILESPATH\SizeCheck-$YEAR-$PREMONTH-$DAY.dat" ] ; then
if [ ! -f "$FILESPATH\SizeCheck-$PREYEAR-$PREMONTH-$DAY.dat" ] ; then
echo "No Status file found for day $DAY\n"
exit
fi
fi
fi

# Temp-Files anlegen und deklarieren zum re-generieren der Files
cat $FILE |grep -p "^$MOUNTPT" > /tmp/sizecheck.tmp

TMPFILE="/tmp/sizecheck2.tmp"
ls -Rlgo $MOUNTPT > $TMPFILE
# Dieser Perl-Einzeiler gleicht den Output des Temp-Files an den des Status-Files an.
perl -e 'open(FILE, "<'$TMPFILE'"); my @fslist = <FILE>; close(FILE); open(REWRITE, ">'$TMPFILE'"); print REWRITE "'$MOUNTPT':\n"; foreach(@fslist) { cho
mp(); @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 REWR
ITE "$line[2]\t\t$line[6]\n" } }'

# Der veränderte Output wird in ein Temp-File geschrieben
TMPFILE2=/tmp/sizecheck3.tmp
cat $FILE |grep -p "^$MOUNTPT" > $TMPFILE2

# Vergleich der Files
sdiff $TMPFILE $TMPFILE2 |egrep [:\<\>\|] > /tmp/sizecheck4.tmp

perl -e '
use strict;

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;

open(INFILE, "/tmp/sizecheck4.tmp");
while( my $line = <INFILE> ){
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 @$_;
}

# Aufräumen der Temporären Files
rm /tmp/sizecheck*
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



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