grepを使用してファイル内の最後の一致を取得する


58

grepを使用してファイル内の正規表現の最終一致のみを取得する最良の方法は何ですか?

また、ファイルの先頭からではなく末尾からgrepを開始し、最初の一致が見つかった時点で停止することは可能ですか?

回答:


85

試すことができます

grep pattern file | tail -1

または

tac file | grep pattern | head -1

または

tac file | grep -m1 pattern

20
tac file | grep -m 1 pattern
デニスウィリアムソン

1
grep -n実際のファイルで行番号()を取得したいという制約が追加されたため、でtac減算を行いたくない限り、ほとんど回避する必要があると思いますwc -l。それ以外の場合tacgrep -m1、非常に理にかなっています。
ニックメリル14

1
20GBのファイルを検索しようとしているので、これよりもパフォーマンスの高いバージョンが欲しいです。
ジェフ

@DennisWilliamsonの答えはgrep、最初の試合後に機能しなくなるため、はるかに優れています。を使用しない-m 1場合、grep最初にファイル内のすべての一致するパターンが検出され、次に最初のパターンheadのみが表示されます。デニス、これを別の回答に投稿することを検討してください!
ギラッドマヤニ17年

1

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のreadmeから引用:

インデックスを作成する

zindexは、各行のどの部分がインデックスを構成するかを通知する必要があります。これは、正規表現、フィールド、または外部プログラムを介して各行をパイピングすることにより実行できます。

デフォルトでは、zindexはfile.gzにインデックスを付けるように求められたときにfile.gz.zindexのインデックスを作成します。

例:

数値の正規表現に一致する行にインデックスを作成します。キャプチャグループは、インデックスを作成するパーツを示し、オプションは各行に一意の数値インデックスがあることを示します。

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

例:CSVファイルの2番目のフィールドにインデックスを作成します。

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

例:

ドキュメントルートのアクション配列内の任意のアイテムのJSONフィールドorderId.idにインデックスを作成します(jqが必要です)。jqクエリは、すべてのorderId.idの配列を作成し、それらをスペースで結合して、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

1

私は常に猫を使用しています(しかし、これは少し長くなります): cat file | grep pattern | tail -1

私は、大学でLinuxの管理者で猫を愛する教師を非難します:))))

-ファイルをgrepする前に最初にcatする必要はありません。grep pattern file | tail -1また、より効率的です。


6
これは、Cakemoxの答えの最初の部分にすぎませんが、さらに悪い点はあります。
8

動作しますが、不要な手順を実行します。使用量が少ない場合、このソリューションは正常に機能しますが、うまく機能しません。その理由はcat、ファイルに移動してにパイプする必要がないからですgrep。Cakemoxの答えのように、grep経由でファイルを直接検索することができますgrep pattern file(そしてtail、最後の結果を返すために使用します)。
jvriesem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.