如何在很长的行上进行类似 grep 的搜索?

问题描述 投票:0回答:2

grep 非常擅长查找与模式匹配的行。但是,如果您有一个包含极长行的文件(例如 100MB 文件),并且您想在其中查找与模式匹配的块,该怎么办?

对于每个匹配,您需要打印字符偏移量和匹配的字符串,并在两侧添加额外的字符以供上下文使用。

在Python中,你可以写这样的东西(需要边界检查):

[(m.start(), s[m.start()-50:m.end()+50]) for m in re.finditer(regex, s)]

但是有什么方法可以使用标准 Linux 命令行工具来完成相同的操作吗?

linux bash grep
2个回答
2
投票

对于每个匹配,您需要打印偏移量和匹配的字符串,并在两侧添加额外的字符作为上下文。

您可以使用 awk 来做到这一点,如下所示:

awk '{
  i = 1
  while (match(substr($0, i), /regex/)) {
    off = i + RSTART - 1
    print off, substr($0, off > 50 ? off - 50 : 1, RLENGTH + 100)
    i = off + RLENGTH
  }
}' file

0
投票

如何截断 grep 或 ack 返回的长匹配行 假设该行适合内存:

grep -Eo '.{0,15}needle.{0,15}' longlines.txt

如果这些行不一定进入内存,请查看

bgrep
https://unix.stackexchange.com/questions/223078/best-way-to-grep-a-big-binary-file /758528#758528

bgrep `printf %s needle | od -t x1 -An -v | tr -d '\n '` myfile.bin
© www.soinside.com 2019 - 2024. All rights reserved.