質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    16120questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1959questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • Tomcat

    627questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

  • Tera Term

    120questions

    Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

自社HPにアクセスしてきたIPアドレスをログから抽出してホスト名取得

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,016

前提・実現したいこと

自力で今現在プログラムを作っています。
winSCPとtera termを使って、自社のHPのアクセスログを引っ張ってきて、今現在○○.bakという形式のファイルの中にログがずらりと並んでいる状態です。(SAKURAエディタで開いて見れる状態です)

以前は上記2つのソフトウェアをjavaプログラムで動かして…と考えていましたが、そんな時間もないので、純粋にSAKURAエディタで見れるログからIPアドレスを取ってそこからホスト名を取得するプログラムを書こうと考えています。

まずファイル(.bak)を読み込むのでFileメソッドを使って.bakファイルを指定して、そのあとFileReaderメソッドを使って1文字ずつ読み込むコードを書きました。(正しいか否かはわかりません。)

そのあとは繰り返しの処理でIPアドレスだけ抜き取ってSetするらしいです。

書きたいプログラムの流れは以下に記載します。

1.ファイルの先頭から順に読む ←私はFileメソッドを使いました
2.ファイルの1行を読んだらIPアドレスの部分だけ取り出す ←ここからわかりません。
3.IPアドレスを取り出したらSetに入れる

4.繰り返しの外でSetの分だけ回す
5.IPアドレスからDNSを使ってホスト名を取得する
6.取得したホスト名をsysoutする 

回答してくださった、またここを閲覧してくださった方々へ

まず私の質問をご覧いただきありがとうございます。
今回振られた仕事は、新人3か月目としては、ほかの会社では普通ありえないタスクらしいのですが、それを言ってしまっては成長を止めてしまいます。今回はもちろんチャンスだと思い引き受けたのですが、途中で期限が本日中と急きょ決められてしまい、勉強より先に終わらせることが先だと思いteratailを使った次第です。初めての質問でご不快に思われる方もいらっしゃるかもしれません。ご容赦ください。
新人研修が先週終わったばかりでわからないことだらけですが、このサイトを愛用して毎日勉強しています。
何卒よろしくお願いいたします

わからないこと

◆.bakファイルを読み込むのにもっと最適な方法があれば教えてください。
◆Substring以外でIPアドレスを抜き出す方法があれば教えてください。
すべてがすべてXXX.XXX.XXX.XXXの形ではないのでSubstringだとズレが起きるのではと懸念しています。
◆eclipseを使用しているのですが、上記の流れのプログラムって一つのjavaファイルに収まるのでしょうか?分けるとしたらどこをどう分ければよいのでしょうか。

補足情報(言語/FW/ツール等のバージョンなど)

使用言語:Java
開発環境:eclipse、Tomcat8

ソースコード

package main;

import java.io.*;
import java.net.InetAddress;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DomainInfoMain {
public static void main(String[] args) {
try {
File file = new File("‪C:\\Users\\-会社名-\\Desktop\\ssl_request_log.bak");
FileReader filereader = new FileReader(file);
BufferedReader br = new BufferedReader(filereader);
String str = br.readLine();
while(str != null){
System.out.println(str);

str = br.readLine();
}
br.close();
} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
}

Set<String> set = new LinkedHashSet<String>();

public static String extractMatchString() {
Matche matcher = Pattern.compile("/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3} ([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/").matcher();
if(matcher.find()){
set.add(matcher);
}
for(String tmp : set){
System.out.println(tmp);
}

InetAddress inet = InetAddress.getLocalHost(tmp);
String hostName = inet.getHostName();
System.out.println("ホスト名:" + hostName);

}
}

上記の流れ1~6に書いた通りにソースコードを書いてみました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/07/06 13:40

    ログというのは、所定のフォーマットが文字列として基本一行単位で出力されます。その内容を取得する際には、単純な法則から、正規表現を利用したものまでいくつかのバリエーションがありますが、それらを簡単に扱えるという観点で、スクリプトが適切です。単純なsed/awkから、perl/php/rubyなど慣れたスクリプト言語を利用するのが良いと思われます。一例:http://www.geekpage.jp/web/access-log/

    キャンセル

  • mattn

    2017/07/06 14:36

    まずはご自分で書かれたコードを載せてから質問しましょう。今のままだと書いて下さいと思われても仕方ありませんし、teratail はそういう場ではありません。

    キャンセル

  • chelsea14930321

    2017/07/06 14:50

    ご指摘ありがとうございます。自力で書いてみたものを載せました。

    キャンセル

回答 3

checkベストアンサー

+3

◆.bakファイルを読み込むのにもっと最適な方法があれば教えてください。

BufferedReader のままで良いと思います。ただしその際に、データを List に突っ込むかどうかで効率的かどうかが変わります。
ログが数万件あるかもしれませんが、ログで必要な箇所はその一部ですからね。

◆Substring以外でIPアドレスを抜き出す方法があれば教えてください。
すべてがすべてXXX.XXX.XXX.XXXの形ではないのでSubstringだとズレが起きるのではと

コードを見る限り Substring でなく正規表現が使われていますね。
Java でこれをやるのであれば正規表現のままで良いかと思います。
ただ今の正規表現を見る限り行の先頭に IP アドレスがある様ですね。場合によっては先頭に日付が付く場合がありますが、そういった場合は一度トークンの区切り(例:カンマ)などで一旦 Substring してしまった方が正規表現で誤爆する事が少ないです。

◆eclipseを使用しているのですが、上記の流れのプログラムって一つのjavaファイルに収まるのでしょうか?分けるとしたらどこをどう分ければよいのでしょうか。

これからどの程度のコードを追加されるのか分かりませんが、質問に書かれている用途であればあと十数行程度ですから分けなくても良い(分けると逆に見通しが悪くなる)のではないでしょうか。

最後になりましたが、こういった処理で Java を使うのはあまりお勧めできません。

Java は起動するだけで何もしていなくても数十MBメモリを取られる処理系です。UNIX なのであればこれくらいはシェルコマンドで作られた方が良いのではないでしょうか。

追記

頑張ってる様子が見えたのでオマケあげます。

import java.util.*;
import java.net.*;
import java.util.regex.*;

public class IP {
    public static void main(String[] args) throws Exception {
        Set<String> set = new LinkedHashSet<String>();
        Pattern p = Pattern.compile("^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
        Matcher m = p.matcher("192.168.1.2");
        if (m.matches()) {
            set.add(m.group(0));
        }
        for(String tmp : set){
            System.out.println(tmp);
            System.out.println("ホスト名:" + InetAddress.getByName(tmp).getHostName());
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/06 15:14

    ご回答ありがとうございます。
    「いったんSubstringする方法」はまた模索してやりたいと思います。
    社内情報なのであまり大きなことは言えませんが、今回このようなプログラムを書く目的としては、会社のHPにアクセスしてくれている会社様へ営業の電話を掛ける、要はアタックリスト的なものを作るためであります。そして何故Javaかと言いますと、先週に新人研修が終了したばかりで、使えるものとタスクの期限を考えると新しい言語などを覚えるよりかは学習したものを使う方がいいと上の方が判断したためです。
    3ヵ月みっちりJavaを勉強したわけではなく、SQLやhtmlなど広く浅く勉強していたので、Javaに関しては本当に基礎的な部分しか習得していないという状況で、でもタスクとして終わらせなければならないので今回こちらに質問させていただきました。
    今回初めての質問で、内容が乏しく不快に思わせてしまい申し訳ございません。

    キャンセル

  • 2017/07/06 15:16 編集

    いえ、しっかりとしたお返事ありがとうございます。よく理解できました。であれば、ぞんぶんに Java を使って下さい。頑張って下さい。 :)

    キャンセル

  • 2017/07/06 17:48 編集

    ありがとうございます。
    恐縮ではございますが、詳細な情報をいただけないでしょうか。
    今現状、.bakを読み込んで、eclipseのコンソールにログが出るようになりました。
    この後の処理としては、Set<String> set = new LinkedHashSet<String>(); で受け皿的なものを作って、正規表現で読み込んだログからIPアドレスを引っ張ってきてそこに入れたいのですが、正規表現の情報を調べても錯綜していてどれを使えばいいのかよくわかりません。私が行いたいのは正規表現でマッチするものをSetに入れるというところなのですが、どれも「マッチするものをsysoutする」ですとかそういった情報しか入手できません。これ以上お伺いしますと、「書いてください」と言っているのと同意義になってしまうので聞きづらいところではありますが、正規表現でマッチするものを抽出する方法と「Setに入れる」方法をお教えいただいたけますでしょうか

    キャンセル

  • 2017/07/06 18:57

    回答内容に足しておきました。

    キャンセル

  • 2017/07/06 19:36

    本当にありがとうございました。

    キャンセル

+3

そんな時間もないので

なら、わざわざコード書かなくても

  • 正規表現(例えばawkとか)を使ってIPアドレスを抜き出してファイルに書き出し
  • 必要なら重複排除する
  • 書き出したIPアドレスをnslookupで逆引き

で済みそうですけど

自分でコードを書くことも大事ですが、先人の知見をありがたく使いましょう
awkとか極めていくと単純なテキストファイルの処理でコードを書く必要なくなりますよ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/06 17:15

    ご回答ありがとうございます。

    キャンセル

+1

多分いくつか情報が無いと誰も回答できないと思われるので...。
.bakという拡張子はバックアップ時に使われることが多いだけで、拡張子からフォーマットや内容がわかるものではありません(私の狭い経験からですが。少なくとも標準化されたものではありません)。(拡張子と内容が一致しているという保証はないものの).csvならカンマ区切り、.tsvならタブ区切りと推測はできますが.bakだけでは内容やフォーマットの推測すらつきません。ですので、これから扱おうとしている.bakについて詳しい情報が必要です。
1.そもそもテキストファイルでしょうか?(お使いのSAKURAエディタ等テキストエディタでひらいで読めるかどうか)
2.テキストファイルなら文字コード/改行コードは?(不明ならいったん不明で可)
3.書式は?(サンプルがあると分かりやすいが、守秘義務に違反する可能性があるので適当に自作したもの数行でも可)
まずはこれくらい情報があればだれかが回答してくれると思います。加えて".bak"を生成したプログラムが有名プロダクトであればその道の人から詳しい解説が得られるかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/06 14:23

    ご回答ありがとうございます。
    ①そもそもテキストファイル化
    →SAKURAエディタで開いて読むことはできます。今現状eclipseのコンソールには「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」と記載されています。
    ②文字コード、改行コードは?
    すみません、不明です
    ③書式は?
    サンプルとして挙げさせていただきます。
    [13/Jul/2015:19:50:38 +0900] XXX.XXX.XX.XXX TLSv1.2 DHE-XXX-AES999-GCM-SHA999 "GET /license.txt HTTP/1.1" 209
    [13/Jul/2015:19:50:38 +0900] XXX.XXX.XX.XXX TLSv1.2 DHE-XXX-AES999-GCM-SHA999 "GET /favicon.ico HTTP/1.1" 209
    このような形になっております。

    キャンセル

  • 2017/07/06 15:54

    気になるところだけちょっと。問題なければスルーしてください。
    ・まずファイルの文字コード/改行コードと実行環境は気にしておいた方が良いと思います。
    FileReaderは実行環境のデフォルト文字コードを利用します。.bakがLinux環境の文字コードで作成されててこのプログラムをWin環境で動かすとすると普通は不一致だろうと思います。なので普通"売り物のプログラム"にはFileReaderではなく文字コードを指定できるInputStreamReaderを使う。
    ・正規表現でがんばっても良いが、サンプルから推測するにStringクラスのsplitメソッド+区切り文字空白で簡単にとりだせませんか?
    (他の方も書いていましたがawkのような感じです。よほどイジワルなフォーマット設定でなければ区切り文字で分割はできる)
    あとJavaのお作法的にはいくつかありますが(例えばリソースの解放(close)はエラーのときもちゃんとcloseするようにfinallyで行うか、JavaSE8で導入された自動リソース管理使うかするとか。今回の場合毎回プロセスが終わるので特に問題はありませんが。)
    そんなところで。

    キャンセル

  • 2017/07/06 17:13

    回答ありがとうございます。
    そうですよね…。一応修正をして.bakが読み取れるようにはなりました。
    正規表現で苦戦しております。splitメソッド+区切り文字空白というのも調べてはみたのですがなかなかたどり着けません。もう少し頑張ってみます。
    いろいろとご指摘いただき、本当にありがとうございます。

    キャンセル

同じタグがついた質問を見る

  • Java

    16120questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1959questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • Tomcat

    627questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

  • Tera Term

    120questions

    Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。