golang终端字符串匹配与彩色标记插件库marker的使用
Golang终端字符串匹配与彩色标记插件库marker的使用
简介
Marker是一个用于在终端输出中匹配和标记字符串的Golang库,可以轻松实现彩色输出效果。它使用fatih/color库来实现终端输出的彩色化。
安装
go get github.com/cyucelen/marker
基本用法
简单示例
aristotleQuote := "The more you know, the more you realize you don't know."
emphasized := marker.Mark(aristotleQuote, marker.MatchAll("know"), color.New(color.FgRed))
fmt.Println(emphasized)
标记日志流
你可以将marker与Golang的log包或任何支持io.Writer的接口集成。
stdoutMarker := marker.NewStdoutMarker()
markRules := []marker.MarkRule{
{marker.MatchBracketSurrounded(), color.New(color.FgBlue)},
{marker.MatchAll("marker"), color.New(color.FgRed)},
}
stdoutMarker.AddRules(markRules)
logger := log.New(stdoutMarker, "", 0)
logger.Println("[INFO] marker is working as expected")
自定义io.Writer输出
f, _ := os.Create("/tmp/awesome.log")
w := bufio.NewWriter(f)
writeMarker := marker.NewWriteMarker(w)
markRules := []marker.MarkRule{
{marker.MatchBracketSurrounded(), blueFg},
{marker.MatchAll("marker"), magentaFg},
}
writeMarker.AddRules(markRules)
logger := log.New(writeMarker, "", 0)
logger.Println("[INFO] colorful logs even in files, marker to mark them all!")
w.Flush()
f.Close()
output := catFile("/tmp/awesome.log") // $ cat /tmp/awesome.log
fmt.Print(output)
匹配器
MatchAll
匹配所有出现的指定字符串
aristotleQuote := "The more you know, the more you realize you don't know."
emphasized := marker.Mark(aristotleQuote, marker.MatchAll("know"), color.New(color.FgRed))
fmt.Println(emphasized)
MatchN
匹配前N次出现的指定字符串
boringLog := "[INFO] Nobody wants to read pale [INFO] tags."
brilliantLog := marker.Mark(boringLog, marker.MatchN("[INFO]", 1), color.New(color.FgBlue))
fmt.Println(brilliantLog)
MatchRegexp
使用正则表达式匹配
rhyme := "I scream, you all scream, we all scream for ice cream."
r, _ := regexp.Compile("([a-z]?cream)")
careAboutCream := marker.Mark(rhyme, marker.MatchRegexp(r), color.New(color.FgYellow))
fmt.Println(careAboutCream)
MatchSurrounded
匹配被特定字符包围的文本
sentence := "I pull out things surrounded by abcWHOA COLORSdef"
markedSurrounded := marker.Mark(sentence, marker.MatchSurrounded("abc", "def"), color.New(color.FgMagenta))
fmt.Println(markedSurrounded)
MatchBracketSurrounded
匹配被方括号包围的文本
sentence = "[INFO] This is what log lines look like"
markedSurrounded = marker.Mark(sentence, marker.MatchBracketSurrounded(), color.New(color.FgRed))
fmt.Println(markedSurrounded)
MatchParensSurrounded
匹配被圆括号包围的文本
sentence = "[ERROR] This is what (parens) lines look like"
markedSurrounded = marker.Mark(sentence, marker.MatchParensSurrounded(), color.New(color.FgBlue))
fmt.Println(markedSurrounded)
MatchTimestamp
匹配时间戳
goodOldTimes := "2006-01-02T15:04:05Z07:00 [INFO] Loading King of Fighters '97 ROM"
timestampMarked := marker.Mark(goodOldTimes, marker.MatchTimestamp(time.RFC3339), color.New(color.FgBlue))
fmt.Println(timestampMarked)
构建器模式
如果你想在同一字符串中标记不同的模式,可以使用构建器模式:
rhyme := "I scream, you all scream, we all scream for ice cream."
b := &marker.MarkBuilder{}
r, _ := regexp.Compile("([a-z]?cream)")
markedWithBuilder := b.SetString(rhyme).
Mark(marker.MatchN("for ice", 1), color.New(color.FgRed)).
Mark(marker.MatchAll("all"), color.New(color.FgMagenta)).
Mark(marker.MatchRegexp(r), color.New(color.FgYellow)).
Build()
fmt.Println(markedWithBuilder)
自定义匹配器
你可以创建自己的匹配器:
func MatchFirst(pattern string) marker.MatcherFunc {
return func(str string) marker.Match {
return marker.Match{
// 将第一个匹配的模式替换为%s
Template: strings.Replace(str, pattern, "%s", 1),
// 需要被Mark着色的模式,按顺序
Patterns: []string{pattern},
}
}
}
贡献
欢迎任何贡献来使Marker更好、功能更丰富。可以贡献你的特性(如更多的匹配器)、改进和修复。
更多关于golang终端字符串匹配与彩色标记插件库marker的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang终端字符串匹配与彩色标记插件库marker的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang终端字符串匹配与彩色标记插件库marker使用指南
marker是一个用于在终端输出中匹配字符串并添加彩色标记的Go库,非常适合日志高亮、关键词标记等场景。
安装
go get github.com/andreaskoch/go-marker
基本使用
1. 简单字符串匹配与标记
package main
import (
"fmt"
"github.com/andreaskoch/go-marker/marker"
)
func main() {
// 创建标记器
marker := marker.NewMarker(
marker.NewStringMatcher("error"), // 匹配"error"字符串
marker.WithColor(marker.Red), // 使用红色标记
)
// 应用标记
text := "This is an error message and another error"
markedText := marker.Mark(text)
fmt.Println(markedText)
}
2. 多关键词不同颜色标记
func multiColorMarking() {
// 创建多个标记规则
rules := []marker.Rule{
{
Matcher: marker.NewStringMatcher("error"),
Color: marker.Red,
},
{
Matcher: marker.NewStringMatcher("warning"),
Color: marker.Yellow,
},
{
Matcher: marker.NewStringMatcher("info"),
Color: marker.Green,
},
}
// 创建标记器
multiMarker := marker.NewMultiMarker(rules)
// 应用标记
text := "info: system started\nerror: disk full\nwarning: memory low"
markedText := multiMarker.Mark(text)
fmt.Println(markedText)
}
3. 正则表达式匹配
func regexMarking() {
// 创建正则匹配器
regexMatcher, err := marker.NewRegexMatcher(`\d{4}-\d{2}-\d{2}`) // 匹配日期格式
if err != nil {
panic(err)
}
// 创建标记器
marker := marker.NewMarker(
regexMatcher,
marker.WithColor(marker.Blue),
)
// 应用标记
text := "Today is 2023-05-15 and tomorrow is 2023-05-16"
markedText := marker.Mark(text)
fmt.Println(markedText)
}
高级功能
1. 自定义颜色
func customColor() {
// 使用ANSI颜色代码自定义颜色
customColor := marker.Color("\033[38;5;208m") // 橙色
marker := marker.NewMarker(
marker.NewStringMatcher("important"),
marker.WithColor(customColor),
)
text := "This is an important message"
fmt.Println(marker.Mark(text))
}
2. 组合匹配器
func combinedMatcher() {
// 创建组合匹配器(匹配error或warning)
matcher := marker.NewCombinedMatcher(
marker.NewStringMatcher("error"),
marker.NewStringMatcher("warning"),
)
marker := marker.NewMarker(
matcher,
marker.WithColor(marker.Magenta),
)
text := "error: something went wrong\nwarning: this might be a problem"
fmt.Println(marker.Mark(text))
}
3. 文件内容标记
func markFileContent(filename string) error {
// 读取文件内容
content, err := os.ReadFile(filename)
if err != nil {
return err
}
// 创建标记规则
rules := []marker.Rule{
{
Matcher: marker.NewStringMatcher("TODO"),
Color: marker.Yellow,
},
{
Matcher: marker.NewStringMatcher("FIXME"),
Color: marker.Red,
},
}
// 标记内容
markedContent := marker.NewMultiMarker(rules).Mark(string(content))
fmt.Println(markedContent)
return nil
}
实际应用示例:日志高亮
func highlightLogs() {
// 模拟日志数据
logs := `2023-05-15 10:00:00 [INFO] Application started
2023-05-15 10:05:23 [WARNING] Memory usage high
2023-05-15 10:07:45 [ERROR] Database connection failed
2023-05-15 10:10:00 [INFO] Retrying connection...`
// 定义高亮规则
rules := []marker.Rule{
{
Matcher: marker.NewRegexMatcher(`\[INFO\]`),
Color: marker.Green,
},
{
Matcher: marker.NewRegexMatcher(`\[WARNING\]`),
Color: marker.Yellow,
},
{
Matcher: marker.NewRegexMatcher(`\[ERROR\]`),
Color: marker.Red,
},
{
Matcher: marker.NewRegexMatcher(`\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}`),
Color: marker.Blue,
},
}
// 创建标记器
logMarker := marker.NewMultiMarker(rules)
// 高亮日志
highlightedLogs := logMarker.Mark(logs)
fmt.Println(highlightedLogs)
}
注意事项
- marker库基于ANSI颜色代码,确保你的终端支持ANSI颜色
- 复杂的正则表达式可能会影响性能,特别是在处理大文本时
- 标记后的字符串长度会增加(由于添加了颜色代码),如果需要精确控制输出长度需要注意
marker库提供了一种简单直观的方式来高亮终端输出中的关键信息,非常适合日志分析、调试输出等场景。通过组合不同的匹配器和颜色规则,可以创建出强大的文本高亮解决方案。