private static Map<String, List<String[]>> parseTable(String listOutput) {
        // Split on the empty line which should appear in the output.
        String[] sections = listOutput.split("\n\\s*\n");
        assertTrue(sections.length > 1, "No empty line in list output");
        String[] rows = sections[0].split("\n");
        Map<String, List<String[]>> table = new HashMap<>();
        // Assert that the first row is the header
        assertArrayEquals(ConnectPluginPath.LIST_TABLE_COLUMNS, rows[0].split("\t"), "Table header doesn't have the right columns");
        // Skip the header to parse the rows in the table.
        for (int i = 1; i < rows.length; i++) {
            // group rows by
            String[] row = rows[i].split("\t");
            assertEquals(ConnectPluginPath.LIST_TABLE_COLUMNS.length, row.length, "Table row is the wrong length");
            table.computeIfAbsent(row[NAME_COL], ignored -> new ArrayList<>()).add(row);
        }
        return table;
    }
Parse the main table of the list command.
<p>Map is keyed on the plugin name, with a list of rows which referred to that name if there are multiple.
Each row is pre-split into columns.
@param listOutput An executed list command
@return A parsed form of the table grouped by plugin class names
tools/src/test/java/org/apache/kafka/tools/ConnectPluginPathTest.java