Mencoba men-debug masalah dengan server dan satu-satunya file log saya adalah file log 20GB (bahkan tanpa stempel waktu! Mengapa orang menggunakan System.out.println()
sebagai logging? Dalam produksi ?!)
Menggunakan grep, saya telah menemukan area file yang ingin saya lihat, baris 347340107.
Selain melakukan sesuatu seperti
head -<$LINENUM + 10> filename | tail -20
... yang perlu head
membaca 347 juta baris pertama file log, adakah perintah cepat dan mudah yang akan membuang baris 347340100 - 347340200 (misalnya) ke konsol?
pembaruan Saya benar-benar lupa bahwa grep dapat mencetak konteks sekitar pertandingan ... ini berfungsi dengan baik. Terima kasih!
Jawaban:
dengan GNU-grep bisa Anda katakan
sumber
Saya menemukan dua solusi lain jika Anda tahu nomor baris tetapi tidak ada yang lain (tidak ada grep):
Dengan asumsi Anda membutuhkan jalur 20 hingga 40,
atau
sumber
41q
memerintahkan sed untuk berhenti pada baris41
.Metode 3 efisien pada file besar
cara tercepat untuk menampilkan garis tertentu
sumber
Tidak ada, file tidak dialamatkan dengan baris.
Tidak ada cara waktu konstan untuk menemukan awal baris n dalam file teks. Anda harus melakukan streaming melalui file dan menghitung baris baru.
Gunakan alat paling sederhana / tercepat yang harus Anda lakukan. Bagi saya, menggunakan
head
membuat banyak lebih masuk akal daripadagrep
, karena yang terakhir ini cara yang lebih rumit. Saya tidak mengatakan "grep
lambat", sebenarnya tidak, tapi saya akan terkejut jika lebih cepat daripadahead
untuk kasus ini. Itu akan menjadi bug padahead
dasarnya.sumber
Bagaimana dengan:
Saya tidak mengujinya, tetapi saya pikir itu akan berhasil.
sumber
Saya lebih suka masuk ke
less
dan:43210
untuk melakukan hal yang samadan hal-hal seperti itu.
Bahkan lebih baik: tekan vuntuk mulai mengedit (dalam vim, tentu saja!), Di lokasi itu. Sekarang, perhatikan bahwa
vim
memiliki ikatan kunci yang sama!sumber
Saya pertama kali membagi file menjadi beberapa yang lebih kecil seperti ini
dan kemudian klik pada file yang dihasilkan.
sumber
Anda dapat menggunakan
ex
perintah, editor Unix standar (bagian dari Vim sekarang), mistampilkan satu baris (mis. baris kedua):
sintaks sed yang sesuai:
sed -n '2p' file.txt
rentang garis (mis. 2-5 baris):
sintaks sed:
sed -n '2,5p' file.txt
dari baris yang diberikan sampai akhir (mis. 5 hingga akhir file):
sintaks sed:
sed -n '2,$p' file.txt
beberapa rentang garis (mis. 2-4 dan 6-8 baris):
sintaks sed:
sed -n '2,4p;6,8p' file.txt
Perintah di atas dapat diuji dengan file tes berikut:
Penjelasan:
+
atau-c
diikuti oleh perintah - jalankan perintah (vi / vim) setelah file dibaca,-s
- mode diam, juga menggunakan terminal saat ini sebagai output default,q
diikuti oleh-c
adalah perintah untuk berhenti editor (tambahkan!
untuk melakukan paksa berhenti, misalnya-scq!
).sumber
Jika nomor baris Anda 100 untuk dibaca
sumber
Dapatkan
ack
Ubuntu / Debian instal:
Lalu lari:
Contoh:
Dari
$ man ack
:sumber
--lines
parameter telah dihapus.sed akan perlu membaca data juga untuk menghitung garis. Satu-satunya cara pintas dimungkinkan adalah adanya konteks / urutan file untuk beroperasi. Misalnya jika ada baris log yang diawali dengan waktu / tanggal lebar tetap, dll. Anda bisa menggunakan utilitas lihat unix untuk pencarian biner melalui file untuk tanggal / waktu tertentu
sumber
Menggunakan
Di sini Anda akan mendapatkan nomor baris tempat pertandingan berlangsung.
Sekarang Anda dapat menggunakan perintah berikut untuk mencetak 100 baris
atau Anda bisa menggunakan "sed" juga
sumber
Dengan
sed -e '1,N d; M q'
Anda akan mencetak garis N + 1 hingga M. Ini mungkin sedikit lebih baik daripadagrep -C
itu karena tidak mencoba untuk mencocokkan garis dengan suatu pola.sumber
-e
opsional di sini.Membangun jawaban Sklivvz, inilah fungsi bagus yang bisa dimasukkan ke dalam
.bash_aliases
file. Ini efisien pada file besar saat mencetak barang dari depan file.sumber
Untuk menampilkan garis dari
<textfile>
dengan nya<line#>
, lakukan ini:Jika Anda ingin cara yang lebih kuat untuk menunjukkan serangkaian garis dengan ekspresi reguler - Saya tidak akan mengatakan mengapa grep adalah ide yang buruk untuk melakukan ini, itu seharusnya cukup jelas - ungkapan sederhana ini akan menunjukkan rentang Anda dalam single pass yang Anda inginkan ketika berhadapan dengan file teks ~ 20GB:
(tip: jika regex Anda ada
/
di dalamnya, gunakan sesuatu sepertim!<regex>!
sebagai gantinya)Ini akan mencetak
<filename>
mulai dengan garis yang cocok<regex1>
hingga (dan termasuk) garis yang cocok<regex2>
.Tidak perlu penyihir untuk melihat bagaimana beberapa penyesuaian dapat membuatnya lebih kuat.
Hal terakhir: perl, karena merupakan bahasa yang matang, memiliki banyak perangkat tambahan tersembunyi untuk mendukung kecepatan dan kinerja. Dengan mengingat hal ini, menjadikannya pilihan yang jelas untuk operasi seperti itu karena pada awalnya dikembangkan untuk menangani file log besar, teks, database, dll.
sumber
Anda dapat mencoba perintah ini:
sumber
Mudah dengan perl! Jika Anda ingin mendapatkan baris 1, 3 dan 5 dari sebuah file, katakan / etc / passwd:
sumber
Saya terkejut hanya satu jawaban lain (oleh Ramana Reddy) yang disarankan untuk menambahkan nomor baris ke output. Pencarian berikut untuk nomor baris yang diperlukan dan warna output.
sumber