外壳中的`|`符号是什么意思?


16

|符号在sudo ps -ef | grep processname命令中是什么意思?

也有人可以解释这个命令吗?我仅使用此命令来获取PID并终止该进程,但是我也看到sudo ps -ef | grep processname | grep -v grep了,给人的印象-v grep就像杀死先前为生成的PID grep。如果是这样,它如何运作?


4
您不需要sudo跑步ps -ef。避免第三个命令的一个常见技巧是将进程名称的字符括在方括号中:ps -ef | grep [p]rocessname
kos 2015年

1
@kos该命令需要引号才能可靠运行:ps -ef | grep '[p]rocessname'
kasperd 2015年

2
@kos如果编写grep [p]rocessname,则告诉外壳程序在当前目录中查找名称为文件的文件,然后用该文件名processname替换模式。如果不processname存在名为的文件,则外壳程序可以将模式从字面上传递给grep。但这取决于您的设置。所以,你的版本将打破,如果一个文件名为processname存在,或者如果有下列shell选项已启用failglobnullglobnocaseglob
kasperd 2015年

1
@kasperd我看错了您的最后评论,是的,您对所有事情都是正确的。我没有考虑。
kos 2015年

1
我不敢相信这不是重复的。
2015年

Answers:


13
ps -ef | grep processname

它首先运行,sudo ps -ef然后将输出传递给第二个命令。

第二个命令过滤所有包含单词“ processname”的行。

ps -ef | grep processname | grep -v grep列出所有包含processname和不包含的行grep

根据 man grep

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

根据 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.

您可以组合参数的-ef方式与相同-e -f

实际ps -ef | grep processname列出该过程的所有出现processname


感谢您的解释,究竟是什么呢ps -ef
阿米尔(Aamir)2015年

我认为,当我们| grep processName在终端中运行时,我们还会得到grep的输出,而grep本身是一个进程,因此-v会杀死该输出
Aamir

你是对的。
飞行员

35

叫做pipe。它将第一个命令的输出作为第二个命令的输入。

在您的情况下,这意味着:
的结果sudo ps -ef将作为的输入grep processname

sudo ps -ef
这列出了所有正在运行的进程。键入man ps在termial更多。

grep processname
因此,此进程列表被馈送到grep中,后者仅搜索由定义的程序programname

sudo ps -ef | grep firefox在我的终端上键入返回:

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

好的,-v grep是什么,它做什么。
阿米尔2015年

很好的解释,但我需要一些有关-v grep 功能的帮助..
Aamir 2015年

哦,我知道为什么grep -v用了。过滤掉最后一行。
飞行员

@Aamir看到我的答案。grep -v过滤出包含图案的OUT线。
飞行员

1
您还可以添加可以使用多个管道的功能。例如echo“ foobar” | grep foo | grep bar
Michael

7

我将尝试用简单明了的答案回答这个问题:

该管道|可让您在外壳中做一些很棒的事情!这是我认为最有用和最强大的一个运算符。

如何计算目录中的文件?简单:

ls | wc -l..将输出重定向ls到行的wcwit参数-l

或计数文件中的行数?

cat someFile | wc -l

如果我想搜索什么?'grep'可以搜索字符串的出现:

cat someFile | grep aRandomStringYouWantToSearchFor

您只需将Pipe左侧的命令输出重定向到Pipe右侧的命令。

另一个层次:文件中多久发生一次?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

您可以使用| 对于几乎所有的东西:)

fortune | cowsay

在此处输入图片说明


2
是的,管道很有趣,+ 1,但是请更改示例:UUOC
kos 2015年

像:grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi 2015年

的。但是为了简单起见...问题
所有者

1
坦白说,您的许多示例都不需要管道。您听说过人口贬值吗?当许多命令将文件直接用作参数时,您将使用cat and pipe:例如cat someFile | grep aRandomStringYouWantToSearchFor应该是grep aRandomStringYouWantToSearchFor someFile
Lepton上尉,

伙计们..我知道。队长,如果您阅读评论,那么您将阅读我的回复。问这个问题的人不会理解管道的实际应用-他甚至不知道grep是什么。所以我给他这个例子吗? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') 不,因为它根本无法达到目的。
Gewure

4

我仅将此命令用于获取PID并终止该进程

其他答案已经回答了您的主要问题,但是我也想解决这个问题。

通常,杀死一个进程通常是一种过大的杀伤力,并且使一个进程分配的资源处于混乱状态,您通常可以终止它。

除此之外,仅用于pkill杀死/终止进程。pkill支持指定确切的进程名称或正则表达式:

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
kill -9除非您明确知道没有其他信号会起作用,否则不要使用。另请参见iki.fi/era/unix/award.html#kill
Tripleee

@tripleee OP表示,他们想杀死虽然过程。
kos 2015年

就是kill那样 指定-9是一个附加的选项,通常是灾难性的附加选项。
2015年

@tripleee我相信,由于术语的原因,会引起混乱;对我来说,kill = SIGKILL,而不是SIGTERM。
kos 2015年

对于大多数人来说,我希望“杀死”的意思是kill简单明了。除了任何术语,-9除非您提出了一些警告,否则您的答案不应建议人们使用该选项。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.