Schrift
[thread]9036[/thread]

df auslesen, regexp problem

Leser: 1


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
FlorianL
 2007-05-25 14:41
#76931 #76931
User since
2007-05-18
142 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen, ich will mit einem script die Used%-Zeile aus dem df command auslesen und bekomme das regexp überhaupt nich auf die kette ;)

Code: (dl )
1
2
3
4
@df_output=`df`;
@df_output=~ /\[0-100]\%/;

print @df_output;


der output sieht auf dem system folgendermassen aus:

Quote
xadmp02> df
Filesystem MB blocks Free %Used Iused %Iused Mounted on
/dev/hd4 576.00 542.78 6% 3881 4% /
/dev/hd2 2368.00 480.38 80% 39109 26% /usr
/dev/hd9var 768.00 339.07 56% 1478 2% /var
/dev/hd3 1024.00 1022.37 1% 101 1% /tmp
/dev/hd1 256.00 47.15 82% 6539 36% /home
/proc - - - - - /proc
/dev/hd10opt 640.00 139.88 79% 13216 29% /opt
/dev/lvlocal01 896.00 269.61 70% 33708 35% /usr/local
/dev/lvaudit01 64.00 62.14 3% 14 1% /audit
/dev/lvtftpboot 448.00 381.43 15% 19 1% /tftpboot
/dev/lvsysback 126656.00 24803.56 81% 601 1% /sysback
/dev/lvnim 50560.00 19208.38 63% 54958 2% /export/nim
/dev/lvswdcustomize 15744.00 4461.27 72% 5389 1% /swd_customize
/dev/lvorasw 12160.00 7034.91 43% 9153 1% /ora/soft


wie man sieht werde ich mit meinem (sowieso nicht funktionierenden) script auch das problem bekommen das es mehrere zeilen gibt in dennen ein % vorkommt.

der gewünschte Output soll dann so aussehen:

Quote
Filesystem Used%
/dev/hd4 4%
/dev/hd2 26%
/dev/hd9var 2%
/dev/hd3 1%
/dev/hd1 36%
/dev/hd10opt 29%
dev/lvlocal01 35%
/dev/lvaudit01 1%
/dev/lvtftpboot 1%
/dev/lvsysback 1%
/dev/lvnim 2%
/dev/lvswdcustomize 1%
/dev/lvorasw 1%


Kann ich die einzelnen zeilen nich auch irgendwie splitten? dann würde mir die weitere bearbeitung der lines jedenfalls einfacher fallen, aber über ein gut funzendes regexp würd ich mich natürlich genauso freuen :)

Ansonsten schönes Wochenende noch! :)
pq
 2007-05-25 15:16
#76932 #76932
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
versuch doch mal CPAN:Tie::DiskUsage oder CPAN:Sys::Statistics::Linux
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Linuxer
 2007-05-25 15:35
#76933 #76933
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Wenn es mit df sein soll:

Wofür einen RegEx damit belasten? split reicht da aus:

Code: (dl )
1
2
3
4
5
6
7
@result = `df`;
for my $line ( @result ) {
# Array Index gemaess df-Ausgaben bestimmen
my ( $what, $percent ) = ( split(/\s+/, $line ) )[0,3];

print "$what $percent", $/;
}
\n\n

<!--EDIT|Linuxer|1180093399-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
sid burn
 2007-05-25 16:31
#76934 #76934
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Das geht aber auch kürzer. ;)

Code: (dl )
1
2
$,=' ';
print((split)[0,4],"\n") for qx|df|;
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Linuxer
 2007-05-25 16:53
#76935 #76935
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
kürzer ist nicht immer gleich besser ;)

In einem Einzeiler würde ich es machen wie Du, in einem Skript allerdings würde ich meine Variante (wenn auch etwas modifiziert) verwenden.\n\n

<!--EDIT|Linuxer|1180097701-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
bloonix
 2007-05-25 18:55
#76936 #76936
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
aber die regex oder split passt nicht mehr, wenn der diskname so lang ist,
dass die diskgroessen in die nächste zeile geschrieben werden etc.

Code: (dl )
1
2
3
4
5
6
7
8
use strict;
use warnings;
use Sys::Statistics::Linux;
my $lxs  = Sys::Statistics::Linux->new(DiskUsage => 1);
my $stat = $lxs->get->{DiskUsage};

print sprintf('%-40s ', $_), $stat->{$_}->{usageper}, "%\n"
  foreach sort keys %$stat;
\n\n

<!--EDIT|opi|1180115142-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
sid burn
 2007-05-25 19:08
#76937 #76937
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
aber die regex oder split passt nicht mehr, wenn der diskname so lang ist, dass die diskgroessen in die nächste zeile geschrieben werden etc.

Häh?

Welchen Disknamen meinst du? /dev/sdaxx ?
Was meinst du mit Diskgroessen in die nächste Zeile?

Das Programm "df" macht einfach nur eine Ausgabe, da gibt es keine Begrenzung der Zeilengrößen.

Das kann jetzt auch 800 Zeichen groß sein, das würde in Perl trotzdem als eine Zeile und String gewertet werden.

Oder ist df so geschrieben worden das es intern automatisch nach 80 Zeichen umbricht?

Quote
kürzer ist nicht immer gleich besser

Sagte ich auch nicht. ;)

Würde auch eher dein beispiel nehmen, allerdiengs ohne Temp Variable da diese unnötig ist, und würde auch qx() nehmen. Den Unterschied zwischen Backticks und einem einzelnen Hochkommata ist nicht immer gut zu erkennen.

Code: (dl )
1
2
3
4
for my $line ( qx|df| ) {
my ( $disk, $usage ) = (split /\s+/, $line)[0,4];
print "$disk $usage\n";
}
\n\n

<!--EDIT|sid burn|1180106062-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2007-05-25 19:11
#76938 #76938
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
#> df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/bloonix-root
                     10321208   2977312   6819608  31% /
/dev/mapper/bloonix-home
                     41284928  30074272   9113504  77% /home
/dev/sda2               241113     16707    211956   8% /boot


Wonach sieht das für dich aus sid? ;)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
sid burn
 2007-05-25 19:28
#76939 #76939
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=opi,25.May.2007, 17:11]
Code: (dl )
1
2
3
4
5
6
7
#> df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/bloonix-root
10321208 2977312 6819608 31% /
/dev/mapper/bloonix-home
41284928 30074272 9113504 77% /home
/dev/sda2 241113 16707 211956 8% /boot


Wonach sieht das für dich aus sid? ;)[/quote]
Sieht für mich nach nem beschie***** Programmiertes 'df' aus. ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2007-05-25 19:44
#76940 #76940
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
ach wo... df dient ja einfach nur zum anzeigen und funzt seit jeher...
aber wer mit lvm arbeitet, weiß, wie lang devicenamen werden können :)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2007-05-25 14:41.