Kafanın tam tersi ne? Bir dosyanın ilk N satırı hariç hepsini istiyorum


142

Uzunluğu bilinmeyen bir metin dosyası verildiğinde, örneğin dosyanın ilk 2 satırı hariç tümünü nasıl okuyabilirim ? tailSon N satırını bana vereceğini biliyorum , ama N'nin vaktinden önce ne olduğunu bilmiyorum.

Yani bir dosya için

AAAA
BBBB
CCCC
DDDD
EEEE

İstiyorum

CCCC
DDDD
EEEE

Ve bir dosya için

AAAA
BBBB
CCCC

Sadece alırdım

CCCC

Yanıtlar:


211

tail --help aşağıdakileri verir:

  -n, --lines=K            output the last K lines, instead of the last 10;
                           or use -n +K to output lines starting with the Kth

Bu nedenle, ilk 2satırları filtrelemek -n +3için, aradığınız çıktıyı vermelisiniz (3.'den başlayın).


2
Garip bir şekilde, adam sayfam seçeneği listelemiyor, ama iyi çalışıyor - teşekkürler!
Nicholas MT Elliott

@Nicholas: Tuhaf, işletim sisteminden bağımsız olarak standart belgeler olacağını düşündüm. Bunu Windows içindeki Cygwin'den aldım, bu yüzden çeşitli Linux dağıtımlarında neye benzediğini bilmiyorum. Çalıştığına sevindim.
Joe Enos

@NicholasMTElliott man7 bunu Joe Enos'un manpage gibi listeliyor, bu yüzden bir manpage sürüm sorunu olması muhtemel
Uli Köhler

@SteveJorgensen: Yorumunuzun ne anlama geldiğini anlamıyorum; kimse bunun için kullanmayı öneriyor gibi görünmüyor head?
ruakh

22

Kuyruk sürümünüzün bunu desteklediğini varsayarsak, kuyruğu X satırından sonra başlatmayı belirtebilirsiniz. Sizin durumunuzda 2 + 1 yaparsınız.

tail -n +3

[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE

12

Awk kullanarak basit bir çözüm:

awk 'NR > 2 { print }' file.name

İçimizden biri karıştı. Sorular şöyle diyor: "dosyanın ilk 2 satırı hariç tümü". Bu komut gereksinimi nasıl karşılamıyor?
janm

6
{ print }varsayılan eylemdir ve atlanabilir.
tripleee

8

Deneyin sed 1,2d. 2'yi gerektiği gibi değiştirin.


beklendiği gibi çalıştı .. ilk 2 satırdan sonraki satır sayısı bilinmiyor.
kumarprd

6

tail -n +linecount filenameçizgisinde çıkışını başlayacak linecountarasında filename, yani tail -n +3 filename ne istediğinizi yapmalıdır.


Bu benim kabuğumda işe yaramaz ama işe yarardı tail -n +17 filename. Ben bash / ubuntu LTS kullanıyorum
izomorfizmalar

2
@iso: Head-up için teşekkürler - orijinal cevabımda tailkullandığım sözdiziminin daha eski sürümleri , ancak şimdi açık -nseçeneği kullanması gerekiyor . Cevabımı buna göre güncelledim.
Jim Lewis

0

Bunu kullanarak, ilk numunenin sample1.dat olarak adlandırıldığını varsayalım tail --lines=3 sample1.dat; bu durumda 3. satırdan son satıra tüm satırlar yazdırılır.

İkinci örnek için, yine bunun sample2.dat olarak adlandırıldığını varsayalım tail --lines=-1 sample2.dat.


@Jim: seninki ve benimki arasındaki fark nedir? .... aynı şey ....: o Sorusuna göre iki örnek veri dosyası girdisine atıfta bulunuyordu ve aradığı şeyi nasıl başaracağımı gösteriyordum ... .
t0mm13b

Tamam ... o zaman neden ikinci örneği sordu ve istediğim sonucu gösterdi ki 'tail --lines = -1' kullandım ... tabii ki dosya adını tamamen atlayabilir ve hala boru gibi davranabilir ... hmm
t0mm13b 18:10

@tommie: Hata! Borular hakkında söylediklerimi unut ... Başka bir fayda düşünüyor olmalıyım. Ama benim açımdan, tek bir komut, tail +3 anyfilegenel durum için istenen sonuçları tail --lines=Nverirken, istenen sonucu vermek için önceden N bilmek gerekirdi.
Jim Lewis

@tommie: Ama bu tail... bu "dipte " olmamalı mı? (Ba-dum TISH! Teşekkürler, bütün hafta burada olacağım ...)
Jim Lewis

0

Bunu sadece kuyruktan veya kafadan nasıl yapacağımı gerçekten bilmiyorum ama wc -l(satır sayısı) ve bash ifadesinin yardımıyla bunu başarabilirsiniz.

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

Bu yardımcı olur umarım.


1
Bu, kuyruğu çalıştırmadan önce dosyanın üzerinden tam bir geçiş gerektirir. Dosya bellek boyutundan büyükse, bu çok verimsiz olacaktır. İki satırdan az dosyaları işlemez. Tuvalet ve kuyruk arasındaki dosya değiştirme boyutunu işlemez.
Ocak

2
@janm: Sen iyisin. Diğer cevaplar daha iyi. Utanıyorum. :-p
NawaMan

-1

awk kullanarak son 2 satır dışında hepsini almak

awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file

İlk 2 satır hariç hepsini almak için awk

awk 'NR>2' file

VEYA daha fazlasını kullanabilirsiniz

more +2 file

ya da sadece bash

#!/bin/bash

i=0
while read -r line
do
  [[ $i > 1 ]] && echo "$line"
  ((i++))
done <"file"

Şimdi bu gereksinimi karşılamıyor. Soru, "dosyanın ilk 2 satırı hariç tümü" diyor ve her biri tek bir dosyaya sahip iki örnek veriyor ve burada ilk iki satır atlanıyor ve dosyanın geri kalanı stdout'a gönderiliyor. Bu komutun yaptığı bu değil.
Ocak

evet soruyu yanlış okudum. Son 2 satır hariç hepsini istediğini düşündüm.
ghostdog74
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.