@Override
  public int run(String[] args) throws Exception {
    long initialRefreshDelay = 3 * 1000;
    Mode initialMode = Mode.REGION;
    List<Field> initialFields = null;
    Field initialSortField = null;
    Boolean initialAscendingSort = null;
    List<RecordFilter> initialFilters = null;
    long numberOfIterations = Long.MAX_VALUE;
    boolean batchMode = false;
    try {
      Options opts = getOptions();
      CommandLine commandLine = new DefaultParser().parse(opts, args);

      if (commandLine.hasOption("help")) {
        printUsage(opts);
        return 0;
      }

      if (commandLine.hasOption("mode")) {
        String mode = commandLine.getOptionValue("mode");
        switch (mode) {
          case "n":
            initialMode = Mode.NAMESPACE;
            break;

          case "t":
            initialMode = Mode.TABLE;
            break;

          case "r":
            initialMode = Mode.REGION;
            break;

          case "s":
            initialMode = Mode.REGION_SERVER;
            break;

          case "u":
            initialMode = Mode.USER;
            break;

          case "c":
            initialMode = Mode.CLIENT;
            break;

          default:
            LOGGER.warn("Mode set invalid, using default");
            break;
        }
      }

      if (commandLine.hasOption("outputFieldNames")) {
        initialMode.getFieldInfos().forEach(f -> System.out.println(f.getField().getHeader()));
        return 0;
      }

      if (commandLine.hasOption("delay")) {
        int delay = 0;
        try {
          delay = Integer.parseInt(commandLine.getOptionValue("delay"));
        } catch (NumberFormatException ignored) {
          // Deliberately ignored, we handle the issue below.
        }

        if (delay < 1) {
          LOGGER.warn("Delay set too low or invalid, using default");
        } else {
          initialRefreshDelay = delay * 1000L;
        }
      }

      if (commandLine.hasOption("numberOfIterations")) {
        try {
          numberOfIterations = Long.parseLong(commandLine.getOptionValue("numberOfIterations"));
        } catch (NumberFormatException ignored) {
          LOGGER.warn("The number of iterations set invalid, ignoring");
        }
      }

      if (commandLine.hasOption("sortField")) {
        String sortField = commandLine.getOptionValue("sortField");

        String field;
        boolean ascendingSort;
        if (sortField.startsWith("+")) {
          field = sortField.substring(1);
          ascendingSort = false;
        } else if (sortField.startsWith("-")) {
          field = sortField.substring(1);
          ascendingSort = true;
        } else {
          field = sortField;
          ascendingSort = false;
        }

        Optional<FieldInfo> fieldInfo = initialMode.getFieldInfos().stream()
          .filter(f -> f.getField().getHeader().equals(field)).findFirst();
        if (fieldInfo.isPresent()) {
          initialSortField = fieldInfo.get().getField();
          initialAscendingSort = ascendingSort;
        } else {
          LOGGER.warn("The specified sort field " + field + " is not found, using default");
        }
      }

      if (commandLine.hasOption("fields")) {
        Iterable<String> fields = Splitter.on(',').split(commandLine.getOptionValue("fields"));
        initialFields = new ArrayList<>();
        for (String field : fields) {
          Optional<FieldInfo> fieldInfo = initialMode.getFieldInfos().stream()
            .filter(f -> f.getField().getHeader().equals(field)).findFirst();
          if (fieldInfo.isPresent()) {
            initialFields.add(fieldInfo.get().getField());
          } else {
            LOGGER.warn("The specified field " + field + " is not found, ignoring");
          }
        }
      }

      if (commandLine.hasOption("filters")) {
        Iterable<String> filters = Splitter.on(',').split(commandLine.getOptionValue("filters"));
        List<Field> fields = initialMode.getFieldInfos().stream().map(FieldInfo::getField)
          .collect(Collectors.toList());
        for (String filter : filters) {
          RecordFilter f = RecordFilter.parse(filter, fields, false);
          if (f != null) {
            if (initialFilters == null) {
              initialFilters = new ArrayList<>();
            }
            initialFilters.add(f);
          } else {
            LOGGER.warn("The specified filter " + filter + " is invalid, ignoring");
          }
        }
      }

      if (commandLine.hasOption("batchMode")) {
        batchMode = true;
      }
    } catch (Exception e) {
      LOGGER.error("Unable to parse options", e);
      return 1;
    }

    try (Screen screen = new Screen(getConf(), initialRefreshDelay, initialMode, initialFields,
      initialSortField, initialAscendingSort, initialFilters, numberOfIterations, batchMode)) {
      screen.run();
    }

    return 0;
  }
A real-time monitoring tool for HBase like Unix top command.
hbase-hbtop/src/main/java/org/apache/hadoop/hbase/hbtop/HBTop.java