cat <<EOS | sed -ne '1{h;d;}' -e 'H;${G;p;}'
line 1
line 2
line 3
EOS
Masalah dengan menerjemahkan ini ke sesuatu yang menggunakan tailadalah yang tailperlu membaca seluruh file untuk menemukan akhir. Untuk menggunakannya dalam pipa Anda, Anda harus melakukannya
- Berikan seluruh isi dokumen kepada
tail.
- Berikan lagi kepada
cat.
- Dalam urutan itu.
Agak sulit bukan untuk menduplikasi konten dokumen ( teemelakukan itu) tetapi untuk mendapatkan hasil yang tailakan terjadi sebelum sisa dokumen dikeluarkan, tanpa menggunakan file sementara perantara.
Menggunakan sed(atau awk, seperti yang dilakukan John1024 ) menghilangkan penguraian ganda data dan masalah pemesanan dengan menyimpan data dalam memori.
The sedsolusi yang saya usulkan adalah untuk
1{h;d;}, simpan baris pertama di ruang tunggu, apa adanya, dan lewati ke baris berikutnya.
H, tambahkan satu sama lain baris ke ruang penahanan dengan baris baru tertanam.
${G;p;}, tambahkan ruang penyimpanan ke baris terakhir dengan baris baru yang disematkan dan cetak data yang dihasilkan.
Ini adalah terjemahan harfiah dari solusi John1024 ke dalam sed, dengan peringatan bahwa standar POSIX hanya menjamin bahwa ruang penahanan setidaknya 8192 byte (8 KiB; tetapi merekomendasikan bahwa buffer ini dialokasikan secara dinamis dan diperluas sesuai kebutuhan, yang kedua GNU seddan BSD sedsedang melakukan).
Jika Anda membiarkan diri Anda menggunakan pipa bernama:
mkfifo mypipe
cat <<EOS | tee mypipe | cat <( tail -n 1 mypipe ) -
line 1
line 2
line 3
EOS
rm -f mypipe
Ini digunakan teeuntuk mengirim data ke bawah mypipedan pada saat yang sama cat. The catutilitas pertama akan membaca output dari tail(yang berbunyi dari mypipe, yang teemenulis untuk), dan kemudian menambahkan salinan dokumen yang datang langsung dari tee.
Ada kesalahan serius dalam hal ini, dalam hal jika dokumen terlalu besar (lebih besar dari ukuran buffer pipa), teetulisan ke mypipedan catakan memblokir sambil menunggu pipa (tanpa nama) kosong. Itu tidak akan dikosongkan sampai catdibaca darinya. cattidak akan membaca dari itu sampai tailselesai. Dan tailtidak akan selesai sampai teeselesai. Ini adalah situasi kebuntuan klasik.
Variasi
tee >( tail -n 1 >mypipe ) | cat mypipe -
memiliki masalah yang sama.