使用 grep 获取文件中的最后一个匹配项

使用 grep 获取文件中的最后一个匹配项

使用 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

可以遵循此工作流程来获得良好的性能:

  1. 使用 gzip 压缩
  2. 使用 zindex (在 github 上: https://github.com/mattgodbolt/zindex)使用适当的键对文件进行索引
  3. 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 将列出找到该模式的文件名。

相关内容