emular cola con sed

8

Tengo un mini-sistema con número limitado únicamente de binarios ( bash, cp, cat, sed, ...). No tengo tailcomando, y me pregunto si podría emular la funcionalidad de cola consed

cat foo.txt | tail -n 10

Sé que puedo imprimir líneas 1-10 con sed cat foo.txt | sed -n '1,10p', pero ¿cómo imprimiría las últimas 10 líneas?

Martin Vegter
fuente
2
Hay muchas secuencias de comandos sed útiles en una línea de comando que puede necesitar: sed one-line
Slyx

Respuestas:

15

Podrías hacer algo como esto:

sed -e :a -e '$q;N;11,$D;ba'
Chris Down
fuente
sed -e :a -e '$q;N;11,$D;ba' foopara que coincida con la pregunta.
Slyx
No tengo idea de cómo funciona, pero funciona perfectamente. Muchas gracias.
Martin Vegter
¿Alguien podría explicar este maravilloso comando? Estoy buscando tener un comando que muestre el comienzo y el final de un documento, y creo que este comando podría ayudar, pero necesito agregar la parte de la cabeza. De hecho, el comando que estaba buscando es simplemente: ¡¡¡ sed -e '1,11p' -e :a -e '$q;N;11,$D;ba' Pero todavía me gustaría entender la parte de la cola !!!
Franck
0
tac foo |  sed -n '1,10p' | tac

pero si no tienes tac, solo puedes usar sed de esta manera:

sed -n '1!G;h;$p' foo | sed -n '1,10p' | sed -n '1!G;h;$p'
Slyx
fuente
0

¿Está exprdisponible con su sistema? Luego puede intentar evaluar el número de línea deseado después de haber contado el número total de líneas en el archivo.

Creé un archivo llamado que tmpcontiene los números del 1 al 20 en cada línea.

nlines=$(cat tmp | sed -n '$=')
cat tmp | sed -n $(expr $nlines - 9),"$nlines"p
11
12
13
14
15
16
17
18
19
20

Por supuesto, puede usar wc -l, si está disponible.

El comando para calcular el número total de líneas en el archivo se toma de sed one liners . Sin embargo, no he comprobado si también funciona con archivos vacíos.

PD Si exprno está disponible, puede usar restar números en Bash como se muestra a continuación:

cat tmp | sed -n $((nlines-9)),"$nlines"p
Barun
fuente