使用grep获取文件中正则expression式的最终匹配的最好方法是什么?
另外,是否有可能从文件的末尾开始grepping,而不是从开始和停止find第一个匹配?
你可以试试
grep pattern file | tail -1
要么
tac file | grep pattern | head -1
要么
tac file | grep -m1 pattern
我总是使用猫(但这使得它更长一点): cat file | grep pattern | tail -1
cat file | grep pattern | tail -1
我会责怪我的Linuxpipe理课程老师在大学谁爱猫:))))
– 你不必先掠夺文件。 grep pattern file | tail -1
grep pattern file | tail -1
,也更有效率。
对于在Unix / Linux / Mac / Cygwin中使用大型文本文件的人来说, 如果你使用Windows检查了这个在Windows中的Linux工具: https ://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows。
可以按照这个工作stream程来获得良好的性能:
zq
查询索引文件。 从其github自述引述:
创build一个索引
zindex需要被告知每一行的哪一部分构成索引。 这可以通过正则expression式,按字段或通过在外部程序中对每行进行pipe道来完成。
默认情况下,zindex在索引file.gz时会创build一个file.gz.zindex的索引。
例:
在匹配数字正则expression式的行上创build一个索引。 捕获组指示要索引的部分,选项显示每行都有唯一的数字索引。
$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique
例如:在CSV文件的第二个字段上创build一个索引:
$ zindex file.gz --delimiter , --field 2
例:
在文档根的动作数组(需要jq)的任何项目中的JSON字段orderId.id上创build一个索引。 jq查询创build了一个包含所有orderId.id的数组,然后用一个空格连接它们,以确保每个单独的行都被传送到jq创build一行输出,多个匹配由空格分隔(这是默认的分隔符)。
$ 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