Saya menyusun presentasi untuk audiens non-teknis. Saya memiliki program yang berjalan di bash yang menampilkan aliran nilai yang berkelanjutan, beberapa di antaranya penting. Saya ingin menyoroti hasil penting saat ditampilkan sehingga audiens dapat mengetahui frekuensi mereka. Masalahnya adalah saya tidak bisa sed
beroperasi pada aliran yang sedang berjalan. Ini berfungsi dengan baik jika saya meletakkan hasilnya dalam file, seperti pada:
cat output.txt | sed "s/some text/some text bolded/"
Tetapi jika saya mencoba hal yang sama pada output yang berjalan, seperti ini:
command | sed "s/some text/some text bolded/"
sed
tidak melakukan apa-apa. Adakah pikiran?
Seperti yang ditunjukkan oleh Lambert cukup membantu, perkataan saya bahwa sed
tidak melakukan apa pun tidak jelas. Apa yang terjadi adalah bahwa output program ke stdout
(saya cukup yakin itu tidak menulis ke stderr
) seperti biasanya, bahkan jika disalurkan melalui sed
.
Masalahnya tampaknya bahwa perintah memanggil program kedua, yang kemudian di-output ke stdout. Ada beberapa baris yang dicetak oleh program pertama; ini saya dapat mengedit. Lalu ada aliran nilai yang dicetak oleh program kedua; ini saya tidak bisa mengedit.
Metode Perl dan awk juga tidak berfungsi.
sumber
stdbuf -o0 command | sed "s/some text/some text bolded/"
bekerja?command|egrep 'some text|$'
g
substitusi "global" yang didapat, jika tidak hanya kemunculan pertama pada baris yang akan diganti:sed "s/old/new/g"
Jawaban:
Kemungkinannya adalah output perintah buffer. Ketika perintah menulis ke terminal, buffer disiram pada setiap baris baru, sehingga Anda melihatnya muncul pada tingkat yang diharapkan. Ketika perintah menulis ke sebuah pipa, penyangga hanya memerah ketika mencapai beberapa kilobyte, sehingga banyak yang tertinggal. Dengan demikian adalah perilaku default dari perpustakaan input / output standar.
Untuk memaksa perintah untuk tidak merusak outputnya, Anda dapat menggunakan
unbuffer
(dari yang diharapkan) ataustdbuf
(dari GNU coreutils).sumber
stdbuf
tidak bekerja (disebutkan sebelumnya, BTW), tetapiunbuffer
berhasil !! Anda tidak tahu betapa bahagianya Anda membuat saya.sed
sendiri menggunakan buffer seperti itu, (cf posting ChennyStar) sehingga contoh di sini mungkin tidak berfungsi karenased
adalahcommand
untuk unbuffer:cat /etc/passwd | unbuffer sed
tetapised
itu sendiri memiliki-u
opsi, jadigrep
mungkin lebih cocok dalam contoh ini. Terima kasih banyak untuk informasi latar belakang Anda! Jawaban bagus!sed
memiliki opsi untuk itu:Yang memuat jumlah data minimal dari file input dan menyiram buffer output lebih sering. Lihat
man sed
untuk lebih jelasnya.sumber
sed
(bukan BSDsed
), dan saya percaya ini masih tidak akan mencegah buffering perintah di awal pipa. Tapi senang menyebutkannya. :)Saya akan menggunakan awk
dimana
/some important stuff/
pilih jalur penting, seperti pada sedprintf "%c[31m%s%c[0m\n",27,$0,27 ;
cetak merahtitik kuncinya adalah bahwa
command
harus menyiram garis, tetapi itu harus terjadi jika Anda memiliki banyak output.sumber
awk
(menggunakansub()
ataugsub()
), dalam hal penggantian primitifsed
ini tentunya merupakan alat yang tepat.Cara perl:
atau dengan output berkelanjutan:
Skrip bash untuk hasilnya
cont
:Uji dengan:
\x1b[1m
- intensitas tebal atau tebal${1}
- pengaturan kembali\x1b[0m
- reset semua atributKeluaran:
Lebih banyak kode pelarian di sini .
sumber