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?

bash  grep 

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.


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.


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.



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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.