Mendapatkan kecocokan terakhir dalam file menggunakan grep

58

Apa cara terbaik untuk mendapatkan hanya kecocokan terakhir dari ekspresi reguler dalam file menggunakan grep?

Juga, mungkinkah untuk mulai menangkap dari akhir file alih-alih dari awal dan berhenti ketika menemukan kecocokan pertama?

Biji pohon ek
sumber

Jawaban:

85

Kamu bisa mencoba

grep pattern file | tail -1

atau

tac file | grep pattern | head -1

atau

tac file | grep -m1 pattern
Cakemox
sumber
20
tac file | grep -m 1 pattern
Dennis Williamson
1
Dengan batasan tambahan bahwa saya ingin mendapatkan nomor baris ( grep -n) di file aktual, saya pikir taccukup banyak yang harus dihindari, kecuali saya ingin melakukan pengurangan dengan wc -l. Kalau tidak tacdengan grep -m1banyak artinya.
Nick Merrill
1
Saya ingin melihat versi yang lebih performan daripada ini, karena saya mencoba mencari file 20GB.
Jeff
Jawaban @DennisWilliamson jauh lebih baik karena grepakan berhenti bekerja setelah pertandingan pertama. tanpa -m 1, greppertama-tama akan menemukan semua pola yang cocok dalam file , kemudian headhanya akan menunjukkan yang pertama - jauh lebih efisien. Dennis, tolong pertimbangkan untuk memposting ini dalam jawaban yang terpisah!
gilad mayani
1

Untuk seseorang yang bekerja dengan file teks besar di Unix / Linux / Mac / Cygwin. Jika Anda menggunakan Windows, periksa ini tentang perangkat Linux di Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows .

Seseorang dapat mengikuti alur kerja ini untuk memiliki kinerja yang baik:

  1. kompres dengan gzip
  2. gunakan zindex (di github: https://github.com/mattgodbolt/zindex ) untuk mengindeks file dengan kunci yang sesuai
  3. meminta file yang diindeks dengan zqdari paket.

Kutipan dari github readme:

Membuat indeks

zindex perlu diberi tahu bagian mana dari setiap baris yang merupakan indeks. Ini dapat dilakukan dengan ekspresi reguler, dengan bidang, atau dengan menyalurkan setiap baris melalui program eksternal.

Secara default zindex membuat indeks file.gz.zindex ketika diminta untuk mengindeks file.gz.

Contoh:

buat indeks pada baris yang cocok dengan ekspresi reguler numerik. Grup tangkapan menunjukkan bagian yang akan diindeks, dan opsi menunjukkan setiap baris memiliki indeks numerik yang unik.

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

Contoh: buat indeks pada bidang kedua file CSV:

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

Contoh:

membuat indeks pada bidang JSON orderId.id di salah satu item dalam array tindakan root dokumen (memerlukan jq). Kueri jq membuat larik semua orderId.ids, kemudian bergabung dengan spasi untuk memastikan setiap baris individu disalurkan ke jq menciptakan satu baris output, dengan beberapa kecocokan dipisahkan oleh spasi (yang merupakan pemisah default).

$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'" 

Meminta indeks

Program zq digunakan untuk menanyakan indeks. Itu diberikan nama file terkompresi dan daftar permintaan. Sebagai contoh:

$ zq file.gz 1023 4443 554 

Juga dimungkinkan untuk menghasilkan berdasarkan nomor baris, jadi untuk mencetak baris 1 dan 1000 dari file:

$ zq file.gz --line 1 1000
biocyberman
sumber
1

Saya selalu menggunakan kucing (tapi ini membuatnya sedikit lebih lama): cat file | grep pattern | tail -1

Saya akan menyalahkan guru kursus admin linux saya di kampus yang suka kucing :))))

- Anda tidak harus membuat file cat terlebih dahulu sebelum mengambilnya. grep pattern file | tail -1dan lebih efisien juga.

Ismail Guneydas
sumber
6
Ini hanya bagian pertama dari jawaban Cakemox, kecuali lebih buruk.
augurar
Ini bekerja, tetapi tidak langkah-langkah yang tidak perlu. Untuk penggunaan ringan, solusi ini berfungsi dengan baik, tetapi tidak bekerja dengan baik. Alasannya adalah karena Anda tidak perlu catfile dan pipa itu grep. Anda dapat grepmencari file langsung melalui grep pattern file(dan kemudian gunakan tailuntuk mengembalikan hasil terakhir), seperti dalam jawaban Cakemox.
jvriesem