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
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
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
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.
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.
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
@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. –
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
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
.
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)
- 1. Usuwanie wszystkiego oprócz liczb w ciągu znaków
- 2. nginx: auth_basic dla wszystkiego oprócz określonej lokalizacji
- 3. Mapowanie filtrów dla wszystkiego na Struts2 oprócz jednego serwletu?
- 4. Wybieranie ostatnich n pozycji w szeregu czasowym
- 5. Usuwanie ostatnich elementów N z listy
- 6. MySQL i SQLAlchemy: pobieranie N ostatnich komentarzy do wielu pozycji
- 7. PostgreSQL jak znaleźć jakiekolwiek zmiany w ciągu ostatnich n-minut
- 8. XMPP - Pobieranie ostatnich n wiadomości z pokoju rozmów
- 9. Znajdź wszystkie dokumenty w ciągu ostatnich n dni
- 10. Maskowanie wszystkich znaków ciągu, z wyjątkiem ostatnich n znaków
- 11. rura wyjściowa ogon do innego skryptu
- 12. R ggplot: Zastosuj etykietę tylko do ostatnich N punktów danych na wykresie
- 13. Usuwanie ostatnich dwóch znaków z każdej linii w pliku tekstowym
- 14. Ogon -f + grep?
- 15. F # ogon wywołanie rekurencyjne
- 16. Jak wydrukować "\ n" zamiast nowej linii?
- 17. Przejdź do n-tego symbolu w linii
- 18. C# podział linii co n znaków
- 19. Uzyskiwanie n-tej linii tekstu wyjściowego
- 20. C#: ogon jak program do pliku tekstowego
- 21. CSS wybierz wszystkie elementy potomne oprócz pierwszych dwóch i ostatnich dwóch
- 22. HttpUtility.HtmlEncode nie koduje wszystkiego
- 23. :: głowa ogon wzorzec dopasowania ciągów
- 24. Ogon dziennika Logstash w przeglądarce
- 25. mysql wybierz z ostatnich wierszy
- 26. Git pull nie ciągnie wszystkiego.
- 27. Czy głowa i ogon zestawu gwarantują wzajemną wyłączność?
- 28. Jak skompilować bajt wszystkiego w katalogu .emacs.d?
- 29. Unikalne cięcie z wyjątkiem dwóch ostatnich tokenów
- 30. Dodawanie symbolu \ n nowej linii podczas używania sprintf w PHP
W POSIX-ie, -n musi być dodatnią liczbą całkowitą. – choroba
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' –
większości implementacji head (1) brakuje tej funkcji. Tylko ta implementacja, którą znam, ma ten nieprzenośny kod. –