Thanh lịch hơn nữa ps ps | grep -v grep


177

Khi tôi kiểm tra danh sách các quy trình và 'grep' ra những quy trình thú vị đối với tôi, grepchính nó cũng được bao gồm trong kết quả. Ví dụ: để liệt kê các thiết bị đầu cuối:

$ 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

Thông thường tôi sử dụng ps aux | grep something | grep -v grepđể thoát khỏi mục cuối cùng ... nhưng nó không thanh lịch :)

Bạn có cách hack nào thanh lịch hơn để giải quyết vấn đề này không (ngoài việc gói tất cả các lệnh thành một tập lệnh riêng biệt, điều này cũng không tệ)


4
Đối với những gì nó có giá trị, đây là một Câu hỏi thường gặp cổ xưa. Xem mục 3.10 tại faqs.org/faqs/unix-faq/faq/part3
tripleee

1
Cảm ơn đã tham khảo. Đó là phương pháp của họ:ps ux | awk '/name/ && !/awk/ {print $2}'
Jakub M.

Là những gì grep -v grepmột phần đang làm gì?
Jwan622

2
@ Jwan622 grep -v greploại trừ grepkhỏi kết quả grep. Nếu grep được sử dụng kết hợp với ps, thì quá trình grep (với các đối số grep) cũng sẽ được hiển thị, làm lộn xộn kết quả của bạn. grep -v grep là một cách phổ biến để tránh điều đó
Eugene Platonov

Câu trả lời:


282

Kỹ thuật thông thường là thế này:

ps aux | egrep '[t]erminal'

Điều này sẽ phù hợp với dòng chứa terminal, mà egrep '[t]erminal'không! Nó cũng hoạt động trên nhiều hương vị của Unix.


1
Điều này làm việc cho tôi cho một chuỗi tùy ý, nhưng không phải cho một tên người dùng, ví dụ ps aux | grep '[r]oot'. Có ai biết tại sao không?
kxsong

2
@kxsong: | grep '[t]erminal'chọn bất kỳ dòng nào có chứa từ 'terminal' mà không đưa từ 'terminal' vào danh sách quy trình. Bạn đang cố gắng đạt được điều gì | grep '[r]oot'và làm thế nào nó không hoạt động? Có khả năng là một giải pháp tốt hơn.
Johnsyweb

3
Sửa lỗi cho tôi nếu tôi sai, nhưng điều này cũng sẽ hoạt động trên bất kỳ vị trí nào của nhân vật được grepping: ps aux | grep "te [r] minal"
meso_2600

2
hack tuyệt vời (tôi nghĩ tôi nên gọi nó là như vậy, vì các tác giả phụ trợ / grep có lẽ đã không nghĩ đến kịch bản này.)
Michael Trouw

2
@JamieJag: Chà ... như tôi đã nói trong bài viết của mình, grep '[t]erminal'sẽ khớp với các dòng có chứa terminal. Đầu ra từ ps auxsẽ có một dòng với grep '[t]erminal'(với dấu ngoặc vuông), không chứa chuỗi terminal(không có cùng).
Johnsyweb

57

Sử dụng pgrep . Nó đáng tin cậy hơn.


pgrepsẽ không hoạt động nếu tôi tìm ví dụ chops aux | grep 'ssh options'
Jakub M.

12
Jakub M.: Thế còn pgrep -f?
hillu

4
@ jakub-m Theo mặc định pgrepchỉ phù hợp với mẫu so với tên quy trình. Để khớp với toàn bộ lệnh, sử dụng -fcờ.
bluecollarcoder

3
pgrepchỉ trả về ID quá trình.
Melab

1
các phiên bản cũ hơn đã sử dụng pgrep -fl(nhưng không thể thấy cmdline đầy đủ mà không -fkhớp với cmdline đầy đủ, chi tiết: serverfault.com/a/619788/44183 ). Nhưng có nếu bạn cần bất kỳ thông tin nào khác bên cạnh pid, cmdline, bạn cần ps. Có thể kết hợp chúng:ps -p $(pgrep -f foo)
Beni Cherniavsky-Paskin

29

Câu trả lời này được xây dựng dựa trên pgrep câu trả lời trước . Nó cũng dựa trên câu trả lời khác kết hợp việc sử dụng psvới pgrep. Dưới đây là một số ví dụ đào tạo thích hợp:

$ pgrep -lf sshd
1902 sshd

$ pgrep -f sshd
1902

$ ps up $(pgrep -f sshd)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

$ ps up $(pgrep -f sshddd)
error: list of process IDs must follow p
[stderr output truncated]

$ ps up $(pgrep -f sshddd) 2>&-
[no output]

Trên đây có thể được sử dụng như là một chức năng :

$ psgrep() { ps up $(pgrep -f $@) 2>&-; }

$ psgrep sshd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

So sánh với việc sử dụng psvới grep. Hàng tiêu đề hữu ích không được in:

$  ps aux | grep [s]shd
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

Xem github.com/blueyed/oh-my-zsh/blob/ khăn (nhưng nó đặc trưng cho Zsh).
xanh

@blueyed, tôi đã cập nhật câu trả lời với định nghĩa hàm bash.
Acumenus

Cũng lưu ý -dtùy chọn để chỉ định một dấu phân cách; ví dụps -fp$(pgrep -d , getty)
Toby Speight

1
Tôi sử dụng điều này: ps uxp `pgrep <process>` Lưu ý rằng pphải là tham số cuối cùng (nghĩa là puxsẽ không hoạt động)
KFL

9

Bạn có thể lọc trong lệnh ps, vd

ps u -C gnome-terminal

(hoặc tìm kiếm thông qua / Proc với tìm, v.v.)


1
Lưu ý rằng điều này hoạt động với ps (Linux) của GNU, nhưng không hoạt động với ps BSD.
Josh

Điều này không đúng ngay cả với GNU ps. ps -C <command>sẽ khớp lệnh chính xác. Khi được sử dụng với ahoặc xtùy chọn, nó sẽ báo cáo tất cả các quy trình, bởi vì axliệt kê các quy trình bên cạnh tập hợp các quy trình được khớp bởi các phương tiện khác.
Thuyết hoạt hình

@Animism Đúng. Cảm ơn, tôi đã sửa nó.
Andreas Frische

Điều này chỉ hoạt động nếu tên quá trình được chỉ định chính xác. Nó không làm việc cho một trận đấu một phần, ví dụ như logindcho systemd-logind, hoặc để phù hợp với lập luận.
Acumenus

4

Một thay thế nữa :

ps -fC terminal

Đây là các tùy chọn:

 -f        does 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.

 -C cmdlist     Select by command name.
                This selects the processes whose executable name is
                given in cmdlist.

6
Một nhược điểm nhỏ, và một điều không thực sự liên quan đến câu hỏi của OP, là điều này sẽ không cho bạn thấy những thứ như Tomcat, mà thực sự được chạy dưới dạng java với một danh sách các đối số giặt ủi.
Charles Wood

-Ctùy chọn đã được đề xuất trong câu trả lời của @Andreas Frishe được đăng hơn một năm rưỡi trước đó
Piotr Dobrogost

3

Sử dụng dấu ngoặc để bao quanh một ký tự trong mẫu tìm kiếm sẽ loại trừ grepquy trình do nó không chứa biểu thức chính phù hợp.

$ ps ax | grep 'syslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18108 s001  S+     0:00.00 grep syslogd

$ ps ax | grep '[s]yslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd

$ ps ax | grep '[s]yslogd|grep'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18144 s001  S+     0:00.00 grep [s]yslogd|grep

3

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của công cụ này, nhưng ...

Tôi muốn sử dụng px :

~ $ px atom
  PID COMMAND          USERNAME   CPU RAM COMMANDLINE
14321 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16575 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16573 Atom Helper      walles    0.5s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=gpu-process --cha
16569 Atom             walles   2.84s  1% /Users/walles/Downloads/Atom.app/Contents/MacOS/Atom --executed-from=/Users/walles/src/goworkspace/src/github.com/github
16591 Atom Helper      walles   7.96s  2% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=renderer --no-san

Ngoại trừ việc tìm các quy trình với giao diện dòng lệnh hợp lý, nó còn thực hiện rất nhiều điều hữu ích khác, chi tiết hơn trên trang dự án .

Hoạt động trên Linux và OS X, dễ dàng cài đặt:

curl -Ls https://github.com/walles/px/raw/python/install.sh | bash

0

Tùy thuộc vào trường hợp sử dụng cuối cùng, bạn thường muốn thích Awk hơn.

ps aux | awk '/[t]erminal/'

Điều này đặc biệt đúng khi bạn có một cái gì đó như

ps aux | grep '[t]erminal' | awk '{print $1}'  # useless use of grep!

trong đó rõ ràng regex có thể được đưa vào kịch bản Awk một cách tầm thường:

ps aux | awk '/[t]erminal/ { print $1 }'

Nhưng thực sự, đừng tự sáng tạo lại điều này. pgrepvà bạn bè đã tồn tại trong một thời gian dài và xử lý toàn bộ không gian vấn đề này tốt hơn nhiều so với hầu hết các lần thực hiện lại.


-2

Một tùy chọn khác là chỉnh sửa .bash_profile(hoặc tệp khác mà bạn giữ bí danh bash) để tạo một hàm greps 'grep' ra khỏi kết quả.

function mygrep {
grep -v grep | grep --color=auto $1
}

alias grep='mygrep'

Điều grep -v grepnày phải là đầu tiên nếu không bạn --color=autosẽ không làm việc vì một số lý do.

Điều này hoạt động nếu bạn đang sử dụng bash; nếu bạn đang sử dụng YMMV shell khác.


1
Bí danh chức năng là gì? Chỉ cần làm function grep { command grep -v grep | command grep --color=auto "$@"; }(cũng lưu ý sửa lỗi của đối số và trích dẫn). Tuy nhiên, điều này bị phá vỡ ở chỗ mọi sự không psgọi ra grepsẽ không còn hoạt động (các đối số được truyền không chính xác). Dù sao, một chức năng hữu ích hơn nhiều sẽ là một chức năng sửa đổi biểu thức chính quy để làm cho nó không khớp với chính nó, thay vì lọc ra grepkhỏi các grepkết quả một cách riêng biệt. Và tất nhiên, phát minh ra các giải pháp mới cho một vấn đề đã được giải quyết thỏa đáng từ nhiều thập kỷ trước không mang lại hiệu quả cao.
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.