Saya kira semua orang tahu utilitas Linux cmd line head
dan tail
. head
memungkinkan Anda untuk mencetak garis X pertama file, tail
melakukan hal yang sama tetapi mencetak akhir file. Apa perintah yang baik untuk mencetak tengah file? sesuatu seperti middle --start 10000000 --count 20
(cetak baris 10'000'000 ke 10'000'010).
Saya mencari sesuatu yang akan menangani file besar secara efisien. Saya mencoba tail -n 10000000 | head 10
dan sangat lambat.
Jawaban:
Anda mungkin bisa mempercepatnya sedikit seperti ini:
Dalam perintah-perintah itu, opsi
-n
menyebabkansed
"menekan pencetakan otomatis ruang pola". Thep
perintah "print [s] ruang pola saat ini" danq
perintah "Segera berhenti [s] script sed tanpa pengolahan lagi masukan ..." Kutipan berasal darised
man
halaman .Ngomong-ngomong, perintahmu
dimulai pada baris sepersejuta dari akhir file, sedangkan perintah "tengah" Anda tampaknya mulai pada sepersejuta dari awal yang setara dengan:
Masalahnya adalah bahwa untuk file yang tidak disortir dengan garis panjang variabel, proses apa pun harus melalui file penghitungan baris baru. Tidak ada cara untuk pintas itu.
Namun, jika file diurutkan (file log dengan stempel waktu, misalnya) atau memiliki garis panjang tetap, maka Anda dapat mencari ke dalam file berdasarkan posisi byte. Pada contoh file log, Anda bisa melakukan pencarian biner untuk berbagai kali sebagai script Python saya di sini * tidak. Dalam kasus file dengan catatan panjang tetap, sangat mudah. Anda hanya mencari
linelength * linecount
karakter ke dalam file.* Saya tetap ingin memposting pembaruan lain untuk skrip itu. Mungkin aku akan menyiasatinya suatu hari nanti.
sumber
sed
versi Charles'middle
fungsi:middle() { local s=$1 c=$2; shift 2; sed -n "$s,$(($s + $c -1))p; $(($s + $c))q" "$@"; }
. Ini akan menangani beberapa argumen file, nama file dengan spasi, dll. Banyak file diproses bersama seolah-olah mereka telah di-catted dengan cara yang sama sepertised
biasanya (jadi 1000 file 100 tengah1 file2 akan merentang di ujung file pertama ke awal) dari yang kedua jika yang pertama memiliki kurang dari 1100 baris).middle startline count filename
atau beberapa nama file:middle startline count file1 file2 file3
atau dengan pengalihan:middle startline count < filename
atau dalam sebuah pipa:some_command |
hitung garis tengah tengah` ataucat file* | middle startline count
Saya menemukan penggunaan berikut
sed
Semoga bermanfaat bagi seseorang!
sumber
sed -n
argumen kedua yang membuatnya cukup mudah dibaca.extract_lines(){sed -n "$1,+$2p" <file>}
yang menulis ke stdout.Ini pertama kali saya memposting di sini! Bagaimanapun, ini mudah. Katakanlah Anda ingin menarik garis 8872 dari file Anda bernama file.txt. Inilah cara Anda melakukannya:
cat -n file.txt | grep '^ * 8872'
Sekarang pertanyaannya adalah menemukan 20 baris setelah ini. Untuk mencapai ini Anda lakukan
cat -n file.txt | grep -A 20 '^ * 8872'
Untuk garis di sekitar atau sebelum lihat flag -B dan -C di manual grep.
sumber
cat -n file.txt | grep '^ *1'
hasilkan semua garis yang memiliki 1 di sisi kanan mereka. Bagaimana cara output jalur 1 dengan teknik ini? Saya tahu saya bisa menuju ke-n 1 .... tapi bagaimana cara menggunakan grep?Jawaban sed Dennis adalah cara untuk pergi. Tetapi hanya dengan menggunakan kepala & ekor, di bawah bash:
Ini memindai $ 1 + $ 2 baris pertama dua kali, jadi jauh lebih buruk daripada jawaban Dennis. Tapi Anda tidak perlu mengingat semua surat-surat sed untuk menggunakannya ....
sumber
$[...]
sudah usang, setidaknya di Bash. Selain itu, Anda kehilangan parameter file.middle 10 10 < /var/log/auth.log
.Gunakan perintah berikut untuk mendapatkan rentang garis tertentu
Di sini debug.log adalah file saya yang terdiri dari kurangnya garis dan saya digunakan untuk mencetak garis dari 1220974 nomor baris ke 1513793 ke file test.log. Saya harap ini akan membantu untuk menangkap rentang garis.
sumber
Versi oneliner ruby.
Ini bisa bermanfaat bagi seseorang. Solusi dengan 'sed' yang disediakan oleh Dennis dan Dox sangat bagus, bahkan karena tampaknya lebih cepat.
sumber
Anda dapat menggunakan 'nl'.
sumber
Misalnya orang awk ini akan mencetak garis antara 20 dan 40
sumber
Jika Anda tahu numebr baris, katakan Anda ingin mendapatkan baris 1, 3 dan 5 dari file, katakan / etc / passwd:
sumber
Perl adalah raja:
sumber