GNU/Linux >> Belajar Linux >  >> Linux

perhatikan output dari perintah sampai string tertentu diamati dan kemudian keluar

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 perintah
  • grep -m 1 keluar saat string ditemukan
  • watch -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:

  1. 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.
  2. { ... ;} - 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)
  3. | - pipa stdout sisi kiri ke stdin sisi kanan
  4. grep -m1 "find_me" - temukan string target
  5. && kill -9 $(cat pid) - matikan paksa (SIGKILL) tail proses setelah grep keluar setelah menemukan string yang cocok
  6. && rm pid - hapus file yang kami buat

Linux
  1. Cara menangkap sesi terminal dan output dengan perintah skrip Linux

  2. Gunakan Perintah Grep Dan Cari?

  3. Linux – Berhenti Menonton Keluaran Program Tertentu Setelah Menggunakan Perintah Tonton?

  1. Bagaimana cara menangkap output dari perintah teratas dalam file di linux?

  2. Ubah output menjadi string

  3. Simpan keluaran tanggal dan perintah tonton ke file

  1. Output Ke Stdout Dan Pada Saat Yang Sama Grep Ke File?

  2. Menentukan prosesor tertentu di mana proses sedang berjalan

  3. Berhenti melihat output dari program tertentu setelah menggunakan perintah watch?