public String apply()

in core/src/main/java/com/taobao/arthas/core/shell/command/internal/GrepHandler.java [101:166]


    public String apply(String input) {
        StringBuilder output = new StringBuilder();
        String[] lines = input.split("\n");
        int continueCount = 0;
        int lastStartPos = 0;
        int lastContinueLineNum = -1;
        int matchCount = 0;
        for (int lineNum = 0; lineNum < lines.length;) {
            String line = null;
            if (this.trimEnd) {
                line = StringUtils.stripEnd(lines[lineNum], null);
            } else {
                line = lines[lineNum];
            }
            lineNum++;

            final boolean match;
            if (pattern == null) {
                match = (ignoreCase ? line.toLowerCase() : line).contains(keyword);
            } else {
                match = pattern.matcher(line).find();
            }
            if (invertMatch != match) {
                matchCount++;
                if (beforeLines > continueCount) {
                    int n = lastContinueLineNum == -1 ? (beforeLines >= lineNum ? 1 : lineNum - beforeLines)
                                    : lineNum - beforeLines - continueCount;
                    if (n >= lastContinueLineNum || lastContinueLineNum == -1) {
                        StringBuilder beforeSb = new StringBuilder();
                        for (int i = n; i < lineNum; i++) {
                            appendLine(beforeSb, i, lines[i - 1]);
                        }
                        output.insert(lastStartPos, beforeSb);
                    }
                } // end handle before lines

                lastStartPos = output.length();
                appendLine(output, lineNum, line);

                if (afterLines > continueCount) {
                    int last = lineNum + afterLines - continueCount;
                    if (last > lines.length) {
                        last = lines.length;
                    }
                    for (int i = lineNum; i < last; i++) {
                        appendLine(output, i + 1, lines[i]);
                        lineNum++;
                        continueCount++;
                        lastStartPos = output.length();
                    }
                } // end handle afterLines

                continueCount++;
                if (maxCount > 0 && matchCount >= maxCount) {
                    break;
                }
            } else { // not match
                if (continueCount > 0) {
                    lastContinueLineNum = lineNum - 1;
                    continueCount = 0;
                }
            }
        }
        final String str = output.toString();
        return str;
    }