簡単にできます:
(head; tail) < file.txt
何らかの理由でパイプを使用する必要がある場合は、次のようにします。
cat file.txt | (head; tail)
注:file.txt の行数がデフォルトの先頭行 + デフォルトの末尾行より少ない場合、重複した行が出力されます。
純粋なストリーム (コマンドからの出力など) の場合、「tee」を使用してストリームをフォークし、1 つのストリームを先頭に、もう 1 つを末尾に送信できます。これには、bash の '>( list )' 機能 (+ /dev/fd/N) を使用する必要があります:
( COMMAND | tee /dev/fd/3 | head ) 3> >( tail )
または /dev/fd/N (または /dev/stderr) と複雑なリダイレクトを伴うサブシェルを使用:
( ( 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
(これらはどちらも csh や tcsh では機能しません。)
もう少し制御しやすいものについては、この 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
standard text editor
です
$ echo -e '1+10,$-10d\n%p' | ed -s file.txt