Как разделить строки из текстового файла java?

Есть текстовый файл, в котором разные данные, о каждом ПК. Я отсеял все строки, кроме тех, которые содержат IP адреса, но как мне разделить эти строки так, чтобы в них были только IP и ничего больше, одним списком?

package signal;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class OpenPort {
    public static void main(String[] args) throws IOException {
        File source = new File("src/8 8 0.txt");    
        FileReader fileReader = new FileReader(source); 
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        while (bufferedReader.ready()) {
            String string = new String(bufferedReader.readLine());
            if (string.contains("8.8")) {
                String[] ip = string.split("([0-9]{2}[\\.]){3}[0-9]{1,3}");
                for (int i = 0; i < ip.length; i++) {
                    char[] iplist = ip[i].toCharArray();
                    System.out.println(iplist);
                }
            }
        }
    
    }       
}

Вывод сейчас выглядит так:

Nmap scan report for eposrv03.signal.local (8.8.0.3)
Nmap scan report for eposrv02.signal.local (8.8.0.5)
Nmap scan report for eposrv08.signal.local (8.8.0.10)
Nmap scan report for eposrv09.signal.local (8.8.0.12)
Nmap scan report for eposrv11.signal.local (8.8.0.14)
Nmap scan report for dokuwiki.signal.local (8.8.0.16)
Nmap scan report for epopas17.signal.local (8.8.0.17)

Мне нужно, чтобы был только список IP, подскажите, пожалуйста


Ответы (3 шт):

Автор решения: ACTPOHOM

решение не из лучших, но вы можете разделить строку по пробелам, занести полученное в массив и вывести потом определенный элемент.

Вот как вы будем разделять строку (командой split):

String[] words = iplist.split(" ");

после чего в words будет хранится ваша строка только уже разделенная по пробелам.

примерно так должен выглядеть код:

for (int i = 0; i < ip.length; i++) {
                    char[] iplist = ip[i].toCharArray();
                    String[] words = iplist.split(" ");
                    System.out.println(words[5]);
                }
→ Ссылка
Автор решения: Nowhere Man

Можно просто искать IPv4 адреса в каждой строке, используя регулярное выражение, которое может выглядеть так: 8\.8(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){2} -- будут обнаружены только валидные IPv4 адреса, начинающиеся на "8.8.".

При этом удобно пользоваться методами BufferedReader::lines, возвращающим поток строк, и Matcher::results, возвращающим поток совпадений для каждой строки (метод доступен в Java 9+).

Также при работе с потоками ввода/вывода следует использовать try-with-resources.

Pattern ip8dot8 = Pattern.compile("8\\.8(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){2}");
try (BufferedReader br = new BufferedReader(new FileReader("src/8 8 0.txt"))) {
    br.lines() // Stream<String>
      .flatMap(line -> ip8dot8.matcher(line)
          .results() // Stream<MatchResult>
          .map(MatchResult::group) // Stream <String>
      )
      .forEach(System.out::println); // вывод всех адресов по очереди
}

Вместо терминальной операции Stream::forEach можно собрать все адреса в список при помощи Stream::collect:

    List<String> ipAddresses = br.lines() // Stream<String>
        .flatMap(line -> ip8dot8.matcher(line)
            .results() // Stream<MatchResult>
            .map(MatchResult::group) // Stream <String>
        )
        .collect(Collectors.toList());
→ Ссылка
Автор решения: ChurKIT
BufferedReader br = new BufferedReader(new FileReader("/src/10 0 0.txt"));
    Map<String, Map<String, String>> result = new HashMap<>();
    List<String> list = br.lines().toList();
    List<String> iters = new ArrayList<>();
    Map<String, String> portsAndService = new HashMap<>();
    for (String lineInAllFile : list){
        if (!lineInAllFile.isBlank()) iters.add(lineInAllFile);
        else {
            for (String lineInIters : iters) {
                String host = "";
                if (lineInIters.startsWith("Nmap scan report for")) {
                    host = lineInIters.replaceAll("Nmap scan report for", "");
                } else if (Character.isDigit(lineInIters.toCharArray()[0])) {
                    String[] line = lineInIters.split("\\s+");
                    String port = line[0];
                    String service = line[2];
                    portsAndService.put(port, service);
                }
                result.put(host, portsAndService);
            }
            portsAndService = new HashMap<>();
            iters = new ArrayList<>();
        }
    }
    //тут можно в excel выгрузить вместо этого вывода
    result.forEach(
            (host, portsAndServices) -> {
                System.out.println(host);
                portsAndServices.forEach(
                        (port, service) -> {
                            System.out.println(port + " " + service);
                        }
                );
            }
    );
}

Вывод будет вот такого вида:

 helpdesk.signal.local (10.0.0.115)
 443/tcp https
 22/tcp ssh
 3306/tcp mysql
 eposrv84.signal.local (10.0.0.84)
 3389/tcp ms-wbt-server
 49154/tcp unknown
 49155/tcp unknown
 49156/tcp unknown
 445/tcp microsoft-ds
 49152/tcp unknown
 139/tcp netbios-ssn
 49175/tcp unknown
 49153/tcp unknown
 135/tcp msrpc

При желании формат вывода можно поменять, суть в том, что получается мапа где ключ это хост, а значение это еще одна мапа в которой ключ это порт, а значение это сервис

Также можно подключить библиотеку вывода напрямую в Excel (Apache POI или JExcel)

→ Ссылка