Saya mencoba menghitung jumlah garis keluaran yang dihasilkan oleh program tertentu. Masalahnya adalah, program ini membutuhkan waktu lama untuk dijalankan, dan saya ingin menampilkan output kepada pengguna. Apakah ada cara untuk menghitung jumlah baris yang dihasilkan perintah terakhir?
Saya bisa melakukan program | wc -l
tetapi itu tidak akan menampilkan output kepada pengguna. Jadi sejauh yang saya tahu, saya harus melakukan program; program | wc -l
- tetapi program ini membutuhkan setidaknya satu menit untuk berjalan, jadi saya tidak ingin harus melakukannya lebih dari sekali hanya untuk menunjukkan jumlah baris di bagian bawah.
EDIT:
- Apakah ada cara untuk menunjukkan output saat terjadi (baris demi baris) dan kemudian mengembalikan hitungan di akhir?
bash
shell
debian
command-line
Libbux
sumber
sumber
STDOUT_WRITE_COUNT
), atau login ke file / API, di akhir program. WDYT?Jawaban:
Anda dapat menggunakan
tee
untuk membagi aliran output mengirim satu salinan kewc
dan salinan lainnya ke STDOUT seperti biasa.The
>(cmd)
sintaks pesta yang berarti menjalankancmd
dan mengganti>(cmd)
bit dengan path ke (pipa bernama terhubung ke) bahwa program STDIN.sumber
>(cmd)
adalahksh
sintaks yang juga dikenali olehzsh
danbash
dan hanya menggunakan pipa bernama pada sistem yang tidak memiliki/dev/fd/n
.bash
penemuan karena kata-kata dalam jawaban Anda dapat membuat orang percaya.sed
danawk
hanya satu. Tapitee
danwc
keduanya sangat kecil (jauh lebih kecil darised
danawk
).sed
danawk
. (Sayadd
d 100mb/dev/urandom
ke file dan kemudian menjalankan file itu melalui setiap metode beberapa kali)Salah satu opsi adalah menggunakan awk, yang dapat melakukan penghitungan dan mencetak ke stdout.
Dalam
awk
, NR adalah nomor baris saat ini. Anda dapat mencapai hal yang sama dengan perl:Atau
sed
:sumber
Anda dapat mengkloning stdout di stderr.
Dengan begitu,
program
stdout disalurkan ketee
ditulis ke stderr, yang dicetak pada konsol.tee
juga menulis data yang disalurkan ke stdout, yang disalurkan kewc
.sumber
opsi favorit saya:
sumber
sumber
Ini mungkin terlambat. Tapi saya hanya akan menjawab pertanyaan tindak lanjut Anda tentang cara untuk menangkap nomor yang dihitung dalam suatu variabel.
Ini yang kamu inginkan
YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)
.Kami mengambil keuntungan dari
tee
menghasilkan dua aliran di sini dan mengarahkan satu ke/dev/stderr
, yang akan muncul di layar Anda, dan yang lainnya kewc -l
, yang akan melaporkan jumlah baris.sumber