Salut,
Désolé de poster un énième sujet du genre, mais je ne suis vraiment pas à l'aise avec les expressions régulières. J'écris un script qui permet de vérifier qu'un ou plusieurs processus s'exécutent sur une machine unix distante. Voici le début du code :
Pour vous donner une idée, si j'ajoute ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #!/usr/bin/perl -w use strict; use Getopt::Std; my $usage = "Usage: ./ssh_test.pl -H host -p processus_list\n"; my %options; getopt("Hp",\%options); my $H = $options{H}; my $p = $options{p}; unless ($H && $p) { print $usage; exit 1; } my @plist = split(/\|/,$p); my @data = `ssh $H 'ps -e'`;
J'obtiens ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 foreach(@data) { print "$_"; }
Ici, je n'affiche évidemment que les données brutes. J'aimerais conserver les champs 1 (PID) et 4 (nom du processus) pour chacun des processus passés en argument au script. J'ai vu qu'on pouvait utiliser la fonction map de cette façon :PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 ksoftirqd/0
3 ? 00:00:00 events/0
4 ? 00:00:00 khelper
9 ? 00:00:00 kthread
18 ? 00:00:00 kacpid
118 ? 00:00:00 kblockd/0
126 ? 00:00:00 khubd
175 ? 00:00:00 pdflush
176 ? 00:00:02 pdflush
177 ? 00:00:00 kswapd0
178 ? 00:00:00 aio/0
256 ? 00:00:00 kseriod
316 ? 00:00:01 reiserfs/0
376 ? 00:00:00 udevd
978 ? 00:00:00 syslogd
981 ? 00:00:00 klogd
1685 ? 00:00:00 rpc.portmap
1691 ? 00:00:00 inetd
1696 ? 00:00:00 sshd
1709 ? 00:00:00 nfsd
1710 ? 00:00:00 nfsd
1711 ? 00:00:08 nfsd
1712 ? 00:00:00 nfsd
1713 ? 00:00:00 nfsd
1714 ? 00:00:11 nfsd
1715 ? 00:00:06 nfsd
1716 ? 00:00:00 nfsd
1718 ? 00:00:00 lockd
1719 ? 00:00:00 rpciod/0
1720 ? 00:00:01 rpc.mountd
1723 ? 00:00:00 rpc.statd
1737 ? 00:00:00 cupsd
1750 ? 00:00:00 crond
...
Je me proposais donc d'écrire une fonction de traitement des données mais je bloque sur le passage des arguments, dans la mesure ou cette fonction devrait matcher l'itération courante de @data (variable $_) avec une des itérations de @plist. Je ne vois pas comment passer @plist en argument, en fait. En même temps, je me dis que Perl permets sans doute avec une expression régulière bien placée d'effectuer ce traitement en une ligne, ce qui me permettrait d'utiliser la fonction map de façon plus classique (peut-être un map combiné avec un grep ?). Si quelqu'un pouvait me donner une piste, ce serait sympa...
Code : Sélectionner tout - Visualiser dans une fenêtre à part map ( {fonction($_) } @data );![]()
Partager