Pertanyaan Cetak file yang melewati garis X pertama di Bash


Saya memiliki file yang sangat panjang yang ingin saya cetak tetapi melewatkan 1e6 baris pertama misalnya. Saya melihat ke halaman cat man tapi saya tidak melihat ada opsi untuk melakukan ini. Saya mencari perintah untuk melakukan ini atau program bash sederhana.


368
2018-03-03 02:19


asal


Jawaban:


Anda akan membutuhkan ekor.

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

Jika Anda benar-benar perlu SKIP sejumlah baris tertentu, gunakan

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

Artinya, jika Anda ingin melewati garis N, Anda mulai mencetak garis N +1. Contoh:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

Jika Anda hanya ingin melihat baris terakhir begitu banyak, abaikan "+":

$ tail -n <N> <filename>
< last N lines of file. >

597
2018-03-03 02:24



Jika Anda memiliki ekor GNU yang tersedia di sistem Anda, Anda dapat melakukan hal berikut:

tail -n +1000001 huge-file.log

Ini adalah + karakter yang melakukan apa yang Anda inginkan. Mengutip dari halaman manual:

Jika karakter pertama K (jumlah byte atau garis) adalah a   `+ ', cetak dimulai dengan item Kth dari awal setiap file.

Jadi, seperti yang tercantum dalam komentar, memasukkan +1000001 mulai mencetak dengan item pertama setelah 1.000.000 baris pertama.


80
2018-03-03 02:28



Cara termudah yang saya temukan untuk menghapus sepuluh baris pertama file:

$ sed 1,10d file.txt

64
2017-10-17 07:17



Versi kurang verbose dengan AWK:

awk 'NR > 1e6' myfile.txt

Tapi saya akan merekomendasikan menggunakan angka integer.


21
2018-04-26 14:31



Hanya untuk mengusulkan a sed alternatif. :) Untuk melewati satu juta baris pertama, cobalah |sed '1,1000000d'.

Contoh:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005

13
2018-01-26 06:53



Jika Anda ingin melihat 10 baris pertama, Anda dapat menggunakan sed seperti di bawah ini:

sed -n '1,10 p' myFile.txt

atau jika Anda ingin melihat garis dari 20 hingga 30 Anda dapat menggunakan:

sed -n '20,30 p' myFile.txt

12
2017-12-20 10:04



jika Anda ingin melewati dua baris pertama
tail -n +3 <filename>

jika Anda ingin melewati garis x pertama
tail -n +$((x+1)) <filename> 


12
2017-07-09 18:10



Skrip shell ini berfungsi dengan baik untuk saya:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

Digunakan dengan file contoh ini (file.txt):

one
two
three
four
five
six

Perintah (akan mengekstrak dari baris kedua ke baris keempat):

edu@debian5:~$./script.sh 2 4 file.txt

Output dari perintah ini:

two
three
four

Tentu saja, Anda dapat memperbaikinya, misalnya dengan menguji bahwa semua nilai argumen adalah yang diharapkan :-)


10
2018-03-31 13:28



Menggunakan sed delete perintah dengan alamat jangkauan. Sebagai contoh:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

Alternatif lain, jika Anda hanya ingin mencetak jangkauan yang dikenal, gunakan perintah cetak dengan -n bendera:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

Solusi ini harus bekerja dengan andal pada semua sistem UNIX, terlepas dari keberadaan utilitas GNU.


8
2017-12-02 16:19