列出正在运行的服务

Woj*_*ech 2 services grep

我正在尝试获取正在运行的服务的列表。我跑了

service --status-all
Run Code Online (Sandbox Code Playgroud)

它会返回类似的东西

 [ + ]  acpid
 [ ? ]  alsa-utils
 [ + ]  apache2
 [ + ]  atd
 [ + ]  avahi-daemon
 [ ? ]  binfmt-support
 [ + ]  bluetooth
 [ - ]  bootlogd
 [ - ]  bootlogs
Run Code Online (Sandbox Code Playgroud)

我尝试 grep 并尝试使用特殊字符。

sudo service --status-all | grep '+'
Run Code Online (Sandbox Code Playgroud)

有什么我可以做的让它正常工作。

Den*_*nis 7

我尝试 grep 并尝试使用特殊字符。

基本的正则表达式(BRE)启用(在没有开关的默认-E-F-P),grep的解释加上字符作为文字+

问题是只有以[ + ]或开头的行[ - ]发送到STDOUT,而以开头的行[ ? ]发送到STDERR。只有 STDOUT 被管道传送到 grep;STDERR 直接打印在终端上。

要获得您期望的输出,请执行以下命令:

service --status-all 2>&1 | grep '+'
Run Code Online (Sandbox Code Playgroud)

2>&1 将 STDERR 发送到 STDOUT,因此 grep 能够对其进行过滤。

由于您仅打印以 开头的行 [ + ]  ,因此您不妨过滤掉该部分。为此,您可以使用-o开关仅打印匹配的输出,使用-P开关启用Perl 兼容正则表达式(PCRE) 和后视断言 ( (?<=...)):

service --status-all 2>&1 | grep -Po '(?<= \[\ \+ \]  ).*'
Run Code Online (Sandbox Code Playgroud)

请注意,对于 PCRE,您必须使用反斜杠对加号和方括号进行转义。

如果使用sed,则可以使用 BRE 实现相同的结果,无需后视,也不知道确切的空格数:

service --status-all 2>&1 | grep '+' | sed 's/.*] *//'
Run Code Online (Sandbox Code Playgroud)

在这里,BRE .*] *(右括号之前的所有内容,后跟任意数量的空格)被空字符串替换。