Gunakan lingkaran:
until my_cmd | grep -m 1 "String Im Looking For"; do : ; done
Alih-alih :
, Anda dapat menggunakan sleep 1
(atau 0,2) untuk memudahkan CPU.
Loop berjalan sampai grep menemukan string dalam output perintah. -m 1
berarti "satu kecocokan sudah cukup", yaitu grep berhenti mencari setelah menemukan kecocokan pertama.
Anda juga dapat menggunakan grep -q
yang juga berhenti setelah menemukan kecocokan pertama, tetapi tanpa mencetak baris yang cocok.
watch -e "! my_cmd | grep -m 1 \"String Im Looking For\""
!
meniadakan kode keluar dari saluran perintahgrep -m 1
keluar saat string ditemukanwatch -e
kembali jika ada kesalahan yang terjadi
Tapi ini bisa diperbaiki untuk benar-benar menampilkan garis yang cocok, yang dibuang sejauh ini.
Bagi mereka yang memiliki program yang terus-menerus menulis ke stdout, yang perlu Anda lakukan hanyalah mem-pipe-nya ke grep dengan opsi 'single match'. Setelah grep menemukan string yang cocok, itu akan keluar, yang menutup stdout pada proses yang disalurkan ke grep. Acara ini harus secara alami menyebabkan program keluar dengan anggun selama proses menulis lagi .
Apa yang akan terjadi adalah proses akan menerima SIGPIPE ketika mencoba menulis ke closed stdout setelah grep keluar. Berikut adalah contoh dengan ping, yang jika tidak akan berjalan tanpa batas waktu:
$ ping superuser.com | grep -m 1 "icmp_seq"
Perintah ini akan mencocokkan 'pong' pertama yang berhasil, dan kemudian keluar pada waktu berikutnya ping
mencoba menulis ke stdout.
Namun,
Tidak selalu dijamin bahwa proses akan menulis ke stdout lagi dan oleh karena itu mungkin tidak menyebabkan SIGPIPE dimunculkan (mis., Ini dapat terjadi saat membuntuti file log). Solusi terbaik yang berhasil saya dapatkan untuk skenario ini melibatkan penulisan ke file; beri komentar jika menurut Anda dapat ditingkatkan:
$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }
Merinci ini:
tail -f log_file & echo $! > pid
- membuntuti file, melampirkan proses ke latar belakang, dan menyimpan PID ($!
) ke file. Saya mencoba mengekspor PID ke variabel, tetapi tampaknya ada kondisi balapan antara saat ini dan saat PID digunakan lagi.{ ... ;}
- kelompokkan perintah-perintah ini bersama-sama sehingga kita dapat mem-pipe output ke grep sambil mempertahankan konteks saat ini (membantu saat menyimpan dan menggunakan kembali variabel, tetapi tidak dapat membuat bagian tersebut berfungsi)|
- pipa stdout sisi kiri ke stdin sisi kanangrep -m1 "find_me"
- temukan string target&& kill -9 $(cat pid)
- matikan paksa (SIGKILL)tail
proses setelahgrep
keluar setelah menemukan string yang cocok&& rm pid
- hapus file yang kami buat