Apa arti dari simbol `|` di shell?

16

Apa arti |simbol dalam sudo ps -ef | grep processnameperintah?

Adakah yang bisa menjelaskan perintah ini? Saya telah menggunakan perintah ini hanya untuk mendapatkan PID dan membunuh proses itu, tetapi saya juga melihat sudo ps -ef | grep processname | grep -v grepdan saya mendapat kesan bahwa -v grepseperti membunuh PID yang dihasilkan sebelumnya untuk grep. Jika begitu, bagaimana cara kerjanya?

Aamir
sumber
4
Anda tidak perlu sudolari ps -ef. Juga trik umum untuk menghindari perintah ketiga adalah melampirkan karakter nama proses 'dalam tanda kurung:ps -ef | grep [p]rocessname
kos
1
@kos Perintah itu membutuhkan penawaran agar dapat bekerja dengan andal:ps -ef | grep '[p]rocessname'
kasperd
2
@ kOS Jika Anda menulis grep [p]rocessname, Anda memberi tahu shell untuk mencari file di direktori saat ini dengan nama processnamedan mengganti pola dengan nama file itu. Jika tidak ada file bernama processnameada, shell dapat meneruskan pola secara harfiah untuk grep. Tetapi itu tergantung pada pengaturan Anda. Jadi versi Anda akan pecah jika sebuah file bernama processnameada atau jika salah satu opsi shell berikut telah diaktifkan failglob, nullglob, nocaseglob.
kasperd
1
@kasperd Saya salah membaca komentar terakhir Anda, ya, Anda benar tentang semuanya. Saya tidak mempertimbangkan itu.
kos
1
Saya tidak percaya ini bukan duplikat.
Tiang

Jawaban:

13
ps -ef | grep processname

Pertama kali menjalankan sudo ps -efdan meneruskan output ke perintah kedua.

Perintah kedua menyaring semua baris yang berisi kata "processname".

ps -ef | grep processname | grep -v grepdaftar semua baris yang mengandung processnamedan tidak mengandung grep.

Berdasarkan man grep

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Berdasarkan man ps

ps displays information about a selection of the active processes.

-e     Select all processes.  Identical to -A.

-f     Do full-format listing. This option can be combined with many
          other UNIX-style options to add additional columns.  It also
          causes the command arguments to be printed.  When used with -L,
          the NLWP (number of threads) and LWP (thread ID) columns will be
          added.  See the c option, the format keyword args, and the
          format keyword comm.

Anda dapat menggabungkan parameter yang -efberarti sama dengan -e -f.

Sebenarnya ps -ef | grep processnamedaftar semua kemunculan proses yang disebut processname.

Pilot6
sumber
terima kasih untuk penjelasannya, apa fungsinya ps -ef??
Aamir
saya pikir ketika kita jalankan | grep processNamedi terminal kita juga mendapatkan output dari grep yang itu sendiri adalah proses jadi -v membunuh output ini
Aamir
Anda benar.
Pilot6
35

Itu disebut pipe. Ini memberikan output dari perintah pertama sebagai input ke perintah kedua.

Dalam kasus Anda itu berarti:
Hasil sudo ps -efdiumpankan sebagai input darigrep processname

sudo ps -ef:
Ini mencantumkan semua proses yang berjalan. Ketikkan man pstermial untuk lebih banyak.

grep processname
Jadi, daftar proses ini dimasukkan ke grep yang hanya mencari program yang ditentukan oleh programname.

Contoh

Mengetikkan sudo ps -ef | grep firefoxterminal saya kembali:

parto     6501  3081 30 09:12 ?        01:52:11 /usr/lib/firefox/firefox
parto     8295  3081  4 15:14 ?        00:00:00 /usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s web/firefoxbookmarks.scope
parto     8360  8139  0 15:14 pts/24   00:00:00 grep --color=auto firefox
Parto
sumber
ok, apa -v grep, apa fungsinya.
Aamir
penjelasan yang baik tetapi saya butuh bantuan tentang bagaimana -v grep fungsinya ..
Aamir
Oh, saya mengerti mengapa grep -vdigunakan. Untuk menyaring baris terakhir.
Pilot6
@ Amir Lihat jawaban saya. grep -vmenyaring garis OUT yang mengandung pola.
Pilot6
1
Anda juga bisa menambahkan bahwa Anda dapat menggunakan banyak pipa. Misalnya gema "foobar" | grep foo | grep bar
Michael
7

Saya akan mencoba dan menjawab ini dengan jawaban praktis langsung:

Pipa |memungkinkan Anda melakukan hal-hal luar biasa di shell! Ini satu-satunya operator yang saya anggap paling berguna dan perkasa.

bagaimana kalau menghitung file dalam direktori? sederhana:

ls | wc -l..mengarahkan output lske wcparameter wit -luntuk baris

atau menghitung garis dalam file?

cat someFile | wc -l

bagaimana jika saya ingin mencari sesuatu? 'grep' dapat mencari kejadian string:

cat someFile | grep aRandomStringYouWantToSearchFor

Anda hanya mengarahkan output dari perintah kiri Pipa ke kanan perintah pipa.

satu tingkat lagi: seberapa sering sesuatu terjadi dalam suatu file?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

Anda dapat menggunakan | untuk hampir semuanya :)

fortune | cowsay

masukkan deskripsi gambar di sini

Perhiasan
sumber
2
Ya, pipa itu menyenangkan, +1, tapi tolong ubah contohnya: UUOC .
kos
Seperti: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi
ofc. tetapi untuk tujuan kesederhanaan ... pemilik pertanyaan tampaknya tidak lebih dalam grep, misalnya :)
Gewure
1
Terus terang banyak contoh Anda tidak perlu pipa. Pernahkah Anda mendengar tentang demoggifikasi? Anda menggunakan cat dan pipa ketika banyak perintah akan mengambil file sebagai parameter secara langsung: misalnya cat someFile | grep aRandomStringYouWantToSearchFor harus grep aRandomStringYouWantToSearchFor someile
Captain Lepton
teman-teman .. saya tahu. jika Anda membaca komentar, Kapten, Anda akan membaca tanggapan saya. Orang yang mengajukan pertanyaan tidak akan memahami aplikasi pipa NYATA - dia bahkan tidak tahu apa itu grep. jadi haruskah saya memberi dia contoh ini? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') tidak, karena itu tidak akan melayani tujuan sama sekali.
Gewure
4

Saya telah menggunakan perintah ini hanya untuk mendapatkan PID dan mematikan proses itu

Jawaban lain sudah menjawab pertanyaan utama Anda, tetapi saya juga ingin membahas ini;

Secara umum, membunuh suatu proses sering kali merupakan pembunuhan yang berlebihan dan meninggalkan sumber daya yang dialokasikan oleh suatu proses dalam keadaan berantakan, Anda seringkali dapat menghentikannya ;

Selain itu, gunakan saja pkilluntuk membunuh / menghentikan suatu proses. pkillmendukung menentukan nama proses yang tepat atau ekspresi reguler:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo
kos
sumber
1
Jangan gunakan kill -9kecuali Anda secara khusus tahu bahwa tidak ada sinyal lain yang akan berfungsi. Lihat juga iki.fi/era/unix/award.html#kill
tripleee
@tripleee OP menyatakan mereka ingin membunuh prosesnya.
kos
Itu yang killdilakukannya. Menentukan -9adalah opsi tambahan tambahan dan paling sering membawa malapetaka.
tripleee
@ tripleee Saya percaya kebingungan ini muncul karena terminologi; bagi saya bunuh = SIGKILL, bukan SIGTERM.
kos
Bagi kebanyakan orang, saya berharap "membunuh" berarti kill, sederhana dan sederhana. Di luar istilah apa pun, jawaban Anda seharusnya tidak menyarankan orang untuk menggunakan -9opsi kecuali Anda memasukkan peringatan gemuk.
tripleee