列出正在运行的服务

列出正在运行的服务

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

service --status-all

它将返回类似

 [ + ]  acpid
 [ ? ]  alsa-utils
 [ + ]  apache2
 [ + ]  atd
 [ + ]  avahi-daemon
 [ ? ]  binfmt-support
 [ + ]  bluetooth
 [ - ]  bootlogd
 [ - ]  bootlogs

我尝试 grep 并且它尝试处理特殊字符。

sudo service --status-all | grep '+'

我能做些什么来让它正常工作?

答案1

我尝试 grep 并且它尝试处理特殊字符。

基本正则表达式(BRE)启用(在没有开关-E-F或 时为默认设置-P),grep 将加号字符解释为文字+

问题是,只有以[ + ]或开头的行才会[ - ]被发送到标准输出,而以 开头的行将[ ? ]发送到标准错误。只有 STDOUT 通过管道传输到 grep;STDERR 直接打印在终端上。

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

service --status-all 2>&1 | grep '+'

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

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

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

请注意,使用 PCRE 时,必须用反斜杠转义加号和括号。

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

service --status-all 2>&1 | grep '+' | sed 's/.*] *//'

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

相关内容