大日志文件截取,从指定日志文件中提取两个标记字符串之间的全部内容,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学习网站

相关推荐
朝星2 小时前
Android开发[14]:网络优化之OkHttp
android·okhttp·kotlin
QING6181 天前
Kotlin 日常开发常用语法糖整理 —— 速记
android·kotlin·android jetpack
popcorn_min1 天前
共享单车需求预测:时间特征工程 + 随机森林,R² 达到 0.931
随机森林·r语言·kotlin
Attachment George1 天前
山东大学软件学院-项目实训-个人开发日志(十):材料问答链路开发——文档解析、OCR兜底与持续追问完善
python·ai·langchain·kotlin·rag
Kapaseker1 天前
一个丝滑的数字计数器,讲清楚 AnimatedContent 怎么用
android·kotlin
plainGeekDev2 天前
网络状态监听 → ConnectivityManager + Flow
android·java·kotlin
唐青枫2 天前
Kotlin with 详解:把已有对象放进作用域集中处理
kotlin
Kapaseker2 天前
你的第一个 Agent — 切换模型
kotlin·agent
JohnnyDeng943 天前
【Android】ViewModelScope 与协程生命周期管理:告别内存泄漏,掌控异步边界
android·kotlin·mvvm·协程