【问题标题】:Parse a log file and remove unwanted data解析日志文件并删除不需要的数据
【发布时间】:2017-07-11 15:06:12
【问题描述】:

所以我有一个日志文件,其中提供了有关锁定和解锁节点的详细信息。每个节点的时间和日期 18:02:21 和 ID "ieatrcxb4498-1"

150: 2017-06-14 18:02:21 INFO  monitorinfo                    :     Info: Lock VCS on node "ieatrcxb4498-1"
     264: 2017-06-14 18:02:21 INFO  monitorinfo                   :     Info: Unlock VCS on node "ieatrcxb4498-1"
     268: 2017-06-14 18:02:21 INFO  monitorinfo                   :     Info: Lock VCS on node "ieatrcxb4496-1"
     382: 2017-06-14 18:02:21 INFO  monitorinfo                   :     Info: Unlock VCS on node "ieatrcxb4496-1"
     407: 2017-06-14 18:02:21 INFO  monitorinfo                   :     Info: Lock VCS on node "ieatrcxb4500-1"
     473: 2017-06-14 18:02:21 INFO  monitorinfo                   :     Info: Unlock VCS on node "ieatrcxb4500-1"

我想要做的是通过我的程序运行日志文件,删除不需要的数据并将输出格式化为看起来像,或类似的东西。

Node            Lock        Unlock  
ieatrcxb4498-1  18:02:21                    
ieatrcxb4498-1              18:02:21                
ieatrcxb4500-1  18:02:21        
ieatrcxb4500-1              18:02:21

我有一个基本程序,我找到了here 并进行了调整,但我正在努力让它正常工作。

public class Main {

    private static class Record
    {

        public String node;
        public Date lock;
        public Date unlock;

        @Override
        public String toString() {
            return "Record{" +
                    ", node='" + node + '\'' +
                    ", lock='" + lock + '\'' +
                    ", unlock='" + unlock + '\'' +
                    '}';
        }

    }

    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 ("SHOW_PLAN BEGIN".equals(line)) {
                currentRecord = new Record();

            } else if ("SHOW_PLAN END".equals(line)) {
                list.add(currentRecord);
                currentRecord = null;

            } else if (currentRecord.lock == null) {
                currentRecord.lock = new SimpleDateFormat(
                        "HH:mm:ss").parse(line);

            }else if(currentRecord.unlock == null){
                currentRecord.unlock = new SimpleDateFormat(
                        "HH:mm:ss").parse(line);
            }
            else if (line.startsWith("traceroute to ")) {
                Pattern p = Pattern.compile(
                        "monitor ([^ ]+) [^,]+, ([^ ]+) hops max, ([^ ]+) byte packets");
                Matcher m = p.matcher(line);

                if (m.matches()) {
                    currentRecord.node = m.group(1);
//                    currentRecord.lock = m.
//                    currentRecord.unlock = m.group(3);
                }
            }
        }

        for (int i = 0; i < list.size(); i++)
            System.out.println(list.get(i).toString());
    }
}

【问题讨论】:

    标签: java regex csv pattern-matching


    【解决方案1】:

    在您开始创建 Record 对象之前,我会在所有空白处分割线。我建议使用 3 个变量、时间、状态(锁定/解锁)和 ID 创建对象。

    public class Record
    {
        String time;
        String state;
        String ID;
    }
    

    然后您可以简单地在空间周围拆分并获取包含您需要的信息的某些索引,就像这样

        String line = "150: 2017-06-14 18:02:21 INFO  monitorinfo   :    Info: Lock VCS on node \"ieatrcxb4498-1\"";
    
        String[] pieces = line.split("\\s+");
    
        Record obj = new Record();
        obj.time = pieces[2];
        obj.state = pieces[7];
        obj.id = pieces[11].replaceAll("\"", "");
    

    剩下要做的就是格式化输出,使用 sprintf 函数可以轻松完成,就像这样

    System.out.printf("%-10s %-10s %-10s\n", "Node", "Lock", "Unlock");
    

    现在您只需遍历列表中的所有对象并检查对象的状态

    for(Record obj : list)
    {
        if(obj.state.equals("Lock"))
            System.out.printf("%-10s %-10s %-10s\n", obj.ID, obj.time, "");
        else
            System.out.printf("%-10s %-10s %-10s\n", obj.ID, "", obj.time);
    }
    

    【讨论】:

    • 谢谢,我会尽快查看并回复您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多