山本ワールド
PerlでIntelサイトよりCPUIDを得る
ダウンロードURL
自作プログラムでCPUの種別・機能を判定したいので手始めにCPUID等をintelのsSpec Numberよりホームページから得るプログラムを作った。
          玄箱標準状態のMonta Vista Linuxでテストした。
ダウンロードURL
http://processorfinder.intel.com/details.aspx?sspec=sSpec Number
 上記の赤部分をSpec Number(たとえば Pentium 4 550J ならsl833)変えれば取得できる。
          なお、ページの文字コードはutf-8なので注意。
プログラムの概要
- まず、wgetコマンドでホームページをダウンロードしカレントディレクトリへ保存する。
- その読み込んだホームページをds.plにリダイレクトし標準出力へCPUID等を出力する。
- 1~3.の手順をds.shというファイルに記述する。
- bash ss.sh スペックナンバー spec.txt で1個のsSpecに対するCPUID等をspec.txtに保存できる。
- sSpecの一覧表をintelの製品情報やサポート等から取得し 4の記述をaa.shに記述する。
- 漢字コードをUtf-8からShft-Jisに変換する。
 nkf -Lw -W -s spec.txt > sj.txt
sl1833とsl684を取得する場合の、プログラムの階層は下記のような感じ bash aa.shを実行する
aa.sh | + bash ds.sh sl833 spec.txt | |+------------------- wget -O $1.htm http://processorfinder.intel.com/details.aspx?sspec=$1 | perl ss.pl < $1.htm >> $2 | + bash ds.sh sl684 spec.txt
all.sh
ほしいCPUの数だけ下記の行を繰り返して記述。
          bash ss.sh sSpec Number spec.txt
ss.sh
1個のCPUのみの情報がほしい場合はss.shを実行すればよい。
          wget -O $1.htm http://processorfinder.intel.com/details.aspx?sspec=$1
          perl ss.pl < $1.htm >> $2
ss.pl
はじめた書いたPerlプログラムなのでかなり無駄が多いような気がする。
#! /usr/local/bin/perl
# インテルのページよりCPUスペックを抽出する
$t = 0;
$p = 0;
$tn=0;
$sn=0;
$pn=0;
while(<STDIN>){
        if($t == 1){
                if(/^.*>/){
                        $t=0;
                        s/^.*>//g;
                }
        }
        if(/<span id="ctl00_PSFContentPlaceholder_lblProcessorName" class="pageheader" style="display:inline-block;">/){
                $p=1;
        }
        s/<.*?>//g;               # 1行に収まっているタグを消す
        if(/<.*$/){          # <が見つかった場合、行の最後まで消す
                $t=1;
        }else{
                s/How Do I Use This Tool\?//g;
                s/http:.*$//g;
                if(/Home > Processor Spec Finder Home > sSpec Details/){
                        s/Home > Processor Spec Finder Home > sSpec Details//g;
                }
                if(/Processor Specifications:/){
                        $p=2;
                        s/Processor Specifications://g;
                }
                if(/Package Type:/){
                        $p=3;
                }
                if(/Product Order Codes:/){
                        $p=4;
                        s/Product Order Codes://g;
                }
                if(/Supported Features:/){
                        $p=5;
                        s/Supported Features://g;
                }
                if(/Notes:/){
                        $p=0;
                        s/Notes://g;
                }
                if($p >= 1){
                        s/^\s*//g;
                        $nn=$_;
                        if($nn ne ""){
                                if($p == 1){
                                        s/\r\n//g;
                                        $cpu_name=$_;
                                        $p=0;
                                }
                                if(2<=$p && $p <=4){
                                        if(/:/){
                                                s/://g;
                                                s/\r\n//g;
                                                $titles[$tn++]=$_;
                                        }else{
                                                s/\r\n//g;
                                                $ss[$sn++]=$_;
                                        }
                                }
                                if(5==$p){
                                        s/\r\n//g;
                                        if($_ =~  /\D/){
                                                $pp[$pn++]=$_;
                                        }
                                }
                        }
                }
                
        }
}
$n=0;
if($1 eq "-l"){
        print "CPU,$cpu_name\n";
        while($n < $tn && $n < $sn){
                print "$titles[$n],$ss[$n]\n";
                ++$n;
        }
        foreach $tt (@pp){
                print "Supported Features,$tt\n";
        }
}else{
        print "\"$cpu_name\",";
        while($n < $tn && $n < $sn){
                print "\"$ss[$n]\",";
                ++$n;
        }
        foreach $tt (@pp){
                print "\"$tt\",";
        }
        print "\n";
}
          
      Copyright (C) 2012 山本ワールド All Rights Reserved.
    
    
  