web-dev-qa-db-ja.com

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

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

また、ファイルの最初からではなく最後からgreppingを開始し、最初の一致が見つかったときに停止することはできますか?

63
Acorn

あなたは試すことができます

grep pattern file | tail -1

または

tac file | grep pattern | head -1

または

tac file | grep -m1 pattern
95
Cakemox

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

私は猫が大好きな大学のLinux管理コースの先生を責めます:))))

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

1
Ismail Guneydas

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.idsの配列を作成し、それらをスペースで結合して、jqにパイプされた個々の行が出力の1行を作成するようにします。

$ 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
biocyberman