大日志文件截取,从指定日志文件中提取两个标记字符串之间的全部内容,Kotlin

大日志文件截取,从指定日志文件中提取两个标记字符串之间的全部内容,Kotlin

一个Kotlin编写的日志文件截取工具,用于从指定日志文件中提取两个标记字符串之间的内容。程序通过命令行交互获取文件路径、起始和结束标记字符串,验证输入后创建输出文件。使用UTF-8编码读取日志文件,当检测到起始标记时开始写入,遇到结束标记时停止。程序会处理文件名中的非法字符,并在操作完成后显示结果信息,包括复制行数和输出文件路径。如果未找到标记则会删除临时文件并提示错误。

Kotlin 复制代码
import java.io.File
import java.nio.charset.Charset

fun main() {
    println("请输入 log 文件路径 file path:")
    val filePath = readLine()?.trim()?.trim('"') ?: ""

    println("请输入起始匹配字符串 tag start:")
    val tagStart = readLine() ?: ""

    println("请输入结束匹配字符串 tag end:")
    val tagEnd = readLine() ?: ""

    if (filePath.isBlank()) {
        println("错误:filePath 不能为空")
        return
    }

    if (tagStart.isBlank()) {
        println("错误:tagStart 不能为空")
        return
    }

    if (tagEnd.isBlank()) {
        println("错误:tagEnd 不能为空")
        return
    }

    val sourceFile = File(filePath)

    if (!sourceFile.exists()) {
        println("错误:文件不存在:$filePath")
        return
    }

    if (!sourceFile.isFile) {
        println("错误:输入路径不是文件:$filePath")
        return
    }

    val safeTagStart = sanitizeFileName(tagStart)
    val safeTagEnd = sanitizeFileName(tagEnd)

    val outputFileName = "from_${safeTagStart}_to_${safeTagEnd}.txt"
    val outputFile = File(sourceFile.parentFile, outputFileName)

    var foundStart = false
    var foundEnd = false
    var copiedLineCount = 0

    /**
     * log 一般是 UTF-8。
     * 如果日志是 GBK,可以把 Charsets.UTF_8 改成 Charset.forName("GBK")
     */
    val charset: Charset = Charsets.UTF_8

    sourceFile.bufferedReader(charset).use { reader ->
        outputFile.bufferedWriter(charset).use { writer ->
            var line: String?

            while (true) {
                line = reader.readLine()
                if (line == null) {
                    break
                }

                val currentLine = line!!

                if (!foundStart) {
                    if (currentLine.contains(tagStart)) {
                        foundStart = true

                        writer.write(currentLine)
                        writer.newLine()
                        copiedLineCount++

                        if (currentLine.contains(tagEnd)) {
                            foundEnd = true
                            break
                        }
                    }
                } else {
                    writer.write(currentLine)
                    writer.newLine()
                    copiedLineCount++

                    if (currentLine.contains(tagEnd)) {
                        foundEnd = true
                        break
                    }
                }
            }
        }
    }

    if (!foundStart) {
        outputFile.delete()
        println("没有找到起始 tagStart:$tagStart")
        return
    }

    if (!foundEnd) {
        outputFile.delete()
        println("已经找到 tagStart,但在其后没有找到 tagEnd:$tagEnd")
        return
    }

    println("截取完成!")
    println("起始 tag start:$tagStart")
    println("结束 tag end:$tagEnd")
    println("复制日志行数:$copiedLineCount")
    println("输出文件路径:${outputFile.absolutePath}")
}

/**
 * Windows 文件名不能包含以下字符:
 * \ / : * ? " < > |
 *
 * 这里统一替换成下划线,避免生成文件失败。
 */
fun sanitizeFileName(name: String): String {
    val invalidChars = Regex("""[\\/:*?"<>|]""")
    return name
        .replace(invalidChars, "_")
        .replace(Regex("\\s+"), "_")
        .take(100)
}

运行

IntelliJ IDEA 安装 Kotlin 插件后,通常会自带 Kotlin compiler,路径一般类似:

复制代码
C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2024.3\plugins\Kotlin\kotlinc\bin

这个目录下通常会有:

复制代码
kotlinc.bat
kotlin.bat

临时配置 PATH

打开 Windows CMD,执行类似命令:

复制代码
set PATH=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2024.3\plugins\Kotlin\kotlinc\bin;%PATH%

注意:要把路径改成你自己电脑上的真实路径。

然后验证:

复制代码
kotlinc -version

如果输出正确的kotlin版本号,表面配置成功。

执行编译:

Kotlin 复制代码
kotlinc AppMain.kt -include-runtime -d AppMain.jar

会生成一个AppMain.jar文件。

运行:

Kotlin 复制代码
java -jar AppMain.jar

推荐一个AI学习网站

相关推荐
雨白5 小时前
深入理解 Kotlin 协程 (八):拾遗补阙,探秘官方框架的调度细节与取消闭环
android·kotlin
GitLqr9 小时前
别被“Flutter 传感器延迟 150ms”带偏了:这可能只是你的实现方式错了
flutter·架构·kotlin
我命由我1234514 小时前
Android 在构建过程中,发现有两个依赖库都包含了相同路径的资源文件
android·java·开发语言·java-ee·kotlin·android-studio·android runtime
Coffeeee14 小时前
谷歌的一个优化建议,让我重新学了一遍Android里面如何正确处理位图
android·google·kotlin
Android打工仔2 天前
Continuation 到底是谁创建的?
android·kotlin
Android-Flutter2 天前
android fragment 使用
android·kotlin
alexhilton2 天前
响应式的Android身份验证架构
android·kotlin·android jetpack
zzq77973 天前
Android 16 API 36 升级后 APP 加固兼容性问题解析
android·开发语言·安全·kotlin·安卓·安全架构
Sirens.3 天前
从参考 iCost 到做自己的 OneLedger:一个 Android 本地记账 App 的开发记录
android·kotlin·room·jetpack compose·记账 app
Hrain-AI3 天前
2026 企业 AI 编程智能体实战:Codex 与 Claude Code
开发语言·人工智能·kotlin