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

相关推荐
TechNomad1 小时前
Kotlin_Lambda编程详解
android·kotlin
plainGeekDev8 小时前
ProGuard → R8
android·java·kotlin
aidou131410 小时前
Kotlin中沉浸式状态栏显示布局
android·kotlin·windowmanager·沉浸式状态栏·insetslistener·insetscompat·systembars
Kapaseker13 小时前
扶我起来,Compose Styles API 进阶
android·kotlin
机智的张尼玛1 天前
我基于 Kotlin Multiplatform 实现了一套跨平台的弱网离线同步引擎
android·开源·kotlin
我是唐青枫1 天前
Kotlin 运算符重载详解:为什么 a += b 有时改对象,有时换对象?
开发语言·kotlin
帅次1 天前
Android 高级工程师面试:Kotlin 语法基础 近1年高频追问 22 题
android·面试·kotlin·扩展函数·空安全
plainGeekDev2 天前
Gradle 写法 → Kotlin DSL
android·java·kotlin
TechNomad2 天前
Kotlin条件语句和循环语句详解
android·kotlin
Android-Flutter2 天前
android compose shadow 阴影 使用
android·kotlin·compose