ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

PerlコミュのMRTGから数値を抜き出す。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。
こんばんわ。

現在、MRTGから数値を抜き出すスクリプトをperlでつくろうとしています。
最終的には、
複数のhtmlファイルから、
必要な数値だけを抜きだしたいと考えています。

sample.html、sample1.html、sample2.html、sample3.html、・・・・・・
---------------------------------------------------------------
<html>
<head>
<title>sample</title>

</head>
<body>

wwwwwwwwwwwwwwwwwwwwwwww
xxxxxxxxxxxxxxxxx
dddddddddddddddddddddd
aaaaaaaaaaaaaa11ddd0.8dddd
vvvvvvvvvvvvvv222ssss0.9ss
vvvvvvvvvvvvvv333ssss0.9ss
vvvvvvvvvvvvvv44ssss0.9ss
vvvvvvvvvvvvvv66ssss0.9ss

</body>
</html>
----------------------------------------------------

上記ファイルの2行の整数の数値だけをぬきだしたい。
11 222

aaaaaaaaaaaaaa11ddd0.8dddd
vvvvvvvvvvvvvv222ssss0.9ss

ここの2行から抜き出したい。

それを複数のファイルに適応したい。

最終的には、下記のような結果が欲しい。。。

11 222 11 222 11 222 11 222 ・・・・・・

一応、
作ってみたのですが、
まだまだ、
途中で、
手詰まりになってきました。

#!/usr/bin/perl
open(IN,"$ARGV[0]");
while ($c = getc(IN)) {
if(index("1234567890", $c)>=0){
print $c;
}
}
print "\n";
close(IN);

どうぞよろしくお願いします。

コメント(18)

抜き出したい数値の規則がよくわからないんですけど。
1か2の連続したもの?

> aaaaaaaaaaaaaa11ddd0.8dddd
> vvvvvvvvvvvvvv222ssss0.9ss
>↑
>ここの2行から抜き出したい。

これを抜き出す対象としていて


>それを複数のファイルに適応したい。
適用はできるだろうけど適応は無理じゃないかな。

> vvvvvvvvvvvvvv333ssss0.9ss
> vvvvvvvvvvvvvv44ssss0.9ss
> vvvvvvvvvvvvvv66ssss0.9ss

こっちが対象外になるのはなぜですか?

>black ほげむた

イメージとしては、
2行を抜き出してから、
数値を抜き出そうと思っています。

行を抜き出した後なら、さぁやさんの書いているとおり
正規表現でとれます。
0.8の方は拾いたくないと読めましたのでそうすると
m/(\d\d+)/
あたりでどうでしょう。

配列で受けてもいいし、$1をみてもいいです。
その表現だと、数字が一桁の場合は逃してしまうのでは?
/(\d+)/でいい気がします。
(最近Perlかまってないので\dが「.」含むのか忘れてしまった)
もしくは/([0-9]+)/とか
勝手に一桁はないものと仮定しました。
\dに.は含まれません。
@s = split(m/\d\d+/,$a);

だと、


> vvvvvvvvvvvvvv333ssss0.9ss
vvvvvvvvvvvvvv  ssss0.9ss

必要な部分が消えてしまいます。
どうしたら、
出力できるのでしょうか。
splitしてるのだからそりゃあ当然。
単にマッチングすればいいだけですよ?
while ( <IN> ){
$_ =~m/(\d\d+)/;
push( @s, $+ )
}
みたいな感じでどうよ?
すみません。
関数がでてきません。

splitではなくて、
マッチング???する。
関数ってないですか。

マッチした文字列(数値)を抜き出す。

splitと、
真逆です。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.htmlの
「マッチしたものを取り出す」あたりを読むと幸せになれるかもしれません。
htmlから抜き出す必然性はあるのでしょうか?最近のMRTGであればすべて RRD ファイルに元データーが格納されてるはずですから、そちらから直接拾うというのはどうでしょう。それであればRRDTool::OO等で簡単に習得できるとおもいますよ。

出なければ素直にマルチラインで両方一気に拾う。
# File::SlurpよりPerl6::Slurpのがいいんだけど、インストールしてない可能性を考慮。
#正規表現の細かい動作はマニュアル読んでね
#!/usr/bin/env perl

use File::Slurp qw( slurp ) ;
foreach my $file ( @ARGV ){

my $lines = slurp($file);
if ( $lines =~ m/a+ ( \d* ) d [^\n]* \n ^v+ ( \d* ) s /xms ){
printf( qq{%d %d\n}, $1, $2);

}
}
元のファイルを持っていないんです。
ブラウザに出力されている情報が、
すべてです。

ブラウザに出力されているhtmlを取得して、
そこから、数値を抜き出しているんです。

じつは。。。

正規のものではないんです。^^;
ごもっともです。^^;

みなさん、
ありがとうございます。
なかなか書き込みができなくて、
申し訳ありません。

スクリプトをうまく使って、
できました。

sedコマンドで、
行数を指定して、
抜き出します。

vvvvvvvvvvvvvv222ssss0.9ss

cutコマンドを使って、
vvvvvvvvvvvvvv222
などを抜き出して、
そこから、
上述した、
perlで処理をさせて、
数値だけを抜き出しました。

みなさんの数値の抜き出し方でもいいと思うし、
やりかたはさまざまだと思いました。

いろいろ教えてくれてありがとうございます。



ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Perl 更新情報

Perlのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング