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

使用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程来获得良好的性能:

    1. 用gzip压缩
    2. 使用zindex(在github上: https : //github.com/mattgodbolt/zindex )用适当的键索引文件
    3. 使用包中的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