2012-08-06 9 views
29

Czy istnieje (linia poleceń POSIX) sposób drukowania wszystkich plików Z WYJĄTKIEM ostatnich n linii? Skorzystaj z tego, że będę miał wiele plików o nieznanym rozmiarze, z których wszystkie zawierają stopkę o znanym rozmiarze, którą chcę usunąć. Zastanawiam się, czy istnieje już narzędzie, które robi to przed napisaniem go samodzielnie.Ogon odwrotny/drukowanie wszystkiego oprócz ostatnich n linii?

Odpowiedz

33

Większość wersji głowy (1) - w szczególności GNU, ale nie pochodzących z BSD - ma taką funkcję. Pokaże górną część pliku oprócz końca, jeśli użyjesz liczby ujemnej do liczby linii do wydrukowania.

tak:

head -n -10 textfile 
+8

W POSIX-ie, -n musi być dodatnią liczbą całkowitą. – choroba

+1

Prawdziwe dla rygorystycznego POSIX. Powinienem być bardziej przejrzysty z moim "najbardziej". Jeśli wybierasz się na szybszą i bardziej brudną metodę POSIX, zakładam, że 'wc -l' i pewna matematyka dostarczy Ci wartości do przekazania do' head' –

+0

większości implementacji head (1) brakuje tej funkcji. Tylko ta implementacja, którą znam, ma ten nieprzenośny kod. –

4

Narzędzie head jest twoim przyjacielem.

Od strony człowieka z 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 
+3

W POSIX-u musi być dodatnią liczbą całkowitą. – choroba

+4

Niestety w systemach pochodnych z BSD (tj. OSX) wartości ujemne nie są poprawnymi argumentami dla -n – Tossrock

0

Jeśli stopka rozpoczyna spójnej linii, która nie pojawia się w innym miejscu, można użyć sed:

sed '/FIRST_LINE_OF_FOOTER/q' filename 

Że drukuje pierwszą linię stopki; jeśli chcesz uniknąć:

sed -n '/FIRST_LINE_OF_FOOTER/q;p' filename 

To może być bardziej wytrzymałe niż linie licząc jeżeli wielkość zmiany stopki w przyszłości. (Lub może być mniej niezawodny, jeśli zmieni się pierwsza linia).

Inna opcja, jeśli polecenie twojego systemu head nie obsługuje head -n -10, polega na wstępnym obliczeniu liczby linii, które chcesz wyświetlić. Poniższa zależy bash specyficzne składnię:

lines=$(wc -l < filename) ; ((lines -= 10)) ; head -$lines filename 

Uwaga że składnia head -NUMBER jest obsługiwana przez niektórych wersjach head kompatybilności wstecznej; POSIX zezwala tylko na formularz head -n NUMBER. POSIX zezwala także tylko na to, aby argument o wartości -n był dodatnią liczbą całkowitą; head -n 0 to niekoniecznie no-op.

rozwiązanie

POSIX jest:

lines=$(wc -l < filename) ; lines=$(($lines - 10)) ; head -n $lines filename 

Jeśli trzeba radzić sobie z dawnych wstępnych POSIX muszli, może warto rozważyć to:

lines=`wc -l < filename` ; lines=`expr $lines - 10` ; head -n $lines filename 

Każda z nich może robić dziwne rzeczy, jeśli plik ma 10 lub mniej linii.

+0

POSIX ma składnię saner '$ (...)' obok starożytnych zwrotów dla podstawiania poleceń, a także ma '$ ((...)) "rozszerzenie arytmetyczne. Więc nie trzeba iść na antyczne z backticks i 'expr'. [Podstawienie polecenia POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03) – geirha

+1

@geirha: Dobrze, a pytanie dotyczyło POSIX-a. Ale znajomość starożytnej składni może być przydatna w przypadku, gdy nadal istnieją powłoki sprzed POSIX-u. –

3

Nie ma żadnych standardowych poleceń, ale można użyć awk lub sed, aby wypełnić bufor linii N i wydrukować z głowy, gdy jest pełny. Na przykład.z awk:

awk -v n=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file 
10

Prawdopodobnie mniej wydajny niż "wc" + "do matematyki" + "ogon" metoda, ale łatwiej spojrzeć na:

tail -r file.txt | tail +NUM | tail -r 

Gdzie NUM jest o jeden więcej niż liczba końcowych linii, które chcesz usunąć, np +11 wyświetli wszystkie linie oprócz ostatnich 10 linii. Działa to na BSD, który nie obsługuje składni head -n -NUM.

0

To jest proste. Musisz dodać + do liczby linii, których chcesz uniknąć.

Ten przykład daje wam wszystkie wiersze z wyjątkiem pierwszego 9

ogona -n +10 plik_wejściowy

(tak, nie pierwszy 10 ... bo liczy się inaczej ... jeśli chcesz 10, po prostu wpisz tail -n 11 plik wejściowy)

Powiązane problemy