我正在尝试获取正在运行的服务列表。我运行了
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 .*] *
(右括号之前的所有内容,后跟任意数量的空格)被空字符串替换。