使用grep只在文件中获取正则表达式的最终匹配的最佳方法是什么?

此外,是否可以从文件末尾而不是开始开始grepping并在文件停止时停止找到第一场比赛?

#1 楼

您可以尝试

grep pattern file | tail -1




tac file | grep pattern | head -1




tac file | grep -m1 pattern


评论


tac文件| grep -m 1模式

–丹尼斯·威廉姆森
2010年11月2日,0:54

加上我想在实际文件中获得行号(grep -n)的附加约束,我认为必须避免使用tac,除非我想对wc -l进行一些减法。否则,使用grep -m1进行tac很有意义。

–尼克·美林(Nick Merrill)
2014年7月4日在18:48



我很想看到一个性能更高的版本,因为我正在尝试搜索20GB的文件。

–杰夫
2015年9月4日在17:56

@DennisWilliamson的答案要好得多,因为grep将在首场比赛后停止工作。如果不使用-m 1,grep将首先在文件中找到所有匹配的模式,然后head仅显示第一个-效率低得多。丹尼斯,请考虑将其发布在单独的答案中!

– Gilad mayani
17年5月18日在16:33



要在配管时保持grep颜色,请使用--color = always。尾随grepping多个文件时效果很好(例如grep pattern -r path),但是不建议对多个文件使用tac选项(可能会占用大量内存)。

– Noam Manos
20-2-25在11:35

#2 楼

对于在Unix / Linux / Mac / Cygwin中使用巨大文本文件的人。如果您使用Windows,请在Windows上查看有关Linux工具的信息:https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows。

可以遵循此工作流程以取得良好的性能: /github.com/mattgodbolt/zindex),以
适当的键为文件建立索引
,从软件包中使用zq查询已索引的文件。

引用自github自述文件:

创建索引


需要告诉zindex每行的哪一部分构成索引。
可以通过正则表达式,按字段来完成,或通过外部程序通过管道将每个
行进行管道传输。

默认情况下,zindex在被要求
索引file.gz时创建file.gz.zindex的索引。

示例:

在与数字正则表达式匹配的行上创建索引。捕获组指示要索引的部分,
,选项显示每行都有唯一的数字索引。

$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique


示例:
在CSV文件的第二个字段上创建索引:

$ zindex file.gz --delimiter , --field 2 


示例:


JSON上创建索引文档根目录
actions数组中的任何项目中的orderId.id字段(需要jq)。 jq查询会创建一个包含所有
orderId.ids的数组,然后将它们与一个空格连接起来,以确保通过管道传递给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 pattern file | tail -1,而且效率更高。

评论


这只是Cakemox回答的第一部分,但更糟的是。

– augurar
17年9月15日在23:57

它可以工作,但是可以执行不必要的步骤。对于轻型用途,此解决方案效果很好,但效果不佳。原因是因为您不需要整理文件并将其通过管道传输到grep。您可以让grep直接通过grep模式文件搜索文件(然后使用tail返回最后结果),就像Cakemox的答案一样。

– jvriesem
19年7月26日在17:54