Golang Go语言中怎么移除命令日志里的控制字符, 不依赖 shell 命令

发布于 1周前 作者 eggper 来自 Go语言
Script started on 2020 年 11 月 17 日 星期二 10 时 20 分 31 秒
sh: 0: getcwd() failed: No such file or directory
$ bash

]0;myuser@vir-secu3: /var/snap/amazon-ssm-agent/3315 [01;32mmyuser@vir-secu3 [00m: [01;34m/var/snap/amazon-ssm-agent/3315 [00m$ cd /data/myuser/we -se cu-standby/

]0;myuser@vir-secu3: /data/myuser/secu-standby [01;32mmyuser@vir-secu3 [00m: [01;34m/data/myuser/secu-standby [00m$ ./deploy.sh ./de [K [K [K [K [K

deploy time: 2020-11-17_06-59-12


Golang Go语言中怎么移除命令日志里的控制字符, 不依赖 shell 命令

更多关于Golang Go语言中怎么移除命令日志里的控制字符, 不依赖 shell 命令的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

这跟 go 没半毛钱关系啊,日志怎么收集的?不能用 stdout 和 stderr 吗?

更多关于Golang Go语言中怎么移除命令日志里的控制字符, 不依赖 shell 命令的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


代理工具采集的. 正则替换就能解决吧

上线的时候关掉打印颜色

使用正则啊:\x1B\[[0-9;]*[A-Za-z]

这些都是 log 的颜色, 你在初始化 log 的时候把颜色关掉就可以了




最好还是我这边处理掉

这个正则只能去掉一部分,还有许多东西遗留(比如说 BEL),自己写怕漏掉什么😂

[\u001B\u009B][\#;?](?:(?:(?:[a-zA-Z\d](?:;[a-zA-Z\d]))?\u0007)|(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PRZcf-ntqry=><~]))

在Go语言中,移除命令日志里的控制字符,可以通过遍历字符串并过滤掉非打印字符来实现,而不依赖外部shell命令。控制字符通常指的是ASCII码中0到31之间的字符,以及127(DEL)。

以下是一个示例代码,展示了如何在Go中完成这一任务:

package main

import (
	"fmt"
	"unicode"
)

// removeControlChars 移除字符串中的控制字符
func removeControlChars(s string) string {
	runes := []rune(s)
	filtered := make([]rune, 0, len(runes))
	for _, r := range runes {
		if !unicode.IsControl(r) {
			filtered = append(filtered, r)
		}
	}
	return string(filtered)
}

func main() {
	logWithControlChars := "Hello\x07World\x1b!"
	cleanedLog := removeControlChars(logWithControlChars)
	fmt.Println("Original:", `"`+logWithControlChars+`"`)
	fmt.Println("Cleaned: ", `"`+cleanedLog+`"`)
}

在这个例子中,removeControlChars 函数遍历输入字符串的每个字符(rune),并使用 unicode.IsControl 检查是否为控制字符。如果不是控制字符,则将其添加到新的字符串中。最后,返回清理后的字符串。

这种方法适用于任何包含控制字符的字符串,并且不依赖于外部shell命令,确保了代码的可移植性和独立性。

回到顶部