Stampare le ultime n righe invece delle prime è più complesso ma sempre possibile. n è codificato nella seconda riga, prima del punto esclamativo.
Questo script è simile allo script tac
in quanto tiene
il risultato finale nell’hold space e lo stampa alla fine:
#!/usr/bin/sed -nf
1! {; H; g; } 1,10 !s/[^\n]*\n// $p h
Sostanzialmente, lo script prende una finestra di 10 righe e la fa scorrere
aggiungendo una riga e cancellando la più vecchia (il comando di sostituzione
sulla seconda riga funziona come un comando D
ma non
riavvia il ciclo).
La tecnica della “finestra scorrevole” è un modo molto potente per scrivere
script di sed
efficienti e complessi, dal momento che comandi come
P
richiederebbero una gran quantità di lavoro se implementati manualmente.
Per introdurre la tecnica, che è dimostrata in maniera esauriente nel
resto di questo capitolo ed è basata sui comandi N
, P
e D
, vediamo ora un’implementazione di tail
usando una semplice “finestra scorrevole.”
Sembra complicato ma di fatto il funzionamento è lo stesso
dell’ultimo script: dopo aver inserito il numero di righe appropriato,
comunque, non viene più usato l’hold space per salvare la situazione
fra una linea e l’altra, e invece vengono usati N
e D
per far scorrere il pattern space di una riga:
#!/usr/bin/sed -f
1h 2,10 {; H; g; } $q 1,9d N D
Si noti come la prima, la seconda e la quarta riga sono inattive dopo le prime dieci righe di input. Dopo di esse, tutto quello che lo script fa è: uscendo con l’ultima riga in input, accodare la prossima riga in input al pattern space, rimuovere la prima riga dallo stesso.