Как разделить строки из текстового файла 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 шт):
решение не из лучших, но вы можете разделить строку по пробелам, занести полученное в массив и вывести потом определенный элемент.
Вот как вы будем разделять строку (командой 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]);
}
Можно просто искать 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());
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)