Утилиты head и tail можно назвать сестрами. Они обе позволяют просматривать только часть того, что поступило на вход: head показывает начало, а tail — конец.
Команды могут принимать входные данные либо с какого-то ресурса (файла) либо от других утилит через конвейер "|":
$ head test
Line 1
Line 2
Line 3
...
$ ls | head
adduser.conf
alsa
alternatives
...
Если в команде head не указаны флаги, то по умолчанию выводятся первые 10 строк.
Для того, чтобы ограничить вывод и просмотреть N элементов, используем параметр "-n":
$ head -n2 test
Line 1
Line 2
Параметр "-n" также можно использовать для того, чтобы вывести все содержимое, за исключением N последних строк. Для этого нужно использовать выражение вида "-n-N".
Если у нас всего 10 строк и требуется получить первые 3, сделаем:
$ head -n-7 test
Line 1
Line 2
Line 3
Без проблем можно единовременно получить вывод с нескольких файлов. Достаточно перечислить названия через пробел:
$ head -n2 test test2
==> test <==
Line 1
Line 2
==> test2 <==
Line 11
Line 12
Если вывод названий файлов и разделителей "\n" нам не нужен, используем флаг "-q":
$ head -n2 -q test test2
Line 1
Line 2
Line 11
Line 12
Команда tail печатает последние строки файла — по умолчанию также 10:
$ tail test
Line 1
Line 2
Line 3
...
Принцип использования команды tail практически аналогичен head. Если хотим ограничить вывод последними 3 строками, добавляем флаг "-n":
$ tail -n3 test
Line 8
Line 9
Line 10
Если поставить перед номером знак "+", печать начнется со строки этого номера и продолжится до конца файла:
$ tail -n+9 test
Line 9
Line 10
Обе команды вместе
Объединяйте head и tail, чтобы напечатать любой диапазон строк.
Например, чтобы вывести строки c 4 по 7, используем head для элементов "1-7" и tail для "7-4":
$ head -n7 test | tail -n4
Line 4
Line 5
Line 6
Line 7
В общем, чтобы отобразить строки от M до N, извлеките первые N строк с помощью head, затем выведите последние N-M+1 строк с помощью tail.
Чуток жизненной практики
Последнее время частенько приходится работать с патчами - накладывать их на приложения через quilt и снимать.
Нужно было наложить на утилиту только 10 патчей из 20. Для того, чтобы поработать с диапазоном, использовал команду head:
$ quilt series | head -n 10 | xargs -L1 quilt push
1) quilt series выводит список патчей в столбец;
2) head -n 10 отображает только первые 10 строк;
3) xargs -L1 quilt push выполняет команду для каждого отдельного патча;
LinuxCamp | #utils
