Kuyruk karşısında


36

Bir dosyanın son n satırını unix komut satırı filtresiyle nasıl atabilirim?

Bunun tam tersi olur tail: taililk n çizgisini atar ancak geri kalanı yönlendirir, ancak komutun son n çizgileri dışında her şeyi iletmesini istiyorum .

Maalesef böyle bir şey bulamadım - headyardımcı olmuyor . EDIT : En azından Solaris'te olumsuz tartışmalar yapmaz.

Güncelleme: Çoğunlukla büyük dosyalar için çalışan bir çözümle ilgileniyorum, yani son dakikalarda olanları incelemek isteyebileceğiniz logfiles.


FYI, kafa kullanırken: -n seçeneğiyle sayının önüne '-' koyarak, her dosyanın tüm satırlarını yazdırır, ancak aşağıda gösterildiği gibi son N satırlarını yazdırmaz,
G Koe

Yanıtlar:


38

Eğer GNU'nuz headvarsa, kullanabilirsiniz

head -n -5 file.txt

son 5 satır hariç hepsini yazdırmak için file.txt.

Eğer head -nherhangi bir olumsuz argüman alır, denemek

head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt

11
(ve file.txten az altı satır uzunluğunda olması için dua edin ...)
Ocak'ta CVn

1
Ne yazık ki bu GNU dışı sürüm, akışlarla da çalışmıyor
Armand

1
@ MichaelKjörling En azından ubuntu'da bu bir problem değil. Dosyaların içinde belirtilenden daha az satır varsa, headhatasız boş bir çıktı döndürülür.
Alphaaa,

5 hepsi değil ama son 5, ilk 5 satırları yazdırır -n ben yanlış kafa dönmezsem ...
pypmannetjies

8
head file.txt               # first 10 lines
tail file.txt               # last 10 lines
head -n 20 file.txt         # first 20 lines
tail -n 20 file.txt         # last 20 lines
head -20 file.txt           # first 20 lines
tail -20 file.txt           # last 20 lines
head -n -5 file.txt         # all lines except the 5 last
tail -n +5 file.txt         # all lines except the 4 first, starts at line 5

1
Kabul edilen cevapta cevaplanmayan bu eklenti nedir? Ayrıca, diğer cevaplarınızda olduğu gibi, cevabınızın birkaç açıklaması da onu büyük ölçüde iyileştirir.
music2myear

1
çok iyi bir özet
ruanhao

5

İşte BSD vb. İle çalışan son satırı silmek için basit bir yol.

sed '$d' input.txt

İfade "son satırda silin" yazıyor. Diğer satırlar basılacaktır çünkü sedvarsayılan davranış budur.

Birden fazla çizgiyi kaldırmak için onları birlikte zincirleyebilirsiniz

sed '$d' input.txt | sed '$d' | sed '$d'

Biraz ağır elle kullanılan, kuşkusuz, ancak sadece bir dosya üzerinden tarama yapar.

Buna daha fazla cevap için de bakabilirsiniz: https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file

İşte favorilerimden birine adapte edilmiş bir tek gömlek:

N=10
sed -n -e ':a' -e "1,$N!{P;N;D;};N;ba"

Bunu çözerken çok eğlendim ve umarım siz de öyle yaparsınız (: Tararken tampon Nsatır yapar , ancak aksi halde oldukça verimlidir.


3

Neden headbir seçenek olmadığını düşündüğünüzü merak ediyorum :

~$ man head
...
-n, --lines=[-]K
        print the first K lines instead of the first 10; 
        with the leading `-', print all but the last K lines of each file

Bu, örneğin, amacınıza uygun görünüyor:

head -n -20 yourfile.txt

5
Bunun sadece GNU için geçerli olduğuna dikkat edin head. BSD headBu cevap böylece, bu seçeneği yoktur değil GNU coreutils olmadan Solaris veya diğer Unix ortamında çalışır. OP, bunu özellikle Unix ve Unix-Utils ile de etiketledi.
slhck

2
@slhck OP'nin Solaris için olduğundan bahsettiği gerçeğinden bahsetmiyorum.
Ocak'ta bir CVn

Ne yazık ki birileri Solaris'ten bahsetti. Ancak yine de kafa versiyonunun bunu desteklemediğini söylemeliydim.
Hans-Peter Störr

1
Özür dilerim Solaris'i farketmedim, kafamın çeşitli versiyonlarını da bilmiyordum.
Anders R. Bystrup,

1
@hstoerr Solaris şimdi etiketinizde :)
slhck

0

tail -nOlumsuz argümanlar almayacaksa yapmanın başka bir yolu

tac file.txt | tail -n +6 | tac

Bu son 5 satırı kaldıracak


Teşekkürler! Bu hiç kimsenin bulamadığı güzel bir fikir. Ne yazık ki bu, bu soruyu düşündüğüm usecase için oldukça verimsiz olurdu: eğer büyük bir dosya ise, diğer çözümlerde olduğu gibi, sadece bir veya daha fazla kez tamamen okunmaz, ancak muhtemelen belleğe sığmazsa taktikle geçici dosyalara disk.
Hans-Peter Störr

@ Hans-Peter Çok doğru. Bunun için bir python3 betiği yazmaya karar verdi. Bunu github.com/atw31337/donkey adresinde deneyin . Çıktı seçeneklerini kullanmanızı öneririm. Yönlendirmeleri kullanmaktan çok daha hızlı çalışırlar.
atw31337

Güzel yazılmış! Bununla birlikte, dosyayı iki kez okur, bu da son n satırını tamponlarsanız gerçekten gerekli değildir ve bu büyük dosyalarda bir sorundur. Şahsen, artık buna ihtiyacım yok, ama onu geliştirmek için eğlenmek durumundaysanız ve diğer insanlar buna ihtiyaç duyarsa ... Sonuçta, bu soruya ilişkin birkaç beğeni ve yer imi vardı.
Hans-Peter Störr

Hans-Peter @. Tampon boyutu, çıkarılacak çizgi sayısına bağlı olacaktır. Dosyadan çok sayıda satırın bırakılması gerekiyorsa bu sorun olabilir. Belleğe bağlı sorunlardan kaçınmak için, betiği yüksek n değerlerine sahip satır sayma yöntemini ve düşük n değerlerine sahip bir tamponlama yöntemini kullanmak için yeniden yazdım; ancak, çok büyük bir dosyada test ettikten sonra, orijinal satır sayma yöntemi hala daha hızlıdır. Tampon yönetimi ek yükü, genel gider sayısından daha ağır basıyor gibi görünüyor ... yoksa sadece bir şeyleri özlüyorum.
atw31337

Güzel, ancak BSD değişkeni Mac OS X için varsayılan olarak tac komutu yoktur. :( yenilgilerden Bu tür kullanım şeklidir.
ingyhere
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.