• ベストアンサー

検索するプログラミング

社内でIPアドレスの管理をしているのですが、使っていないIPアドレスを ログから検索したいのですが、プログラムを書くのが苦手なためよろしければ教えてください。ログは以下のようにとっています MACアドレス cc 00000034 001 03 E Y 0274 R 2 N IPアドレス Sat Jul 20 17:11:53 2002 ここから3ヶ月間ログに表示されていないIPアドレスを調べて、使っていない IPアドレスを特定したいと思っています。

  • picca
  • お礼率5% (5/90)
  • Perl
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

補足を読みました。多分こんな感じでよいかと思います。 # 未使用IPチェックスクリプト use Time::Local; my $ptnDate = '(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)'; # ※A my %chkIP; # 使用されているIPを拾う my @files = glob("ログディレクトリのパス/*.log"); while (@files) {   next unless /$ptnDate\.log$/;   my $tm = timelocal($6,$5,$4,$3,$2-1,$1-1900);  # ※A   next if $tm < time() - 90*24*60*60;       # 90日より前なら見ない   open LOG, "$_" or die $!;   while (<LOG>) {     my $ip = (split /\x20/)[11];   # \x20 はスペースのコード     $chkIP{$ip} = 1;         # 見つけたIPをチェック   }   close LOG; } # 未使用のIPを探す my %notUsed; open HOSTS, "HOSTSファイルのパス" or die $!; while (<HOSTS>) {   next unless /^(\d+\.\d+\.\d+\.\d+)/;  # ※B   $notUsed{$1} = 1 unless $chkIP{$1}; } close HOSTS; # 未使用のIPを出力する open OUT, ">not_used_ip.log" or die $!; print OUT "$_\n" for sort keys %notUsed; close OUT; ※A.日時.log の「日時」のフォーマットにより変わります。分からなければ、日時部分の詳細をお知らせください。 ※B.HOSTSファイル内のIPって、1行1つで行頭に書いてあります?

picca
質問者

補足

回答ありがとうございます。ログの形式は以下のように一日4回とっています。 020711-10.log 020711-12.log 020711-15.log 020711-17.log HOSTSファイルのIPは一行一つで行頭に書いてあります。 よろしくお願いいたします。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

すみません、遅くなりました。 > 020711-10.log 020711-12.log 020711-15.log 020711-17.log については、※Aの部分を次のようにして下さい。 my $ptnDate = '(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)';     ↓ my $ptnDate = '(\d\d)(\d\d)(\d\d)\-(\d\d)';   my $tm = timelocal($6,$5,$4,$3,$2-1,$1-1900);     ↓   my $tm = timelocal(0,0,$4,$3,$2-1,$1+100); > HOSTSファイルのIPは一行一つで行頭に書いてあります。 ということですので、※Bの部分はそのままでOKです。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

まず、ログから発見したIPをチェックするのに、ハッシュ変数を1つ用意しましょう。 IPをキーにして、値は適当に1でも入れることにします。 while を使ってログを1行ずつ読み込みます。 ログデータは半角空白区切りなので split関数で空白区切りに分割し、IPは(0から数えて)11番目なので、11番目のデータを取り出します。 取り出したIPをハッシュのキーにして、値に1をセットします。 これをファイルの終わりまで(while が終了するまで)繰り返します。 「keys ハッシュ変数」とすると使用されたIPの一覧が得られますので、IPの全集合からこれを引けば、使われていないIPが求まる、という感じです。 プログラムが苦手とのことなので、上記だけでは少し難しいでしょう。 下記の内容もお知らせ頂ければ、もう少し具体的に書けると思います。 ・ログは1つなのか複数なのか。 ・また複数ならどのような命名規則になっているのか。 ・IPの全集合はどのようになっているのか。 必要であれば補足ください。

picca
質問者

補足

>・ログは1つなのか複数なのか ログは複数あります。一日に4回とるように設定しています >・また複数ならどのような命名規則になっているのか。 日時.logという形式です >IPの全集合はどのようになっているのか. サーバのHOSTSファイルに全て記述してあります よろしくお願いいたします。

関連するQ&A

  • 正規表現

    2004-12-08[Tab]19:20:20[Tab]192.168.1.323[Tab]1[Tab] 上記のように書かれたログがあり、このログ数を数えたいのですが、IPアドレスが表示されているところがうまくいきません。IPアドレスは長さが違うものや、社内からすると、アドレスではない文字列の場合もあります。 何かよい方法はないでしょうか?? $fp_r = popen('grep -c \''.$log_r[$i]['logdate'].'[[:space:]][0-9][0-9]:[0-9][0-9]:[0-9][0-9][[:space:]][0-9].[0-9].[0-9].[0-9][[:space:]]1[[:space:]]\' '.$fileName,"r");

    • ベストアンサー
    • PHP
  • MACアドレス既知の同セグメント内のIP検索方法

    社内ネットで使用している無線LANルーターのIPアドレスがわからず困っております。 その無線LANルーターを通した無線でのアクセスで、社内ネットに アクセス可能であることから、自局と同一セグメント内(/24)にあると推察できます。 MACアドレスは機器登録リストを社内で作成していたので分かっています。 セグメント内を0~255までpingスキャンしてみたのですが、 arp -aでそのMACアドレスがでてきません。ICMPブロックされていても arpで見ると出てくると思ったのですが…もしかしてセグメントが違うのか? だとしたらなぜアクセスできるのか… 上記のような状態で、MACアドレスからIPアドレスを割り出す方法がありましたら 教えて下さい。

  • 検索するプログラム

    以前も同じ内容で質問させて頂いたのですが、うまくいきません。 原因はHOSTSファイルにかかれているIPアドレスの表示が XXX.XXX.1.1 となっているのですが、ログのほうは XXX.XXX.001.001となっているのでこれが原因だと思われます。 よろしくお願いいたします。 ここから以前の質問 社内でIPアドレスの管理をしているのですが、使っていないIPアドレスを ログから検索したいのです.IPアドレスはログの11番目のフィールドに書かれて おりIPの全集合はサーバのHOSTSファイルに全て記述してあります そのとき回答されたプログラム #!/usr/local/bin/perl # 未使用IPチェックスクリプト use Time::Local; my $ptnDate = '(\d\d)(\d\d)(\d\d)\-(\d\d)';  my %chkIP; # 使用されているIPを拾う my @files = glob("ログのパス"); while (@files) {   next unless /$ptnDate\.log$/;   my $tm = timelocal(0,0,$4,$3,$2-1,$1+100);   next if $tm < time() - 90*24*60*60;       # 90日より前なら見ない   open LOG, "$_" or die $!;   while (<LOG>) {     my $ip = (split /\x20/)[11];   # \x20 はスペースのコード     $chkIP{$ip} = 1;         # 見つけたIPをチェック   }   close LOG; } # 未使用のIPを探す my %notUsed; open HOSTS, "HOSTSのパス" or die $!; while (<HOSTS>) {   next unless /^(\d+\.\d+\.\d+\.\d+)/;     $notUsed{$1} = 1 unless $chkIP{$1}; } close HOSTS; # 未使用のIPを出力する open OUT, ">not_used_ip.log" or die $!; print OUT "$_\n" for sort keys %notUsed; close OUT;

    • ベストアンサー
    • Perl
  • プログラミング(c言語)

    以下のプログラムでオイラー法を用いた2階微分方程式を解きたいのですが、xとvyの値が変化しません。どこが間違っているのか教えて欲しいです 写真は問題文です #define _USE_MATH_DEFINES #include<stdio.h> #include<math.h> int main(){ int i; double x,x0,y,y0,vx,vx0,vy,vy0,r,dt,t=0.0; double G=6.674/pow(10.0,11.0),M=1.988*pow(10.0,30.0); x0=1.496*pow(10.0,11.0),y0=0.0,vx0=0.0,vy0=2.978*pow(10.0,4.0); dt=M_PI/100; for(i=1;i<=2000;i++){ x=x0+dt*vx0; y=y0+dt*vy0; r=sqrt(x0*x0+y0*y0); vx=vx0-dt*(G*M*x0/(r*r*r));vy=vy0-dt*(G*M*y0/(r*r*r)); t=dt*i; printf("x(%f)=%e y(%f)=%e vx(%f)=%e vy(%f)=%e\n",t,x,t,y,t,vx,t,vy); x0=x; y0=y; vx0=vx; vy0=vy; } return(0); }

  • 級数の計算

    例えば r=1.1のとき A(1)=3 A(2)=3*4.1=3*(3+1.1*1) A(3)=3*4.1*5.2=3*(3+1.1)*(3+1.1*2) A(4)=3*4.1*5.2*6.3=3*(3+1.1)*(3+1.1*2)*(3+1.1*3) A(n) = A(n)*(A(n)+r*(n-1)) 合っているかな? において A(n) = p となるrを計算したい。実際に使用するnは3から5程度なので個別のnで計算(プログラム)しても良い。 高校数学程度なのでしょうが、もう頭が回らなくなっているので教えて下さい。 自分の考えたところは n=4のとき、s=A(1)、y=A(4)として p = s*(s+r)*(s+2r)*(s+3r) 両辺の対数をとって log(p) = log(s)+log(s+r)+log(s+2r)+log(s+3r) としたとき、log(s+r) をlog(r)の式で表現できれば良いのでしょうが、これで躓いています。

  • FORTRANのプログラミングについて

    たびたび申し訳ありません。 またFORTRANに関しての質問です。 x y z 0 0 30 1 0 45 2 0 60 3 0 43 4 0 51 5 0 32 0 1 43 1 1 90 2 1 32 3 1 85 4 1 65 5 1 90 0 2 32 1 2 32 と続くファイルがあります。これをFORTRANをで書き換えて、 0 0 30 0 1 43 0 2 32 1 0 45 1 1 90 1 2 32 と続くデータにしたいのです。(これを以下目的のファイルという) 今のところ、次のようなプログラムを書き、特定のXに対しては、結果を吐き出すことに成功しています。 program dat real x1(100),h,y2(100),y1(100),z1(100) integer i,n,j,k,l,m,a(100) open(7,file='test.txt') open(9,file='af-test.dat') do i=1,100 read(7,*,end=200) x1(i),y1(i),z1(i) if(x1(i).eq.90)then write(9,*) x1(i),y1(i),z1(i) end if end do 200 close(7) close(9) end ここまではうまくいくのですが、これでは90以外の場合は出力されません。(あたりまえですが) 特定のXに限らずに例えばXを0から100まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。

  • ネットワークプログラミングについて

    過去ログを検索してみて質問:socの秀和システム出版の「Javaネットワークプログラミング」に載っているクライアント・サーバ型のチャットプログラムについての質問がありました。 私も同じ本で学習しているのですが、過去ログの方の例では1台で実行した場合、2台でネットワーク経由で実行した場合両方とも成功していました。 このプログラムをコンパイルして実行してみてもサーバーに接続できませんと出ます。このプログラムを実行するにはどのような環境、コマンド等が必要でしょうか? 私が試している環境はJ2SDKでWindowXP一台でコマンドプロンプトでchatsv.javaとchatcl.java(アプレット)の両方をコンパイルし、chatsvを実行。chatclはHTMLファイルを作り、それを実行するとIPアドレスを指定画面が出るので指定します。通信はSocket通信です。WindowsのIPアドレス(自分)にはpingもしっかり通っています。 あと2台でネットワークを介した起動では、クライアントには上記のWindowsを、fedora core3を使ってサーバープログラムを起動。こちらも同様にchatsvを実行し、apacheにchatcl.htmlを組み込んでいます。windos側、fedora側から実行しても接続できません。こちらもwindowsからIPアドレスを直接指定するとチャットアプレットは見ることはできますし、pingも通ります。 長くなってしまいましたが、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Euclid空間が単連結であることについて

    基本群について質問です. n次元Euclid空間R^nが単連結であることを示したいのですが,そのためには (i)R^nが弧状連結 (ii)基本群Π(R^n)={e} を示せばいいのですよね. (i)はほぼ明らかなのでいいのですが, (ii)がちょっとよくわかりません. これを示すためにまず,以下の命題を示しました. X,Y:位相空間で,x∈X, y∈Yとする.kのとき, Π(X×Y,(x,y))≒Π(X,x)×Π(Y,y) (≒は同型を意味) これを用いると Π(R^n)=Π(R×R×…×R)≒Π(R)×Π(R)×…×Π(R) が成り立ちます. 一方,x∈Rを固定したとき,xを基点とするR上の曲線は 全てこの一点にホモトピックであることから, Π(R)={e} よって, Π(R^n)≒{e}×{e}×…{e}={e} となったのですが,これはΠ(R^n)が単位群と"同型"なのであって, Π(R^n)={e}ではないですよね? 示したい(ii)はΠ(R^n)={e}だと思うのですが,どこがおかしかったのでしょうか? ご教授お願いしいたします.

  • 物理アドレス(MACアドレス)について。

    パソコンをあんまり詳しくないので、変な質問かもしれませんが、 教えてください。 IPアドレスをログに取ることは可能ですが、MACアドレスを取ること は可能ですか? また、MACアドレスを取ることが可能なら、MACアドレスは固有のもの ではあるけど、その取られる情報を変えることは可能のですか?それ は一体どうすればいいのか、教えてください。

  • IPアドレスとMacアドレスについて

    IPアドレスとMacアドレスから個人を特定されています。 こちらを変更したいのですが、IPアドレスの変更はプロバイダーを変更するしかないでしょうか?また、IPアドレスを変更しても、同じパソコンを使用していたら特定されるのでしょうか?Macアドレスの変更はパソコンを変更するしかないでしょうか?