linux - mp3tag - musicbrainz picard
Linux cabeza/cola con desplazamiento (3)
¿Hay alguna forma en Linux de solicitar el encabezado o la cola, pero con un desplazamiento adicional de los registros a ignorar?
Por ejemplo, si el archivo example.lst
contiene lo siguiente:
row01
row02
row03
row04
row05
Y uso head -n3 example.lst
puedo obtener las filas 1 a 3, pero ¿qué head -n3 example.lst
si deseo que se salte la primera fila y se obtengan las filas 2 a 4?
Pregunto porque algunos comandos tienen un encabezado que puede no ser deseable dentro de los resultados de búsqueda. Por ejemplo, du -h ~ --max-depth 1 | sort -rh
du -h ~ --max-depth 1 | sort -rh
devolverá el tamaño del directorio de todas las carpetas dentro del directorio de inicio ordenadas en orden descendente, pero agregará el directorio actual a la parte superior del conjunto de resultados (es decir, ~
).
Las páginas de manual de Head and Tail no parecen tener ningún parámetro de desplazamiento, por lo que quizás haya algún tipo de comando de range
donde se puedan especificar las líneas requeridas: por ejemplo, range 2-10
o algo así
De la 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
Por lo tanto, puede utilizar ... | tail -n +2 | head -n 3
... | tail -n +2 | head -n 3
... | tail -n +2 | head -n 3
para obtener 3 líneas a partir de la línea 2.
Los métodos sin cabeza / cola incluyen sed -n "2,4p"
y awk "NR >= 2 && NR <= 4"
.
Para obtener las filas entre 2 y 4 (ambos inclusive), puede usar:
head -n4 example.lst | tail -n+2
o
head -n4 example.lst | tail -n3
Tomó mucho tiempo terminar con esta solución, que parece ser la única que cubrió todos los casos de uso (hasta ahora):
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]}
}''
Lista de características:
- Salida en vivo para cabeza (obviamente que para cola no es posible)
- no uso de archivos externos
- progressbar on stderr, un punto para cada línea después de MAX_LINES, muy útil para tareas de larga ejecución.
- evita un posible orden de registro incorrecto debido al almacenamiento en búfer (stdbuf)