Ketika saya memeriksa daftar proses dan 'mengambil' yang menarik bagi saya, grep
itu sendiri juga termasuk dalam hasil. Misalnya, untuk mencantumkan terminal:
$ ps aux | grep terminal
user 2064 0.0 0.6 181452 26460 ? Sl Feb13 5:41 gnome-terminal --working-directory=..
user 2979 0.0 0.0 4192 796 pts/3 S+ 11:07 0:00 grep --color=auto terminal
Biasanya saya gunakan ps aux | grep something | grep -v grep
untuk menyingkirkan entri terakhir ... tetapi tidak elegan :)
Apakah Anda memiliki peretasan yang lebih elegan untuk menyelesaikan masalah ini (selain membungkus semua perintah ke dalam skrip terpisah, yang juga tidak buruk)
ps ux | awk '/name/ && !/awk/ {print $2}'
grep -v grep
bagian itu?grep -v grep
dikecualikangrep
dari hasil grep. Jika grep digunakan dalam kombinasi dengan ps, maka proses grep (dengan argumen grep) akan ditampilkan juga, mengacaukan hasil Anda. grep -v grep adalah cara umum untuk menghindarinyaJawaban:
Teknik yang biasa adalah ini:
Ini akan cocok dengan baris yang mengandung
terminal
, yangegrep '[t]erminal'
tidak! Ini juga berfungsi pada banyak rasa Unix.sumber
ps aux | grep '[r]oot'
. Adakah yang tahu mengapa?| grep '[t]erminal'
memilih baris yang berisi kata 'terminal' tanpa memasukkan kata 'terminal' ke dalam daftar proses. Apa yang ingin Anda capai| grep '[r]oot'
dan bagaimana cara kerjanya? Kemungkinan ada solusi yang lebih baik.grep '[t]erminal'
akan cocok dengan baris yang berisiterminal
. Output darips aux
akan memiliki garis dengangrep '[t]erminal'
(dengan tanda kurung siku), yang tidak mengandung stringterminal
(tanpa yang sama).Gunakan pgrep . Ini lebih bisa diandalkan.
sumber
pgrep
tidak akan bekerja jika saya mencari contoh untukps aux | grep 'ssh options'
pgrep -f
?pgrep
hanya cocok dengan pola terhadap nama proses. Untuk mencocokkan dengan seluruh perintah, gunakan-f
bendera.pgrep
hanya mengembalikan ID proses.pgrep -fl
(tetapi tidak bisa melihat cmdline penuh tanpa-f
mencocokkan cmdline penuh, detail: serverfault.com/a/619788/44183 ). Tapi ya jika Anda memerlukan info lain selain pid, cmdline, Anda perlups
. Dapat menggabungkan mereka:ps -p $(pgrep -f foo)
Jawaban ini dibangun berdasarkan
pgrep
jawaban sebelumnya . Itu juga dibangun di atas jawaban lain yang menggabungkan penggunaanps
denganpgrep
. Berikut adalah beberapa contoh pelatihan terkait:Di atas dapat digunakan sebagai fungsi :
Bandingkan dengan menggunakan
ps
dengangrep
. Baris tajuk yang bermanfaat tidak dicetak:sumber
-d
opsi untuk menentukan pemisah; mis.ps -fp$(pgrep -d , getty)
ps uxp `pgrep <process>`
Catatan yangp
harus menjadi parameter terakhir (yaitu,pux
tidak akan berfungsi)Anda dapat memfilter dalam perintah ps, mis
(atau cari melalui / proc dengan find dll)
sumber
ps -C <command>
akan cocok dengan perintah yang tepat. Ketika digunakan dengan opsia
ataux
itu akan melaporkan semua proses, karenaa
danx
daftar proses di samping serangkaian proses yang cocok dengan cara lain.logind
untuksystemd-logind
, atau untuk mencocokkan argumen.Satu lagi alternatif :
Di sini opsinya:
sumber
-C
Opsi sudah disarankan dalam jawaban @Andreas Frishe yang diposting lebih dari satu setengah tahun sebelumnya ...Menggunakan tanda kurung untuk mengelilingi karakter dalam pola pencarian tidak termasuk
grep
proses karena tidak mengandung regex yang cocok.sumber
Penafian: Saya pembuat alat ini, tapi ...
Saya akan menggunakan px :
Kecuali untuk menemukan proses dengan antarmuka baris perintah yang masuk akal itu juga melakukan banyak hal berguna lainnya, lebih detail di halaman proyek .
Bekerja di Linux dan OS X, mudah diinstal:
sumber
Tergantung pada kasus penggunaan utama, Anda sering ingin lebih memilih Awk.
Ini terutama benar ketika Anda memiliki sesuatu seperti
di mana jelas regex dapat diperhitungkan dalam skrip Awk sepele:
Tapi sungguh, jangan menemukan kembali ini sendiri.
pgrep
dan teman-teman telah ada sejak lama dan menangani seluruh ruang masalah ini jauh lebih baik daripada kebanyakan implementasi ad hoc.sumber
Pilihan lain adalah mengedit
.bash_profile
(atau file lain tempat Anda menyimpan alias bash) untuk membuat fungsi yang mengeluarkan 'grep' dari hasilnya.Itu
grep -v grep
harus menjadi yang pertama jika bukan Anda--color=auto
tidak akan berhasil karena suatu alasanIni berfungsi jika Anda menggunakan bash; jika Anda menggunakan shell YMMV yang berbeda.
sumber
function grep { command grep -v grep | command grep --color=auto "$@"; }
(perhatikan juga argumen dan kutipannya). Namun, ini rusak karena non-ps
doagrep
tidak lagi berfungsi (argumen dilewatkan secara tidak benar). Pokoknya, fungsi yang jauh lebih bermanfaat adalah yang memodifikasi regex agar tidak cocok dengan dirinya sendiri, daripada memfiltergrep
darigrep
hasil secara terpisah. Dan tentu saja, menemukan solusi baru untuk masalah yang telah dipecahkan secara memadai beberapa dekade yang lalu tidak terlalu produktif.