Ketika saya mencari beberapa proses yang tidak ada, mis
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Jelas saya tidak peduli tentang grep - itu masuk akal seperti mencari ps
proses!
Bagaimana saya mencegah grep muncul di hasil?
ps aux |grep
denganpgrep
(ataupgrep -f
).ps aux
, saya harapkan). Jadi pertanyaannya adalah bagaimana mencegahgrep fnord
muncul sebagai proses yang berjalan karena jelas saya tidak tertarik pada yang satu itu.Jawaban:
Ternyata ada solusi yang ditemukan di gantungan kunci .
Dengan meletakkan tanda kurung di sekitar huruf dan mengutip di sekitar string Anda mencari regex, yang mengatakan, "Temukan karakter 'f' diikuti oleh 'nord'."
Tetapi karena Anda memasukkan tanda kurung ke dalam pola 'f' sekarang diikuti oleh ']', jadi
grep
tidak akan muncul di daftar hasil. Neato!sumber
grep [f]nord
. Namun, garis itu tidak akan masuk melalui filter grep, karena string[f]nord
tidak cocok dengan ekspresi reguler[f]nord
.ps aux | grep fnord | grep -v grep
... yang tampaknya telah disarankan oleh beberapa orang ... lol[
genap di bash. Cobalah dengan file yang disebutfnord
di direktori saat ini.ps
mungkin merupakan trik lama, tetapi tidak dapat diandalkan. Gunakanpgrep
jika tersedia.fnord
dan program yang dipanggilsafnorde
. Atau ada pengguna yang dipanggilbfnord
, dan Anda akhirnya membunuh semua prosesnya. DllOpsi lain yang saya gunakan (terutama hanya untuk melihat apakah suatu proses sedang berjalan) adalah
pgrep
perintah. Ini akan mencari proses pencocokan, tetapi tidak mencantumkan baris grep untuk pencarian. Saya suka karena ini adalah cara pencarian yang cepat, tanpa regexing atau melarikan diri apa pun.sumber
-f
opsi menjadi lebih sepertips | grep
.pgrep -f
akan lebih miripps -f | grep
.-l
argumen untuk membuatnya menunjukkan perintah yang cocok.ps | grep '[f]nord'
pintar dan terhormat, tetapi pgrep benar .ps $(pgrep cmd) ...
jika `pgrep adalah opsi yang hilang (meskipun tidak akan berfungsi untuk set perintah kosong).Solusi ideal adalah yang dipresentasikan oleh BriGuy
Tetapi jika Anda tidak ingin melakukan itu, Anda bisa mengecualikan semua baris yang cocok dengan grep dengan:
sumber
pgrep
atau menemukan yang lain;)Bukan solusi yang paling elegan tetapi Anda bisa melakukan ini:
$ ps aux | grep fnord | grep -v grep
sumber
grep
dalam frasa Anda. Itu tidak akan menunjukkan proses itu. Sebagai contoh, misalkan file yang dipanggilfoo_grep_bar.txt
sedang diedit olehnano
perintah. Jadi ada proses yang berjalan:root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt
Menurut jawaban ini, ini tidak akan berhasil:$ ps aux | grep nano | grep -v grep
Karena ada kata grep di nama file Anda.grep fnord
bukan hanyagrep
yaitu$ ps aux | grep fnord | grep -v "grep fnord"
Di zsh
grep fnord =(ps aux)
,.Idenya adalah, pertama-tama jalankan
ps aux
, masukkan hasilnya dalam file, lalu gunakangrep
pada file itu. Hanya saja, kami tidak memiliki file, karena kami menggunakan "proses substitusi" zsh.Sebagai ilustrasi, cobalah
Hasilnya harus sama.
Komentar umum tentang beberapa jawaban lain. Beberapa jauh rumit dan / atau panjang untuk diketik. Ini bukan hanya masalah menjadi benar, itu harus dapat digunakan juga. Tetapi itu tidak berarti beberapa dari solusi itu buruk; hanya saja, mereka harus dibungkus dengan mini-UI untuk membuatnya dapat digunakan.
sumber
<(command)
.grep grep =(ps aux)
tidak menunjukkan garis apa pun.print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
sumber
| grep $(echo fnord)
cukup? Anda juga meminta sed untuk mencari dan mengganti masing-masing char di "fnord" dengan nilainya sendiri? ^^ selamat. Saya yakin saya bisa melakukan yang lebih lama lagi, tapi mungkin tidak akan selucu ^^ps aux | grep '[^]]fnord'
akan menghindari senam itu.Mencari proses
Jika Anda hanya mencari
fnord
proses, Anda dapat menggunakan-C
opsi untuk memilih dengan nama perintah:Ini dapat dicampur dengan opsi format gaya BSD dan POSIX sesuai keinginan Anda. Lihat halaman manual ps untuk daftar lengkap.
Mencari yang lain?
Jika Anda membutuhkan sesuatu yang lebih maju daripada pencarian yang tepat untuk nama perintah, jangan kehilangan harapan! Ini masih bisa dilakukan di
ps
sisi pipa. Yang harus kita lakukan adalah memberi tahups
untuk mengecualikangrep
proses dari hasil:-C grep
memilih semua proses grep, dan-N
meniadakan seleksi. Ini dapat digunakan untuk mencari argumen perintah, bagian dari nama perintah, atau ekspresi reguler yang lebih kompleks.sumber
ps
tetapi-C
tidak ditentukan oleh POSIX dan memiliki arti yang sama sekali berbeda pada BSDJawaban saya adalah variasi pada jawaban khas untuk mencari "foobar" di daftar 'ps'. Argumen "-A" "ps" lebih portabel daripada "aux", saya yakin, tetapi perubahan ini tidak relevan dengan jawabannya. Jawaban khasnya terlihat seperti ini:
Sebagai gantinya saya menggunakan pola ini:
Keuntungan utama adalah bahwa lebih mudah untuk menulis skrip berdasarkan pola ini karena Anda hanya menyatukan string statis "[^]]" dengan pola apa pun yang Anda cari. Anda tidak perlu melepas huruf pertama dari string kemudian memasukkannya di antara kawat kurawal dan kemudian menyatukannya kembali. Saat menulis skrip di shell, lebih mudah untuk hanya menempelkan "[^]]" di depan pola yang sedang Anda cari. Mengiris tali di Bash adalah hal yang jelek, jadi variasi saya menghindari itu. Variasi ini mengatakan perlihatkan garis-garis di mana polanya cocok TANPA tanda kurung siku kanan]. Karena pola pencarian untuk mengecualikan braket persegi sebenarnya menambahkan braket persegi ke pola maka tidak akan pernah cocok dengan dirinya sendiri.
Jadi Anda bisa menulis perintah 'psgrep' portabel sebagai berikut. Di sini, saya membuat beberapa perbedaan antara Linux, OS X BSD, dan lainnya. Ini menambahkan tajuk kolom dari 'ps', memberikan format 'ps' lebih khusus yang sesuai dengan kebutuhan saya, dan menampilkan proses daftar ekstra, ekstra lebar sehingga tidak ada argumen baris perintah terlewatkan. Yah, sebagian besar tidak ketinggalan. Java menjadi Java, sering kali melakukan hal-hal dengan cara yang paling buruk, sehingga Anda beberapa layanan java akan berjalan melewati argumen panjang maksimum yang dibolehkan bahwa tabel proses akan melacak. Saya percaya ini adalah 1024 karakter. Panjang perintah-tunggal yang diizinkan untuk memulai suatu proses jauh lebih lama, tetapi tabel proses kernel tidak repot-repot melacak apa pun yang panjangnya lebih dari 1K. Setelah perintah dimulai, nama-perintah dan daftar argumen tidak
sumber
Cara shell-agnostik yang paling sederhana untuk melakukan ini adalah menyimpannya dalam sebuah variabel terlebih dahulu:
Info: @ EmanuelBerg sejauh ini
grep fnord =(ps aux)
adalah jawaban yang paling elegan, meskipun haruszsh
. Saya sempat memilikinya di file rc saya, tetapi bash mengeluh tentang sintaks itu bahkan meskipun kondisional yang harus mencegah evaluasinya.Dari file rc saya, saya memiliki versi case-insensitive yang mengambil argumen grep:
Kode berjalan, satu peluru per baris kode:
ps
output verbose (dalamlocal
variabel sehingga hilang ketika fungsi kembali)$PS_OUTPUT
dan hapus semuanya setelah umpan baris pertama (regex equiv:)s/\n.*$//msg
. Ini mencegah kita dari mengambil judulps
output dengan segala sesuatu kecuali baris pertama (regex equiv:)s/^.*\n//m
dan ambil isinya dengan-i
case-insensitive dan dengan semua argumen yang menyerahkan fungsi ini (dalam kasus tidak ada argumen^
,, yang cocok dengan awal dari setiap baris yang cocok dengan segala sesuatu)sumber
Mungkin waktu untuk menggunakan urutan nyata saat ini. Penggunaan pipa membuatnya paralel.
Jelek karena akan ada file
f
, tetapi bukan salah saya bahwa tidak ada sintaks untuk proses sekuensial di mana Anda masih ingin menggunakan output dari proses yang sebelumnya dijalankan.Saran untuk sintaksis operator sekuensial:
sumber
ps
output terlebih dahulu sebelum sayagrep
, saya menggunakan lebih banyak memori (atau disk) lebih lama.Perintah pgrep, seperti yang telah dinyatakan orang lain, akan mengembalikan PID (ID proses) proses berdasarkan nama dan atribut lainnya. Sebagai contoh,
akan memberi Anda PID, dibatasi oleh koma (,) dari semua proses yang namanya cocok dijalankan oleh pengguna
<username>
. Anda dapat menggunakan sakelar -x sebelum hanya mengembalikan kecocokan persis.Jika Anda ingin mendapatkan informasi lebih lanjut tentang proses ini (seperti menjalankan opsi aux dari ps menyiratkan), Anda dapat menggunakan opsi -p dengan ps, yang cocok berdasarkan PID. Jadi, misalnya,
akan memberikan informasi terperinci dari semua PID yang cocok dengan perintah pgrep.
sumber
ps
gagal jikapgrep
mengembalikan set kosong. Saya punya jawaban yang dibangun di atas milik Anda dan mencoba mengatasi masalah ini.Berikut adalah contoh sederhana untuk menemukan PID
ssh-agent
untuk nama pengguna tanpa menunjukkan PIDgrep
proses itu sendiri:Jika Anda ingin misalnya membunuh
ssh-agent
untuk pengguna saat ini, Anda dapat menggunakan perintah berikut:Untuk membuat alias yang berguna tambahkan ke file ~ / .bashrc atau ~ / .zshrc Anda dengan kode berikut:
Dan menggunakan alias di sini adalah contoh untuk memaksa semua orang belajar ekspresi reguler:
PS Saya hanya menguji perintah ini di Ubuntu dan Gentoo.
sumber
"${USER}.* /usr/bin/ssh-agent"
. Ini berhasil karena Anda berkata[ ]
; yaitu, Anda hanya menggunakan mekanisme jawaban yang diterima. Anda mungkin juga adilgrep "[s]sh-agent"
.Inilah versi lanjutan dari
grep -v grep
solusi, memfilter semuagrep
proses yang belum berjalan lebih dari satu detik, yang merupakan peningkatan dari "hanya buang semua kejadiangrep
".masing-masing
Ini mungkin tidak portabel, dan tergantung pada format output aktual lokal Anda
ps
perintah .Anda mungkin ingin menggabungkan ini dengan
grep
output berwarna untuk kenyamanan:sumber
Menggunakan opsi -x (pencocokan persis) bekerja untuk saya. Saya menggabungkannya dengan -f (baris perintah penuh), sehingga saya bisa mencocokkan proses saya dengan:
sumber
Anda dapat melakukannya dengan mudah, hanya dengan mendefinisikan ALIAS di
.bashrc
seperti ini:sumber
grep
penggunaan dalam kasus lain. Cobaecho I love grep | grep love
.