Unix

使用 grep 獲取文件中的最後一個匹配項

  • March 10, 2022

使用 grep 在文件中僅獲取正則表達式的最終匹配的最佳方法是什麼?

另外,是否可以從文件末尾而不是開頭開始 grepping 並在找到第一個匹配項時停止?

你可以試試

grep pattern file | tail -1

或者

tac file | grep pattern | head -1

或者

tac file | grep -m1 pattern

對於在 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 自述文件:

創建索引

zindex 需要被告知每行的哪一部分構成索引。這可以通過正則表達式、欄位或通過外部程序通過管道傳輸每一行來完成。

預設情況下,當要求索引 file.gz 時,zindex 會創建 file.gz.zindex 的索引。

例子:

在匹配數字正則表達式的行上創建索引。擷取組指示要索引的部分,選項顯示每行都有一個唯一的數字索引。

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

範例:在 CSV 文件的第二個欄位上創建索引:

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

例子:

在文件根的操作數組中的任何項目中的 JSON 欄位 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

引用自:https://serverfault.com/questions/197123