使用 grep 获取文件中正则表达式的最终匹配的最佳方法是什么?
另外,是否可以从文件末尾而不是开头开始 grepping 并在找到第一个匹配项时停止?
答案1
你可以尝试
grep pattern file | tail -1
或者
tac file | grep pattern | head -1
或者
tac file | grep -m1 pattern
答案2
对于在 Unix/Linux/Mac/Cygwin 中处理大量文本文件的人来说。如果您使用 Windows,请查看有关 Windows 中的 Linux 工具:https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows。
可以遵循此工作流程来获得良好的性能:
- 使用 gzip 压缩
- 使用 zindex (在 github 上: https://github.com/mattgodbolt/zindex)使用适当的键对文件进行索引
zq
从包中查询索引文件。
引用自其 github readme:
创建索引
zindex 需要被告知每行的哪个部分构成索引。这可以通过正则表达式、字段或通过外部程序传输每行来完成。
默认情况下,当要求索引 file.gz 时,zindex 会创建 file.gz.zindex 的索引。
例子:
在与数字正则表达式匹配的行上创建索引。捕获组指示要索引的部分,选项显示每行都有一个唯一的数字索引。
$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique
示例:在 CSV 文件的第二个字段上创建索引:
$ zindex file.gz --delimiter , --field 2
例子:
在文档根目录的 Actions 数组中的任何项目中,为 JSON 字段 orderId.id 创建索引(需要 jq)。jq 查询会创建所有 orderId.id 的数组,然后使用空格将它们连接起来,以确保传输到 jq 的每一行都会创建一行输出,其中多个匹配项用空格分隔(这是默认分隔符)。
$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'"
查询索引
zq 程序用于查询索引。它给出了压缩文件的名称和查询列表。例如:
$ zq file.gz 1023 4443 554
也可以按行号输出,因此要从文件中打印第 1 行和第 1000 行:
$ zq file.gz --line 1 1000
答案3
我总是使用 cat (但这会使方法更长一些):cat file | grep pattern | tail -1
我要怪罪我大学的 Linux 管理课程老师,他喜欢猫 :))))
-- 您不必在 grep 之前先对文件进行 cat 操作。grep pattern file | tail -1
而且效率也更高。
答案4
如果有多个文件,请使用 inline-for:
for a in *.txt; do grep "pattern" $a /dev/null | tail -n 1; done
/dev/null 提供了第二个文件,因此 grep 将列出找到该模式的文件名。