我正在尝试开发一小段代码,帮助我分隔一个日志文件,该文件存储了一周内发送的大量到不同 IP 的跟踪路由。
我希望在每个跟踪路由的开头和结尾使用“--- START ---”和“--- END ---”标记来分割它们。示例如下:
--- START ---
Mon Mar 12 22:45:05 GMT 2012
traceroute to xxxxxxx (xxxxxxxx), 30 hops max, 60 byte packets
1 xxxxxxx (xxxxx) 1.085 ms 1.662 ms 2.244 ms
2 xxxxxxxx (xxxxxxx) 0.792 ms 0.782 ms 0.772 ms
3 xxxxxxxxx (xxxxxxxxx) 8.545 ms 9.170 ms 9.644 ms
4 etc
5 etc
--- END ---
--- START ---
Mon Mar 12 22:45:05 GMT 2012
traceroute to xxxxxxxxx (xxxxxxxx), 30 hops max, 60 byte packets
1 139.222.0.1 (xxxxxxxxx) 0.925 ms 1.318 ms 1.954 ms
2 10.0.0.1 (xxxxxxxx) 0.345 ms 0.438 ms 0.496 ms
3 172.16.0.34 (xxxxxxxxx) 0.830 ms 2.553 ms 0.809 ms
4 etc
5 etc
6 etc
--- END ---
任何人都可以帮助我了解如何在 matlab 或 java 中完成此操作...我还尝试计算每个跟踪路由的跳数。这是抛出 --- END --- 标签之前给出的数字...
任何帮助将不胜感激,
干杯。
最佳答案
快速但肮脏的例子:
import java.io.*;
import java.text.*;
import java.util.*;
import java.util.regex.*;
public class Main
{
private static class Record
{
public Date date;
public String to;
public int hops;
public int packetSize;
public String toString()
{
return date + " ::: " + to + ", " + hops + " hops, "
+ packetSize + " bytes";
}
}
public static void main(String[] args) throws Exception
{
Scanner s = new Scanner(new FileReader(new File("input.txt")));
Record currentRecord = null;
ArrayList<Record> list = new ArrayList<Record>();
while (s.hasNextLine()) {
String line = s.nextLine();
if ("--- START ---".equals(line)) {
currentRecord = new Record();
} else if ("--- END ---".equals(line)) {
list.add(currentRecord);
currentRecord = null;
} else if (currentRecord.date == null) {
currentRecord.date = new SimpleDateFormat(
"EEE MMM dd HH:mm:ss zzz yyyy").parse(line);
} else if (line.startsWith("traceroute to ")) {
Pattern p = Pattern.compile(
"traceroute to ([^ ]+) [^,]+, ([^ ]+) hops max, ([^ ]+) byte packets");
Matcher m = p.matcher(line);
if (m.matches()) {
currentRecord.to = m.group(1);
currentRecord.hops = Integer.parseInt(m.group(2));
currentRecord.packetSize = Integer.parseInt(m.group(3));
}
}
}
for (int i = 0; i < list.size(); i++)
System.out.println(list.get(i).toString());
}
}
输出:
Tue Mar 13 04:15:05 GMT+05:30 2012 ::: 203.98.69.105, 30 hops, 60 bytes
Tue Mar 13 04:15:05 GMT+05:30 2012 ::: 62.193.36.27, 30 hops, 60 bytes
我为您指出了许多不同的方向(Scanner
、Pattern
、SimpleDateFormat
等)。对于各个“网关”项,您还可以使用 String.split()
,并使用 ""
(两个空格)作为分隔符。
关于java - 将日志文件解析为 CSV 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9762459/