2010-04-08 8 views
3

J'ai un fichier journal contenant des statistiques de différents serveurs. Je sépare les statistiques de ce fichier journal en utilisant regex seulement. J'essaie de capturer l'utilisation du processeur à partir du processus en cours. Pour SunOS, j'ai ci-dessous sortie:Comment puis-je extraire une valeur de valeurs séparées par des virgules en Perl?

process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java 

Ici, le% CPU est au champ 11 si nous séparons par des virgules (,). Ce champ est signe%, ce qui est unique et je peux utiliser ci-dessous regex Pour obtenir cette valeur:

regex => q/^process,(?:.*?),((?:\d+)\.(?:\d+))%,java$/, 

Pour le système linux je ci-dessous sortie:

process,26190,user1,20,0,1236m,43m,6436,S,0.0,1.1,0:00.00,java, 

Ici, l'utilisation du processeur est à 10 colonne mais sans signe% et il n'y a rien d'unique que je puisse voir avec ce champ.

Quel motif regex dois-je utiliser pour obtenir cette valeur?

+0

@brian: votre édition a complètement changé mes questions. Ce n'est pas aussi simple que d'extraire des valeurs de csv. – Space

+3

Qu'est-ce qui est différent à ce sujet? Dans celui que vous voulez le 11ème champ et l'autre vous voulez le 10ème. Il n'y a rien de plus compliqué à ce sujet à moins que vous ne nous disiez quelque chose. Vous êtes obsédé par la solution regex, qui vous donne le problème XY: http://www.perlmonks.org/index.pl?node_id=542341 –

+0

Cette question est claire. +1 pour contrer downvote – Mike

Répondre

2

Vous devez également reconnaître la ligne, ou extraire uniquement la valeur, c'est-à-dire que vous attendez des lignes non liées? Sinon la réponse est /^(?:[^,]+,){9}([^,]+)/' ceci va extraire le dixième champ de certaines listes séparées par des virgules

+0

Merci gianthare: Je dois aussi reconnaître la ligne, ce que je fais avec^process et java $. – Space

+0

Ensuite, changez-le en '/^processus, (?: [^,] +,) {8} ([^,] +) (?: [^,] +,) * Java $ /' –

+0

hi gianthare: je avez essayé cela mais n'obtenez toujours pas la sortie requise. Toute suggestion s'il vous plaît. – Space

3

Si la ligne est déjà séparée par des virgules, vous pouvez simplement utiliser split sur la chaîne et choisir le champ correct.

par exemple.

my @fields = split(/,/, $input); 
+0

Merci, mais je dois définir une regex pour obtenir la valeur requise comme je l'ai fait pour le processus SunOS. Si j'utilise split, je dois changer mon code complet :(. – Space

+0

Il me semble que vous utilisez la regex, pour choisir les champs de la ligne.Tu ne peux pas changer ça pour utiliser split à la place? Utilisez-vous la regex partout? –

+0

J'essaie d'obtenir d'autres valeurs en utilisant regex seulement et j'en ai fini avec la plupart des choses. donc pour cela, je ne veux pas changer le code complet. J'ai regex partout. – Space

-1

vous ont une structure de données qui a delimiter distinctes, donc ne pas utiliser regex mais il suffit d'utiliser le fractionnement et obtenir votre article par index (ou découpage). C'est plus facile.

$output="process,10050,user1,218,59,0,1271M,1260M,sleep,58.9H,0.02%,java"; 
@s = split /,/,$output; 
print "$s[10]\n"; 

pour linux, juste obtenir $s[9]

-1

Je ne sais rien à propos de Linux, mais simplement ignorer le code si cela semble trop naïf d'esprit :)

/^process.*(?<=[A-Z],)((?:\d+)\.(?:\d+)).*java$/; 
+0

pourquoi downvote? quelqu'un peut-il expliquer? vous pouvez juste ignorer le code si vous pensez qu'il semble trop naïf ou vous pouvez offrir votre meilleure version mais s'il vous plaît expliquer :) – Mike

1

Utilisez Text::CSV_XS pour travailler avec des virgules valeurs séparées. Si vous posez la question, vous ne devriez pas essayer de la gérer vous-même. Le module est extrêmement optimisé et vous ne serez pas capable de faire un meilleur travail par vous-même. Une fois que vous avez extrait la bonne position, vous pouvez enlever le signe% s'il est présent.

+0

Quel avantage ce module a-t-il par rapport à 'split /, /'? –

+0

C'est extrêmement rapide, c'est pourquoi j'ai dit "extrêmement optimisé". Lisez ses documents. Il gère également CSV correctement, ce qui n'est pas le cas. –

+0

@brian, pourquoi les gens recommandent toujours l'utilisation de tel ou tel module? Ce ne sera pas une exagération? Cela ne semble-t-il pas étranger à la question? Pour la question de l'OP, si la division est autorisée (l'OP a spécifié qu'il voulait le modèle regex), une sorte de doublure comme "((split /,/$ input) [10])" est suffisante. – Mike

Questions connexes