Mengapa grep tidak berfungsi dengan pengalihan?

15

Menggunakan topperintah dengan pengalihan berfungsi dengan baik:

top > top.log

Sekarang saya ingin menggunakan grep untuk memfilter baris tertentu:

top | grep "my_program" > top.log

Tetapi file log akan tetap kosong. Tetapi grep memberikan output saat menggunakan

top | grep "my_program"

Di mana my_programharus diganti oleh program yang sedang berjalan untuk melihat beberapa output.

Mengapa pendekatan saya tidak berhasil? Dan bagaimana cara memperbaikinya?


sumber
2
Saya baru saja mencobanya, dan itu berhasil untuk saya. Namun, Anda mungkin harus melihat -bopsi topatau menggunakan pssebagai gantinya.
Lev Levitsky
-btidak memecahkan masalah saya, tetapi memecahkan beberapa masalah penyandian. Terima kasih.

Jawaban:

22

Saya mendapatkan perilaku yang sama yang Anda gambarkan. Di Ubuntu 11.10

top | grep "my_program" > top.log

tidak menghasilkan output apa pun.

Saya percaya alasan untuk ini adalah bahwa grep sedang buffering outputnya. Untuk memberi tahu GNU grep untuk memuntahkan output baris demi baris, gunakan --line-bufferedopsi:

top | grep --line-buffered "my_program" > top.log

Lihat juga pertanyaan SO ini untuk solusi potensial lainnya.

unutbu
sumber
3
+1 --line-bufferedmemecahkan masalah.
Terima kasih, ini menyelesaikan masalah untuk saya juga. The -bpilihan adalah masih nasihat yang baik dari Lev Levitsky, juga. Itu memecahkan beberapa masalah pengodean dengan file log.
2

kamu harus menggunakan:

top -n 1 | grep "blah" > top.log

"-n 1" berjalan di atas untuk satu iterasi dan kemudian berhenti bukannya terus memperbarui setiap beberapa detik

karena Anda hanya mencari satu baris meskipun ps akan menjadi alat yang lebih baik untuk digunakan.

h3rrmiller
sumber
1

Solusi saya untuk masalah ini adalah:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

Dengan cara ini saya bisa memiliki monitor yang sedang berjalan di latar belakang untuk my_program dan menyimpan semua hasil di file top.log.

Alex Sed
sumber
0

Coba ini:

top | grep "my_program" 2>&1 > top.log

Apa artinya 2>&1?

Yamaneko
sumber
0

Meskipun keduanya bekerja untuk saya, saya pikir saran Lev Levitsky adalah yang benar. Gunakan -bargumennya.

Ada kemungkinan besar bahwa redirection output adalah masalahnya dan Anda tidak mendapatkan apa-apa melalui stdout, jadi coba ini sebagai gantinya:

top -b 2>&1 | grep "my_program" > top.log

Perhatikan bahwa Anda mungkin memiliki masalah dengan buffering output juga. Shell Anda tidak akan terus-menerus menulis ke file sehingga perlu waktu cukup lama untuk top.logdiisi.

Wolph
sumber