grep 非常擅长查找与模式匹配的行。但是,如果您有一个包含极长行的文件(例如 100MB 文件),并且您想在其中查找与模式匹配的块,该怎么办?
对于每个匹配,您需要打印字符偏移量和匹配的字符串,并在两侧添加额外的字符以供上下文使用。
在Python中,你可以写这样的东西(需要边界检查):
[(m.start(), s[m.start()-50:m.end()+50]) for m in re.finditer(regex, s)]
但是有什么方法可以使用标准 Linux 命令行工具来完成相同的操作吗?
对于每个匹配,您需要打印偏移量和匹配的字符串,并在两侧添加额外的字符作为上下文。
您可以使用 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
如何截断 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