Головка/хвост Linux со смещением

Есть ли способ в Linux запросить Head или Tail, но с дополнительным смещением записей, чтобы игнорировать.

Например, если файл example.lst содержит следующее:

row01
row02
row03
row04
row05

И я использую head -n3 example.lst Я могу получить строки 1 - 3, но что, если я хочу, чтобы он пропускал первую строку и получал строки 2 - 4?

Я спрашиваю, потому что некоторые команды имеют заголовок, который может быть нежелательным в результатах поиска. Например, du -h ~ --max-depth 1 | sort -rh вернет размер каталога всех папок в домашнем каталоге, отсортированном по убыванию, но добавит текущий каталог в начало набора результатов (т.е. ~).

На страницах заголовка и хвоста нет никакого параметра смещения, поэтому может быть какая-то команда range, где могут быть указаны требуемые строки: например. range 2-10 или что-то?

Ответ 1

От man tail:

   -n, --lines=K
        output the last K lines, instead of the last 10; 
        or use -n +K to output lines starting with the Kth

Поэтому вы можете использовать ... | tail -n +2 | head -n 3, чтобы получить 3 строки, начиная с строки 2.

Методы без головы/хвоста включают sed -n "2,4p" и awk "NR >= 2 && NR <= 4".

Ответ 2

Чтобы получить строки от 2 до 4 (оба включительно), вы можете использовать:

head -n4 example.lst | tail -n+2

или

head -n4 example.lst | tail -n3

Ответ 3

Потребовалось много времени, чтобы закончить это решение, которое, кажется, единственное, что охватывало все случаи использования (пока):

command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=${MAX_LINES:-200} \
          '{
               if (NR <= offset) print;
               else {
                   a[NR] = $0;
                   delete a[NR-offset];
                   printf "." > "/dev/stderr"
                   }
           }
           END {
             print "" > "/dev/stderr";
             for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++)
             { print a[i]}
           }'

Список функций:

  • живой выход для головы (очевидно, что для хвоста невозможно)
  • использование внешних файлов
  • progressbar на stderr, одна точка для каждой строки после MAX_LINES, очень полезна для длительных задач.
  • позволяет избежать неправильного порядка ведения журнала из-за буферизации (stdbuf)