Unix
使用 grep 獲取文件中的最後一個匹配項
使用 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 。
可以遵循此工作流程以獲得良好的性能:
- 用 gzip 壓縮
- 使用 zindex (在 github 上: https://github.com/mattgodbolt/zindex)用適當的鍵索引文件
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