go - 在 Golang 中查找模式的字节偏移量

标签 go

我们可以通过以下方式从文件中找到模式的字节偏移量 “grep -ob 模式文件名”; 但是,grep 不是 utf8 安全的。 如何在 Go 中找到模式的字节偏移量?该文件是进程日志,可以是TB。

这就是我想在 Go 中得到的:

$ cat fname
hello world
findme
hello 世界
findme again

...

$ grep -ob findme fname

12:findme
32:findme

最佳答案

FindAllStringIndex(s string, n int)返回表达式的所有连续匹配的字节开始/结束索引(即 slice ):

package main

import "fmt"
import "io/ioutil"
import "regexp"

func main() {
    fname := "C:\\Users\\UserName\\go\\src\\so56798431\\fname"
    b, err := ioutil.ReadFile(fname)
    if err != nil {
      panic(err)
    }

    re, err := regexp.Compile("findme")
    if err != nil {
      // handle error
    }
    fmt.Println(re.FindAllStringIndex(string(b), -1))
}

输出:

[[12 18] [32 38]]

注意:我在 Microsoft Windows 上执行此操作,但将文件保存为 UNIX 格式(换行);如果输入文件以 Windows 格式保存(回车和换行),字节偏移量将分别增加到 13 和 35。

更新:对于大文件,使用 bufio.Scanner ;例如:

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
    "regexp"
)

func main() {
    fname, err := os.Open("C:\\Users\\UserName\\go\\src\\so56798431\\fname")
    if err != nil {
        log.Fatal(err)
    }
    defer fname.Close()

    re, err := regexp.Compile("findme")
    if err != nil {
      // handle error
    }

    scanner := bufio.NewScanner(fname)
    bytesRead := 0
    for scanner.Scan() {
        b := scanner.Text()
        //fmt.Println(b)
        results := re.FindAllStringIndex(b, -1)
        for _, result := range results {
            fmt.Println(bytesRead + result[0])
        }
        // account for UNIX EOL marker
        bytesRead += len(b) + 1
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

输出:

12

32

关于go - 在 Golang 中查找模式的字节偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798431/

相关文章:

javascript - 将 jQuery.ajax() 替换为 Go REST API 端点的 fetch() - 空负载

go - 缩短 Go/Golang 中导入的变量导出?

go - cgo:Go 内存中的 Go 指针

go - 如何从 gorm 中的模型中获取表名?

string - 使用字符串作为函数名 - golang

xml - Golang xml.Unmarshal 任意元素

java - 使用 os.exec 运行的应用程序无法正确加载 java 库

mysql - 限制最大准备语句数

mysql - 如何将用户的输入传递到 INSERT 查询(MySQL)?去

go - 在 Go 中测试通过 json http 响应返回的错误