nl

Numeruje linie pliku przy wypisywaniu na wyjście.

nl (skrót od number lines) numeruje linie pliku i wypisuje je na standardowe wyjście razem z numerem na początku. To taki bardziej rozgarnięty kuzyn cat -n: domyślnie pomija puste linie przy numerowaniu, pozwala ustawić format numeru, separator, szerokość kolumny i punkt startowy. Przydaje się, gdy chcesz odnieść się do konkretnej linii kodu, logu albo konfiguracji, a nie liczyć ich palcem na ekranie.

Składnia i najważniejsze opcje

Podstawowa składnia wygląda tak: nl [opcje] [plik...]. Bez podanego pliku (albo gdy podasz -) nl czyta ze standardowego wejścia, więc spokojnie wepniesz go w potok.

  • -b STYL — sposób numerowania linii treści: a (wszystkie), t (tylko niepuste — domyślnie), n (żadne), pWZORZEC (tylko pasujące do wyrażenia regularnego).
  • -n FORMAT — format numeru: ln (do lewej), rn (do prawej, domyślnie), rz (do prawej z zerami wiodącymi).
  • -s ŁAŃCUCH — co wstawić między numerem a treścią (domyślnie znak tabulacji).
  • -w LICZBA — szerokość kolumny z numerem (domyślnie 6).
  • -v LICZBA — od jakiego numeru zaczynać (domyślnie 1).
  • -i LICZBA — krok numerowania, czyli o ile zwiększać numer (domyślnie 1).
  • -l LICZBA — ile kolejnych pustych linii liczyć jako jedną.

Przykłady użycia

  • nl plik.txt — numeruje tylko niepuste linie pliku i wypisuje wynik na ekran.
  • nl -b a plik.txt — numeruje wszystkie linie, łącznie z pustymi (zachowuje się jak cat -n).
  • nl -n rz -w 3 plik.txt — wyrównuje numery do prawej z zerami wiodącymi w polu o szerokości 3 (np. 001, 002).
  • nl -s '. ' -w 1 lista.txt — robi z pliku ładną listę w stylu 1. tekst zamiast tabulacji.
  • grep -n "" log.txt | tail -20 przefiltrujesz, ale do samego pliku: nl -b a -v 100 plik.txt — numeruje wszystkie linie zaczynając od 100.

Częste błędy i pułapki

Najczęstsza niespodzianka: domyślnie nl nie numeruje pustych linii (styl t), więc numery mogą się rozjeżdżać z rzeczywistym numerem wiersza w edytorze. Jeśli chcesz odwzorować numerację 1:1, użyj -b a.

Druga sprawa: numer i treść rozdziela domyślnie tabulator, a nie spacja. Przy kopiowaniu do dokumentów potrafi to wyglądać dziwnie — zmień separator przez -s.

Pamiętaj też, że nl liczy linie w obrębie tak zwanych stron logicznych oddzielonych specjalnymi znacznikami (\:, \:\: itd.). W zwykłych plikach tego nie spotkasz, ale jeśli numeracja nagle „resetuje się”, sprawdź, czy w treści nie ma takich sekwencji. Na macOS (BSD) część zachowań i domyślnych wartości może się minimalnie różnić od wersji GNU z Linuksa, więc przy skryptach przenośnych lepiej jawnie podać opcje.

Powiązane komendy: cat -n, grep -n, awk, sed, pr.