Головка/хвост 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)