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?
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?
Jawaban:
Kamu bisa mencoba
grep pattern file | tail -1
atau
tac file | grep pattern | head -1
atau
tac file | grep -m1 pattern
grep -n
) di file aktual, saya pikir tac
cukup banyak yang harus dihindari, kecuali saya ingin melakukan pengurangan dengan wc -l
. Kalau tidak tac
dengan grep -m1
banyak artinya.
grep
akan berhenti bekerja setelah pertandingan pertama. tanpa -m 1
, grep
pertama-tama akan menemukan semua pola yang cocok dalam file , kemudian head
hanya akan menunjukkan yang pertama - jauh lebih efisien. Dennis, tolong pertimbangkan untuk memposting ini dalam jawaban yang terpisah!
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:
zq
dari 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
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 -1
dan lebih efisien juga.
cat
file dan pipa itu grep
. Anda dapat grep
mencari file langsung melalui grep pattern file
(dan kemudian gunakan tail
untuk mengembalikan hasil terakhir), seperti dalam jawaban Cakemox.
tac file | grep -m 1 pattern