golang终端字符串匹配与彩色标记插件库marker的使用

Golang终端字符串匹配与彩色标记插件库marker的使用

简介

Marker是一个用于在终端输出中匹配和标记字符串的Golang库,可以轻松实现彩色输出效果。它使用fatih/color库来实现终端输出的彩色化。

Marker Logo

安装

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)

MatchAll示例

标记日志流

你可以将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)

MatchN示例

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)

包围匹配示例1

MatchBracketSurrounded

匹配被方括号包围的文本

sentence = "[INFO] This is what log lines look like"
markedSurrounded = marker.Mark(sentence, marker.MatchBracketSurrounded(), color.New(color.FgRed))
fmt.Println(markedSurrounded)

包围匹配示例2

MatchParensSurrounded

匹配被圆括号包围的文本

sentence = "[ERROR] This is what (parens) lines look like"
markedSurrounded = marker.Mark(sentence, marker.MatchParensSurrounded(), color.New(color.FgBlue))
fmt.Println(markedSurrounded)

包围匹配示例3

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)
}

注意事项

  1. marker库基于ANSI颜色代码,确保你的终端支持ANSI颜色
  2. 复杂的正则表达式可能会影响性能,特别是在处理大文本时
  3. 标记后的字符串长度会增加(由于添加了颜色代码),如果需要精确控制输出长度需要注意

marker库提供了一种简单直观的方式来高亮终端输出中的关键信息,非常适合日志分析、调试输出等场景。通过组合不同的匹配器和颜色规则,可以创建出强大的文本高亮解决方案。

回到顶部