Puoi semplicemente:
(head; tail) < file.txt
E se hai bisogno di utilizzare pipe per qualche motivo, allora in questo modo:
cat file.txt | (head; tail)
Nota:stamperà righe duplicate se il numero di righe in file.txt è inferiore alle righe di testa predefinite + righe di coda predefinite.
Per un flusso puro (ad esempio l'output di un comando), puoi utilizzare 'tee' per eseguire il fork del flusso e inviare un flusso in testa e uno in coda. Ciò richiede l'utilizzo della funzionalità '>( list )' di bash (+ /dev/fd/N):
( COMMAND | tee /dev/fd/3 | head ) 3> >( tail )
o usando /dev/fd/N (o /dev/stderr) più subshell con reindirizzamento complicato:
( ( seq 1 100 | tee /dev/fd/2 | head 1>&3 ) 2>&1 | tail ) 3>&1
( ( seq 1 100 | tee /dev/stderr | head 1>&3 ) 2>&1 | tail ) 3>&1
(Nessuno di questi funzionerà in csh o tcsh.)
Per qualcosa con un controllo leggermente migliore, puoi usare questo comando perl:
COMMAND | perl -e 'my $size = 10; my @buf = (); while (<>) { print if $. <= $size; push(@buf, $_); if ( @buf > $size ) { shift(@buf); } } print "------\n"; print @buf;'
ed
è il standard text editor
$ echo -e '1+10,$-10d\n%p' | ed -s file.txt