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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Tera Term

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

Java

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

Eclipse

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

Tomcat

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

Q&A

解決済

3回答

3667閲覧

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

chelsea14930321

総合スコア9

Tera Term

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

Java

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

Eclipse

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

Tomcat

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

0グッド

0クリップ

投稿2017/07/06 03:08

編集2017/07/06 06:18

###前提・実現したいこと
自力で今現在プログラムを作っています。
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に書いた通りにソースコードを書いてみました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2017/07/06 04:29

winSCPですよね? ログ解析のような処理はスクリプトで行った方が手軽かと思いますが、プログラム実習か何かでしょうか?
chelsea14930321

2017/07/06 04:33 編集

いえ、実習ではございません。 スクリプトの方が便利というのは具体的にどのようなものなのでしょうか?
t_obara

2017/07/06 04:40

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

2017/07/06 05:36

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

2017/07/06 05:50

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

回答3

0

ベストアンサー

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

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

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

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

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

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

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

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

追記

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

java

1import java.util.*; 2import java.net.*; 3import java.util.regex.*; 4 5public class IP { 6 public static void main(String[] args) throws Exception { 7 Set<String> set = new LinkedHashSet<String>(); 8 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])$"); 9 Matcher m = p.matcher("192.168.1.2"); 10 if (m.matches()) { 11 set.add(m.group(0)); 12 } 13 for(String tmp : set){ 14 System.out.println(tmp); 15 System.out.println("ホスト名:" + InetAddress.getByName(tmp).getHostName()); 16 } 17 } 18}

投稿2017/07/06 06:00

編集2017/07/06 09:57
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chelsea14930321

2017/07/06 06:14

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

2017/07/06 06:17 編集

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

2017/07/06 08:49 編集

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

2017/07/06 09:57

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

2017/07/06 10:36

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

0

そんな時間もないので

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

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

で済みそうですけど

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

投稿2017/07/06 05:44

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

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

投稿2017/07/06 05:11

編集2017/07/06 05:13
kurokoba

総合スコア276

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chelsea14930321

2017/07/06 05: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 このような形になっております。
kurokoba

2017/07/06 06:54

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

2017/07/06 08:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問