Ý nghĩa của biểu tượng `|` trong vỏ là gì?


16

Không những gì |biểu tượng có ý nghĩa trong sudo ps -ef | grep processnamelệnh?

Ngoài ra bất cứ ai có thể xin vui lòng giải thích lệnh này? Tôi đã sử dụng lệnh này chỉ để nhận được PID và giết quá trình đó, nhưng tôi cũng đã thấy sudo ps -ef | grep processname | grep -v grepvà tôi có ấn tượng -v grepgiống như giết chết PID được tạo trước đó grep. Nếu đó là như thế nào nó hoạt động?


4
Bạn không cần sudophải chạy ps -ef. Ngoài ra, một mẹo phổ biến để tránh lệnh thứ ba là đặt một ký tự của tên tiến trình trong ngoặc vuông:ps -ef | grep [p]rocessname
kos

1
@kos Lệnh đó cần báo giá để hoạt động đáng tin cậy:ps -ef | grep '[p]rocessname'
kasperd

2
@kos Nếu bạn viết grep [p]rocessname, bạn đang bảo shell tìm tệp trong thư mục hiện tại bằng tên processnamevà thay thế mẫu bằng tên của tệp đó. Nếu không có tệp nào có tên processname, shell có thể chuyển mẫu theo nghĩa đen cho grep. Nhưng điều đó phụ thuộc vào cài đặt của bạn. Vì vậy, phiên bản của bạn sẽ phá vỡ nếu một file có tên processnametồn tại hoặc nếu bất kỳ tùy chọn vỏ sau đã được kích hoạt failglob, nullglob, nocaseglob.
kasperd

1
@kasperd Tôi đọc sai nhận xét cuối cùng của bạn, vâng, bạn đúng về mọi thứ. Tôi đã không xem xét điều đó.
kos

1
Tôi không thể tin rằng đây không phải là một bản sao.
Cột

Câu trả lời:


13
ps -ef | grep processname

Nó đầu tiên chạy sudo ps -efvà chuyển đầu ra cho lệnh thứ hai.

Lệnh thứ hai lọc tất cả các dòng có chứa từ "processname".

ps -ef | grep processname | grep -v grepliệt kê tất cả các dòng chứa processnamevà không chứa grep.

Dựa theo man grep

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

Dựa theo 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.

Bạn có thể kết hợp các tham số -efcó nghĩa tương tự như -e -f.

Thực tế ps -ef | grep processnameliệt kê tất cả các lần xuất hiện của quá trình được gọi processname.


cảm ơn đã giải thích, những gì ps -efkhông chính xác ??
Aamir

Tôi nghĩ rằng khi chúng tôi chạy | grep processNametrong thiết bị đầu cuối, chúng tôi cũng nhận được đầu ra của grep, chính nó là một quá trình vì vậy -v sẽ giết chết đầu ra này
Aamir

Bạn nói đúng.
Pilot6

35

Nó được gọi là pipe. Nó đưa ra đầu ra của lệnh đầu tiên làm đầu vào cho lệnh thứ hai.

Trong trường hợp của bạn, điều đó có nghĩa là:
Kết quả của sudo ps -efđược cung cấp làm đầu vào củagrep processname

sudo ps -ef:
Điều này liệt kê tất cả các quy trình đang chạy. Gõ man psvào termial để biết thêm.

grep processname
Vì vậy, danh sách các quy trình này được đưa vào grep mà chỉ tìm kiếm chương trình được xác định bởi programname.

Thí dụ

Nhập sudo ps -ef | grep firefoxvào thiết bị đầu cuối của tôi trả về:

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

ok, cái gì -v grep, nó làm gì
Aamir

giải thích tốt nhưng tôi cần một số trợ giúp về cách thức -v grep hoạt động ..
Aamir

Ồ, tôi thấy tại sao grep -vđược sử dụng. Để lọc ra dòng cuối cùng.
Pilot6

@Aamir Xem câu trả lời của tôi. grep -vlọc các dòng OUT chứa mẫu.
Pilot6

1
Bạn cũng có thể thêm rằng bạn có thể sử dụng nhiều đường ống. Ví dụ: tiếng vang "foobar" | grep foo | thanh grep
Michael

7

Tôi sẽ thử và trả lời điều này với một câu trả lời thực tế thẳng thắn:

Các đường ống |cho phép bạn làm những thứ tuyệt vời trong vỏ! Đó là một toán tử duy nhất mà tôi cho là hữu ích và hùng mạnh nhất.

Làm thế nào về việc đếm các tập tin trong một thư mục? đơn giản:

ls | wc -l..redirect đầu ra của lsđể wctham số wit -lcho đường dây

hoặc đếm các dòng trong một tập tin?

cat someFile | wc -l

Điều gì nếu tôi muốn tìm kiếm một cái gì đó? 'grep' có thể tìm kiếm sự xuất hiện của chuỗi:

cat someFile | grep aRandomStringYouWantToSearchFor

bạn chỉ cần chuyển hướng đầu ra của lệnh bên trái của ống sang lệnh bên phải của đường ống.

một cấp độ nữa: mức độ thường xuyên xảy ra trong một tệp?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

bạn có thể sử dụng | cho hầu hết mọi thứ :)

fortune | cowsay

nhập mô tả hình ảnh ở đây


2
Có, đường ống rất thú vị, +1, nhưng vui lòng thay đổi các ví dụ: UUOC .
kos

Giống như: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi

của nhưng với mục đích đơn giản ... người đặt câu hỏi dường như không sâu sắc hơn trong grep, ví dụ :)
Gewure

1
Thành thật mà nói rất nhiều ví dụ của bạn không cần đường ống. Bạn đã nghe nói về việc giải thể? Bạn đang sử dụng cat và pipe khi nhiều lệnh sẽ lấy các tệp làm tham số trực tiếp: ví dụ: cat someFile | grep aRandomStringYouWantToSearchFor nên là grep aRandomStringYouWantToSearchFor someFile
Captain Lepton

các bạn .. tôi biết. nếu bạn đọc các bình luận, Thuyền trưởng, bạn sẽ đọc phản hồi của tôi. Anh chàng hỏi những câu hỏi sẽ không hiểu ứng dụng THỰC SỰ của đường ống - anh ta thậm chí không biết grep là gì. Vì vậy, tôi sẽ cho anh ta ví dụ này? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') không, vì nó hoàn toàn không phục vụ mục đích.
Gewure

4

Tôi đã sử dụng lệnh này chỉ để nhận được PID và giết quá trình đó

Các câu trả lời khác đã trả lời câu hỏi chính của bạn rồi, nhưng tôi cũng muốn giải quyết vấn đề này;

Nói chung, giết một quá trình thường là quá mức cần thiết và để lại các tài nguyên được phân bổ bởi một quy trình xung quanh trong trạng thái lộn xộn, bạn thường có thể chấm dứt nó;

Bên cạnh đó, chỉ cần sử dụng pkillđể giết / chấm dứt một quá trình. pkillhỗ trợ chỉ định tên quy trình chính xác hoặc biểu thức chính quy:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo

1
Đừng sử dụng kill -9trừ khi bạn đặc biệt biết rằng sẽ không có tín hiệu nào khác hoạt động. Xem thêm iki.fi/era/unix/award.html#kill
tripleee 1/12

@tripleee OP tuyên bố họ muốn giết quá trình mặc dù.
kos

Đó là những gì kill. Chỉ định -9là một tùy chọn bổ sung và thường xuyên nhất thảm họa.
tripleee

@tripleee Tôi tin rằng sự nhầm lẫn đang phát sinh vì thuật ngữ; để tôi giết = SIGKILL, không phải SIGTERM.
kos

Đối với hầu hết mọi người, tôi sẽ mong đợi "giết" có nghĩa là killđơn giản và đơn giản. Bất kỳ thuật ngữ nào sang một bên, câu trả lời của bạn không nên khuyên mọi người sử dụng -9tùy chọn trừ khi bạn đặt một lời cảnh báo đầy thịt.
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.