Jawaban:
Anda dapat menggunakan ini untuk menghapus dua baris pertama :
tail -n +3 foo.txt
dan ini untuk menghilangkan dua baris terakhir :
head -n -2 foo.txt
(dengan asumsi file berakhir dengan \n
untuk yang terakhir)
Sama seperti untuk penggunaan standar tail
dan head
operasi ini tidak merusak. Gunakan >out.txt
jika Anda ingin mengarahkan output ke beberapa file baru:
tail -n +3 foo.txt >out.txt
Dalam hal out.txt
sudah ada, itu akan menimpa file ini. Gunakan >>out.txt
alih-alih >out.txt
jika Anda ingin hasilnya ditambahkan out.txt
.
head -n -2
tidak kompatibel dengan POSIX .
Jika Anda ingin semua kecuali saluran N-1 pertama, hubungi tail
nomor yang ada +N
. (Angka adalah angka dari baris pertama yang ingin Anda pertahankan, mulai dari 1, yaitu +1 berarti mulai dari atas, +2 berarti lewati satu baris dan seterusnya).
tail -n +3 foo.txt >>other-document
Tidak ada cara mudah dan portabel untuk melewati garis N terakhir. GNU head
memungkinkan head -n +N
sebagai bagian dari tail -n +N
. Jika tidak, jika Anda memiliki tac
(mis. GNU atau Busybox), Anda dapat menggabungkannya dengan tail:
tac | tail -n +3 | tac
Portable, Anda dapat menggunakan filter awk (belum diuji):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
Jika Anda ingin menghapus beberapa baris terakhir dari file besar, Anda dapat menentukan byte offset potongan untuk memotong kemudian melakukan pemotongan dengan dd
.
total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"
Anda tidak dapat memotong file di tempat di awal, meskipun jika Anda perlu menghapus beberapa baris pertama dari file besar, Anda dapat memindahkan konten di sekitar .
Dari tail
halaman manual (GNU tail
, yaitu):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
Dengan demikian, berikut ini harus menambahkan semua kecuali 2 baris pertama somefile.txt
ke anotherfile.txt
:
tail --lines=+3 somefile.txt >> anotherfile.txt
Untuk menghapus n baris pertama, GNU sed dapat digunakan. Misalnya jika n = 2
sed -n '1,2!p' input-file
The !
berarti "mengecualikan interval ini". Seperti yang dapat Anda bayangkan, hasil yang lebih rumit dapat diperoleh, misalnya
sed -n '3,5p;7p'
itu akan menunjukkan baris 3,4,5,7. Lebih banyak kekuatan berasal dari penggunaan ekspresi reguler, bukan alamat.
Batasannya adalah bahwa nomor garis harus diketahui sebelumnya.
sed 1,2d
? Simpler biasanya lebih baik. Juga, tidak ada dalam contoh Anda yang spesifik untuk GNU Sed; perintah Anda semua menggunakan fitur POSIX standar Sed .
Sedangkan tail -n +4
untuk output file mulai dari baris ke-4 (semua kecuali 3 baris pertama) adalah standar dan portabel, head
rekannya ( head -n -3
, semua kecuali 3 baris terakhir) tidak.
Mudah dibawa, Anda akan melakukan:
sed '$d' | sed '$d' | sed '$d'
Atau:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(Waspadalah bahwa pada beberapa sistem di mana sed
memiliki ruang pola ukuran terbatas, yang tidak skala ke nilai besar n
).
Atau:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
Semoga saya mengerti dengan jelas kebutuhan Anda.
Anda memiliki beberapa cara untuk menyelesaikan permintaan Anda:
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
Di mana / etc / passwd adalah file Anda
Solusi ke-2 mungkin bermanfaat jika Anda memiliki file besar:
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
\n
" .. Ia berfungsi untuk semua bilangan bulat negatif selain-n -0
yang tidak mengembalikan apa-apa , sama seperti-n 0
(menggunakan: head (GNU coreutils) 7.4) ... Namun ketika sebuah trailing\n
hadir,-n -0
apakah mencetak seperti yang mungkin diharapkan dari-
, yaitu. itu mencetak seluruh file ... Jadi itu berfungsi untuk semua nilai negatif yang tidak nol .. tetapi-0
gagal ketika tidak ada trailing\n