Как в консоли вывести все строчки кроме последней

Задача. В консоли есть какой-то текст (вывод какой-то команды или содержимое файла). Зарнее неизвестно сколько в этом тексте строк. Нужно вывести на экран все строчки, кроме последней.

Самый простой способ это сделать в linux — это использовать команду head и передать ей отрицательное число в значении параметра -n

Вот пример. Есть команда, которая выдает три строчки на экран:

$ echo -e '1\n2\n3'
1
2
3

Передамем -1 (минус один) в качестве параметра -n для head и получаем все строчки, кроме последней:

$ echo -e '1\n2\n3' | head -n -1
1
2

И можно указать не только -1 (чтобы получить все строчки, кроме последней), но и -2 (чтобы получить все строчки, кроме двух последних) или -3 (все, кроме трех последних) и т.д.

Конечно, если заранее знать сколько всего строк, то можно использовать не отрицательное значение, а положительное значение — просто сказать — покажи первые 2 строчки:

$ echo -e '1\n2\n3' | head -n 2
1
2

Но отрицательный параметр очень удобен, когда заранее неизвестно сколько строчек нужно обработать.

Вот фрагмент хелпа к команде head, которое описывает параметр -n:

$ head --help

...

  -n, --lines=[-]NUM       print the first NUM lines instead of the first 10;
                           with the leading '-', print all but the last
                           NUM lines of each file

К сожалению, на macOS отрицательные значения параметра -n не работают. На маке живет BSD верия head (на linux GNU версия) и на маке попытка указать отрицательный параметр выдает ошибку:

$ echo -e '1\n2\n3' | head -n -1
head: illegal line count -- -1

Для того чтобы на macOS вывести все строчки, кроме последний можно использовать вот такой однострочник:

$ echo -e '1\n2\n3' | perl -nalE 'push(@lines, $_); }{ say $lines[$_] foreach 0..$#lines -1'
1
2

(в самом конце этого однострочника находится число -1. Если нужно показать все строчки, кроме двух последних, то нужно вместо -1 написать -2, если нужно показать все строчи кроме трех последних, то -3, и т.д.)

Другое возможное решение на macOS — установить пакет coreutils с помощью Homebrew:

$ brew install coreutils

И использовать ghead команду с отрицательнм значением парметра -n:

$ echo -e '1\n2\n3' | ghead -n -1
1
2

Иван Бессарабов
ivan@bessarabov.ru

9 марта 2019

Этот текст есть и на английском языке