Задача. В консоли есть какой-то текст (вывод какой-то команды или содержимое файла). Зарнее неизвестно сколько в этом тексте строк. Нужно вывести на экран все строчки, кроме последней.
Самый простой способ это сделать в 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
9 марта 2019
Этот текст есть и на английском языке |